Исключение Sql: «Ошибка преобразования типа данных bigint в nvarchar». при возврате значения из хранимой процедуры - PullRequest
0 голосов
/ 10 мая 2019

У меня есть простое приложение, которое сохраняет данные пользователя и генерирует идентификатор, и на основании этого идентификатора их данные об образовании сохраняются в таблицу.

Это хранимая процедура:

CREATE PROCEDURE SAVE_USER_DETAILS 
    @tablePersonalDetails Resume_Personal_Details READONLY, 
    @tableEducation Resume_Education READONLY, 
    @returnValue BIGINT OUTPUT 
AS 
BEGIN 
    SET NOCOUNT ON; 
    DECLARE @HeaderID BIGINT; 

    BEGIN TRANSACTION Tran_Resume 

        INSERT INTO YCTC_CV_USER_PERSONAL_DETAIL (CV_USER_NAME, CV_USER_FATHER_NAME, CV_USER_DOB, 
                                                  CV_USER_MARITAL_STATUS, 
                                                  CV_USER_PERMANENT_ADDRESS, CV_USER_PRESENT_ADDRESS, 
                                                  CV_USER_CONTACT, CV_USER_EMAIL, CV_USER_GENDER) 
           SELECT  
               user_name, father_name, user_dob,
               marital_status,
               permanent_address, present_address, 
               user_contact, user_email, user_gender 
           FROM  
               @tablePersonalDetails 

        SET @HeaderID = (SELECT SCOPE_IDENTITY()); 

        INSERT INTO YCTC_CV_USER_EDUCATION (CV_USER_ID, QUALIFICATION, INSTITUTION, BOARD_UNIVERSITY, PYEAR,RESULT)
            SELECT 
                @HeaderID, qualification, institution, board_university, pyear, result 
            FROM 
                @tableEducation;

    COMMIT TRANSACTION Tran_Resume 

    SET @returnValue = @HeaderID

    SELECT @returnValue; 
    RETURN(0) ; 
END

Ниже указан пользовательский тип таблицы:

CREATE TYPE Resume_Personal_Details AS TABLE
(
    [user_name] [VARCHAR](50) NOT NULL,
    [father_name] [VARCHAR](50) NOT NULL,
    [user_dob] [DATE] NOT NULL,
    [marital_status] [TINYINT] NULL,
    [permanent_address] [VARCHAR](100) NOT NULL,
    [present_address] [VARCHAR](100) NOT NULL,
    [user_contact] [VARCHAR](20) NOT NULL,
    [user_email] [VARCHAR](50) NOT NULL,
    [user_gender] [TINYINT] NULL,
    [Job_obj] [VARCHAR](MAX) NOT NULL
)

CREATE TYPE Resume_Education AS TABLE
(
    [qualification] [VARCHAR](100) NOT NULL,
    [institution] [VARCHAR](100) NOT NULL,
    [board_university] [VARCHAR](100) NOT NULL,
    [pyear] [VARCHAR](4) NOT NULL,
    [result] [VARCHAR](10) NOT NULL
)

А ниже код C # (отправка всех строк вих пользовательская таблица и отправка идентификатора в код C #)

ReturnMessage _returnMessage = new ReturnMessage(); 
// Above class has 2 variables : bool ReturnStatus; string Message ;

