gpt4 book ai didi

c# - ExecuteNonQuery() 执行存储过程时返回-1

转载 作者:可可西里 更新时间:2023-11-01 08:31:54 26 4
gpt4 key购买 nike

我正在尝试在 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。我通过输入从调试中捕获的相同值来尝试这个存储过程。它是成功的。可能的错误是什么?非常感谢!

最佳答案

不要使用= 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);

关于c# - ExecuteNonQuery() 执行存储过程时返回-1,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12932471/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com