0

我有一个存储过程

UPDATE tblTime
SET TimeOut = DATEADD(HOUR,8,TimeIn)
WHERE tId =
( 
   SELECT MAX(tId)
   FROM tblTime
   WHERE UserId = 3571
)

尽管确实没有问题,但在这种情况下,如果它确实在此查询中成功

导致即使该字段为空或有值,在这种情况下它也会成功

但我确实需要它用于将来的其他查询......而且,在这种情况下,我希望 C# 代码不仅报告它正在请求执行查询——这意味着它确实发生了,

但要从 sql server 获得实际答案作为 c# 可以使用或变成的返回值Boolean

4

1 回答 1

0

我已经设法对此做了一些事情,所以我可以在 sql server 存储过程中指定一个条件

然后声明一个OUTPUT变量(PARAMETER)

如果满足条件,则将其值设置为 1,如果不满足,则设置为 -1

然后在c#中设置一个函数,在这个例子中输出参数命名如下ERROR

   public static int UpdateTblViaStoredPRoc(string SPname, int UserID)
        {
            int message = 0;
            using (SqlConnection con = new SqlConnection("server=(local);Initial Catalog=****DBNAME HERE***;Integrated Security=True"))
            {

                con.Open();

                SqlCommand cmd = new SqlCommand(SPname, con);

                cmd.CommandType = CommandType.StoredProcedure;

                cmd.Parameters.AddWithValue("@Uid", UserID);

                cmd.Parameters.Add("@ERROR", SqlDbType.Int);

                cmd.Parameters["@ERROR"].Direction = ParameterDirection.Output;

                cmd.ExecuteNonQuery();

                 message =(int) cmd.Parameters["@ERROR"].Value;

                con.Close();
            }
            return message;
        }

然后存储过程总是遵循相同的模式

声明ERROR 参数,设置条件以相应地输出错误:

ALTER PROCEDURE [dbo].[nameofProc]
@UId Int, @ERROR int OUT
AS

BEGIN    

SET NOCOUNT ON;

DECLARE @TimeOtVal varchar(50)
set @TimeOtVal = (SELECT CASE WHEN [TimeOut] IS NULL THEN '' ELSE CONVERT(NVARCHAR,[TimeOut]) END FROM tblTime WHERE tId = ( SELECT MAX(tId) FROM tblTime WHERE UserId = @UId))

IF (@TimeOtVal = '') -- condition for the update 

BEGIN -- now action is taken if condition is met

    SET NOCOUNT ON;
    UPDATE tblTime  SET TimeOut = DATEADD(HOUR,8,TimeIn) WHERE tId = ( SELECT MAX(tId) FROM tblTime WHERE UserId = @UId)        
         SET  @ERROR = 1
END
 else

     BEGIN -- Other wise , if condition isnot met 

         SET  @ERROR = -1

     END

END

因此,只有在条件允许时它才会执行您想要的操作,然后报告操作,以便您可以在后面的程序代码中处理它。

于 2012-10-23T11:24:28.460 回答