try 
{
    string DateOfBirth = data.UserDOB.ToString().Replace("/", "-");    
           //.Substring(6, 4) + "-" + data.UserDOB.ToString().Substring(3, 2) + "-" + data.UserDOB.ToString().Substring(0, 2);

    DataTable dt = new DataTable();

    // Add columns  
    dt.Columns.Add(new DataColumn("user_name", typeof(string)));
    dt.Columns.Add(new DataColumn("father_name", typeof(string)));
    dt.Columns.Add(new DataColumn("user_dob", typeof(DateTime)));
    dt.Columns.Add(new DataColumn("marital_status", typeof(int)));
    dt.Columns.Add(new DataColumn("permanent_address", typeof(string)));
    dt.Columns.Add(new DataColumn("present_address", typeof(string)));
    dt.Columns.Add(new DataColumn("user_contact", typeof(string)));
    dt.Columns.Add(new DataColumn("user_email", typeof(string)));
    dt.Columns.Add(new DataColumn("user_gender", typeof(int)));
    dt.Columns.Add(new DataColumn("Job_obj", typeof(string)));

    // Add rows  
    dt.Rows.Add(data.UserName, data.FatherName, DateOfBirth, data.MaritalStatus,
                data.UserPermanentAddress, data.UserPresentAddress,
                data.Contact, data.UserEmail, data.Gender, data.User_Job_Objective);

    DataTable EducationDataTable = new DataTable();
    EducationDataTable.Columns.Add(new DataColumn("qualification", typeof(string)));
    EducationDataTable.Columns.Add(new DataColumn("institution", typeof(string)));
    EducationDataTable.Columns.Add(new DataColumn("board_university", typeof(string)));
    EducationDataTable.Columns.Add(new DataColumn("pyear", typeof(string)));
    EducationDataTable.Columns.Add(new DataColumn("result", typeof(string)));

    foreach(EducationDetails _educationalDetails in data.EducationDetails) 
    {
        EducationDataTable.Rows.Add(_educationalDetails.Qualification,
                                    _educationalDetails.Institution,
                                    _educationalDetails.University,
                                    _educationalDetails.Year,
                                    _educationalDetails.Result);
    }

    long ReturnValue = 0;

    DBHelper.Parameters[] colParameters = new DBHelper.Parameters[3] {
              new DBHelper.Parameters("@tablePersonalDetails", dt),
              new DBHelper.Parameters("@tableEducation", EducationDataTable),
              new DBHelper.Parameters("@returnValue", "", ParameterDirection.Output),
    };

    int RetCount = objHelper.gExecuteNonQuery(CommandType.StoredProcedure, "SAVE_USER_DETAILS", colParameters);
    intHeaderID = Convert.ToInt64(objHelper.oCommand.Parameters["@returnValue"].Value);

    _returnMessage.Message = Convert.ToString(intHeaderID);
} 
catch (Exception ex) 
{
    _returnMessage.Message = "Fail";
}

Когда вызывается ExecuteNonQuery(), генерируется исключение, но все данные вставляются успешно.

Ошибка преобразования типа данных bigint в nvarchar

Из всех моих испытаний я уверен, что проблема заключается в хранимой процедуре, но что, это то, что я не получаю.

Еслилюбая другая информация требуется, сообщите, я предоставлю.

Ответы [ 2 ]

0 голосов
/ 11 мая 2019

Ошибка была в параметре, который я отправлял в процесс, раньше я делал

DBHelper.Parameters[] colParameters = new DBHelper.Parameters[1] {
                new DBHelper.Parameters("@returnValue","",ParameterDirection.Output),
            };
objHelper.gExecuteNonQuery(CommandType.StoredProcedure, "SAVE_USER_DETAILS", colParameters);

Метод Parameters принимает string Name, object Value, ParameterDirection Direction, поэтому при попадании в gExecuteNonQuery () ожидаемое значение было int (т.е. 0), вместо этого я отправлял строку (""), которая создавала исключение

'Error converting data type bigint to nvarchar '

так что когда я сделал код ниже

DBHelper.Parameters[] colParameters = new DBHelper.Parameters[1] {
                new DBHelper.Parameters("@returnValue",0,ParameterDirection.Output),
            };
objHelper.gExecuteNonQuery(CommandType.StoredProcedure, "SAVE_USER_DETAILS", colParameters);

Устранена ошибка.

0 голосов
/ 10 мая 2019

Если данные успешно вставлены, возникает ошибка при возврате параметра из процедуры.Проверьте размер выходного параметра.Быстрое демо

create proc test (@retval bigint out)
as
    set @retval = 123;
go

declare @res nvarchar(2);
exec test @res out;

Сообщение 8114, уровень 16, состояние 2, тест процедуры, строка 4 Ошибка преобразования типа данных bigint в nvarchar.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...