我正在尝试在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。我通过输入从调试中捕获的相同值来尝试此存储过程。它很成功。什么可能是错误? 非常感谢!
答案 0 :(得分:15)
请勿使用= 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);
答案 1 :(得分:12)
让我们看一下ExecuteNonQuery
的文档:
对于UPDATE,INSERT和DELETE语句,返回值是受命令影响的行数。 ... 对于所有其他类型的语句,返回值为-1。
您正在调用一个存储过程,该存储过程本身并不是返回行计数的3个列出的语句。
如果要确定传递给存储过程中return
语句的值,则需要向该命令添加另一个参数,并将其Direction
属性设置为{{3} (将忽略您为此参数指定的名称)
答案 2 :(得分:7)
要解决此问题,只需删除“SET NOCOUNT ON”或将其更改为“SET NOCOUNT OFF”。一切正常!