理想情况下,我试图让存储过程返回1(如果存在),否则返回0。
这是存储过程:
CREATE PROCEDURE [dbo].[spCheckForExistingTimecard]
@userId int,
@paYPeriodId int,
@exists bit = 0 OUTPUT
AS
BEGIN
IF EXISTS (SELECT COUNT (t.TimeCardId)
FROM TimeCard AS t
WHERE t.PayPeriodId = @payPeriodId
AND t.UserId = @userId )
RETURN 1
ELSE
RETURN 0
以下是调用存储过程的代码:
public static int CheckForExistingTimecard(int userId, int payPeriodId)
{
using (SqlConnection connection = new SqlConnection(dbMaintenanceConnectionString))
{
connection.Open();
using (SqlCommand sqlCommand = new SqlCommand("spCheckForExistingTimecard", connection))
{
sqlCommand.CommandType = CommandType.StoredProcedure;
sqlCommand.Parameters.AddWithValue("@userId", userId);
sqlCommand.Parameters.AddWithValue("@payPeriodId", payPeriodId);
return (int)sqlCommand.ExecuteScalar();
}
}
}
问题是我收到错误
对象引用未设置为对象的实例
在调用代码的返回行上。
非常感谢任何帮助
答案 0 :(得分:1)
正如在officeil网站上记录的那样
结果集中第一行的第一列,或null 如果结果集为空,则为引用(在Visual Basic中为Nothing)。 最多返回2033个字符。
如果查询没有返回任何记录,则ExecuteScalar返回null
所以这一行:
return(int)sqlCommand.ExecuteScalar();
抛出错误
因为在这种情况下它试图将null转换为int。这会引发NullReferenceException。
你需要检查null:
object o = sqlCommand.ExecuteScalar();
item = o == null ? 0 : (int)o;
答案 1 :(得分:1)
RETURN
的值可由SqlParameter
.Direction = ParameterDirection.ReturnValue
处理。 .ExecuteScalar()
将捕获的值是存储过程中SELECT
返回的单行单列。
public static int CheckForExistingTimecard(int userId, int payPeriodId)
{
using (SqlConnection connection = new SqlConnection(dbMaintenanceConnectionString))
using (SqlCommand sqlCommand = new SqlCommand("spCheckForExistingTimecard", connection))
{
sqlCommand.CommandType = CommandType.StoredProcedure;
sqlCommand.Parameters.AddWithValue("@userId", userId);
sqlCommand.Parameters.AddWithValue("@payPeriodId", payPeriodId);
-- define your parameter for the RETURN value
sqlCommand.Parameters.Add("@ReturnValue").Direction = ParameterDirection.ReturnValue;
connection.Open();
sqlCommand.ExecuteNonQuery();
-- read the value returned
int returnValue = (int)sqlCommand.Parameters["@ReturnValue"];
connection.Close();
return returnValue;
}
}