簡體   English   中英

存儲過程始終返回0

[英]Stored Procedure always returning 0

我正在嘗試從存儲過程中獲取返回值,但它始終返回0。

C#代碼

cmd = new SqlCommand();
    cmd.CommandType = CommandType.StoredProcedure;
    cmd.CommandText = "AbsentEntry";
    cmd.Parameters.Add("@EmpID", SqlDbType.VarChar).Value = ViewState["empID"].ToString();
    cmd.Parameters.Add("@AttendanceDate", SqlDbType.Date).Value = date.ToString("yyyy-MM-dd");
    cmd.Connection = conn;
    conn.Open();
    cmd.ExecuteNonQuery();
    SqlParameter returnParameter = cmd.Parameters.Add("@returnval", SqlDbType.Int);
    returnParameter.Direction = ParameterDirection.ReturnValue;
    cmd.ExecuteNonQuery();

    int result = (int)cmd.Parameters["@returnval"].Value;
    return result;

SP

    ALTER PROCEDURE [dbo].[AbsentEntry] 
@EmpID varchar(10), 
@AttendanceDate Date 

AS BEGIN
declare @returnval     int 
IF (SELECT COUNT(*) FROM tblEmpAttendance WHERE EmpID = @EmpID AND AttendanceDate=@AttendanceDate) = 0
    BEGIN
        insert into tblEmpAttendance (EmpID, AttendanceDate, IsInOut, SessionCount, IsPresent) values ( @EmpID,@AttendanceDate,'OUT',0,'A')
        set @returnval=1
    return @returnval
     END
ELSE
    BEGIN
       set @returnval=0 
    return @returnval
    END
END

在所有情況下,它都返回0。 我不知道問題所在。

這是因為您正在使用executenonquery。

您應該使用executescalar返回單個值。

我嘗試了類似您的代碼,並且可以按預期工作。
但是,您的代碼中兩次調用ExecuteNonQuery。

首次調用時,將按預期插入記錄,然后添加返回值的參數並再次執行命令。 但是現在記錄已存在,並且存儲過程始終落在else塊中,因此始終返回零。

cmd = new SqlCommand();
cmd.CommandType = CommandType.StoredProcedure;
cmd.CommandText = "AbsentEntry";
cmd.Parameters.Add("@EmpID", SqlDbType.VarChar).Value = ViewState["empID"].ToString();
cmd.Parameters.Add("@AttendanceDate", SqlDbType.Date).Value = date.ToString("yyyy-MM-dd");
SqlParameter returnParameter = cmd.Parameters.Add("@returnval", SqlDbType.Int);
returnParameter.Direction = ParameterDirection.ReturnValue;
cmd.Connection = conn;
conn.Open();
cmd.ExecuteNonQuery();
int result = (int)cmd.Parameters["@returnval"].Value;
return result;

您的存儲過程中沒有out參數,並且您正在使用ExecuteNonQuery -基本上,在客戶端,您不會在任何地方給出reurn值。 用C#術語來說,就好像您調用了一個函數,但沒有將它作為賦值的一部分。 X =的getX(); vs getX();

您可以通過更改存儲過程以使其具有輸出參數來解決此問題

ALTER PROCEDURE [dbo].[AbsentEntry] 
    @EmpID varchar(10), 
    @AttendanceDate Date,
    @returnval     int OUTPUT

AS BEGIN

    IF (SELECT COUNT(*) FROM tblEmpAttendance 
        WHERE EmpID = @EmpID AND AttendanceDate=@AttendanceDate) = 0
    BEGIN
        insert into tblEmpAttendance (EmpID, AttendanceDate, IsInOut,
        SessionCount, IsPresent) values ( @EmpID,@AttendanceDate,'OUT',0,'A')
        set @returnval=1
    END
ELSE
    BEGIN
       set @returnval=0 
    END
END

或者,更簡單地說,通過使用ExecuteScalar並將結果分配給變量。

int result = (int) cmd.ExecuteScalar()

如果count在您的選擇查詢中,則應使用executescaler .. like

int result=convert.toint32(cmd.executescalar());

要么

int result = (Int32)cmd.ExecuteScalar();

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM