SQL Server存储过程(如果存在)

时间:2014-06-06 03:53:06

标签: c# sql sql-server stored-procedures

理想情况下,我试图让存储过程返回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();
            }
        }
    }

问题是我收到错误

  

对象引用未设置为对象的实例

在调用代码的返回行上。

非常感谢任何帮助

2 个答案:

答案 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;
   }
}