Подтвердить что ты не робот

ExecuteNonQuery() возвращает -1 при выполнении хранимой процедуры

Я пытаюсь выполнить хранимую процедуру в Visual Studio. Он приведен ниже.

CREATE PROCEDURE [dbo].[addStudent] 
    @stuName varchar(50), 
    @address varchar(100),
    @tel varchar(15),
    @etel varchar(15),
    @nic varchar (10),
    @dob date


AS 
BEGIN   
    SET NOCOUNT ON;

    DECLARE @currentID INT
    DECLARE @existPerson INT
    SET @existPerson = (SELECT p_ID FROM Student WHERE s_NIC = @nic);
    IF @existPerson = null
        BEGIN
            INSERT INTO Person (p_Name, p_RegDate, p_Address, p_Tel, p_EmergeNo, p_Valid, p_Userlevel)
            VALUES (@stuName,  GETDATE(), @address, @tel, @etel, 0, 'Student' );
            SET @currentID = (SELECT MAX( p_ID) FROM Person); 
            INSERT INTO Student (p_ID, s_Barcode, s_DOB, s_NIC) VALUES (@currentID , NULL, @dob, @nic);
            return 0;
        END
    ELSE
        return -1;
END 

Я делаю это, используя этот код ниже.

        SqlConnection con = new SqlConnection();
        Connect conn = new Connect();
        con = conn.getConnected();
        con.Open();
        cmd = new SqlCommand("addStudent", con);
        cmd.CommandType = CommandType.StoredProcedure;
                cmd.Parameters.Add("@stuName", SqlDbType.VarChar).Value = nameTxt.Text.ToString();
                cmd.Parameters.Add("@address", SqlDbType.VarChar).Value = addressTxt.Text.ToString();
                cmd.Parameters.Add("@tel", SqlDbType.VarChar).Value = telTxt.Text.ToString();
                cmd.Parameters.Add("@etel", SqlDbType.VarChar).Value = emerTxt.Text.ToString();
                cmd.Parameters.Add("@nic", SqlDbType.VarChar).Value = nicTxt.Text.ToString();
                cmd.Parameters.Add("@dob", SqlDbType.DateTime).Value = dobTime.Value.ToString("MM-dd-yyyy");

                    int n = cmd.ExecuteNonQuery();
                    MessageBox.Show(n.ToString());

Но он возвращает мне -1. Я попробовал эту хранимую процедуру, введя те же значения, которые я взял из отладки. Это было успешно. Какая может быть возможная ошибка? Большое спасибо!

4b9b3361

Ответ 1

Не используйте = null, используйте is null

IF @existPerson is null

Когда вы сравниваете что-либо = null, результат всегда является ложным (если у вас нет set ansi_nulls off, которого вы не должны, поскольку такой вариант устарел)

Еще лучше, вы можете использовать

IF NOT EXISTS (SELECT p_ID FROM Student WHERE s_NIC = @nic)

Кроме того, вы должны использовать SCOPE_IDENTITY() вместо SET @currentID = (SELECT MAX( p_ID) FROM Person);

SET @currentID = SCOPE_IDENTITY()

Наконец, вам также нужно добавить параметр для сбора возвращаемого значения

   SqlParameter retValue = cmd.Parameters.Add("return", SqlDbType.Int);
   retValue.Direction = ParameterDirection.ReturnValue;

затем

MessageBox.Show(retValue.Value);

Ответ 2

Посмотрим на документацию для ExecuteNonQuery:

Для операторов UPDATE, INSERT и DELETE возвращаемое значение - это количество строк, на которые влияет команда.... Для всех других типов операторов возвращаемое значение равно -1.

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


Если вы хотите определить значение, которое было передано оператору return в хранимой процедуре, вам нужно добавить еще один параметр в команду и установить его Direction в ReturnValue (имя, которое вы передаете этому параметру, будет проигнорировано)

Ответ 3

Чтобы устранить эту проблему, просто удалите "SET NOCOUNT ON" или измените ее на "SET NOCOUNT OFF". и все работает нормально!