簡體   English   中英

注冊輸出參數以在SQL中調用存儲過程

[英]Register output parameter for calling stored procedure in SQL

我有這個存儲過程:

create procedure sp_findMaxEmployee
    @maxID as varchar(10) OUTPUT
as
    SET @maxID = (SELECT MAX(e_ID) FROM Employee)
go

我嘗試注冊這樣的輸出參數:

public string generateID()
{
            connection = new SqlConnection(connectionStr);
            cmd = new SqlCommand("sp_findMaxEmployee", connection);
            SqlParameter param = new SqlParameter();
            param.ParameterName = "@maxID";
            param.Direction = ParameterDirection.Output;
            param.SqlDbType = SqlDbType.VarChar;
            cmd.Parameters.Add(param);

            connection.Open();
            cmd.ExecuteNonQuery();
            connection.Close();
            return cmd.Parameters["@maxID"].Value.ToString();
}

我試圖在SQL中執行此過程,並且返回正確的值,但是當我在調試模式下執行項目時,它顯示了錯誤:

字符串[0]:Size屬性的大小無效為0。

空值? 您能幫我嗎,非常感謝!

假設e_ID是一個integer ,則只需執行SELECTExecuteScalar即可返回單個值:

create procedure sp_findMaxEmployee
as
SELECT MAX(e_ID) FROM Employee
go

然后在代碼中,如下所示:

public string generateID()
{
    connection = new SqlConnection(connectionStr);
    cmd = new SqlCommand("sp_findMaxEmployee", connection);

    connection.Open();
    var maxId = cmd.ExecuteScalar();
    connection.Close();
    return maxId.ToString();
}

最后,關於為什么返回最后一個ID可能存在一個更深的問題,希望它不是獲得下一個可用的ID,您應該讓SQL通過自動遞增來代表您這樣做。

SP的小調整

該Tweak不是必需的,但這種方式看起來更好:)並且還請避免在存儲過程中使用sp_前綴。 使用usp_代替。

create procedure usp_findMaxEmployee
@maxID as varchar(10) OUTPUT  
AS
BEGIN
  SET NOCOUNT ON;
SELECT @maxID =  MAX(e_ID) FROM Employee;
END

從代碼調用

public string generateID()
{
    SqlConnection conn = new SqlConnection(connectionStr);
    SqlCommand cmd = new SqlCommand("usp_findMaxEmployee", conn);
    cmd.CommandType = CommandType.StoredProcedure;

    // set up the parameters
    cmd.Parameters.Add("@maxID", SqlDbType.VarChar, 10).Direction = ParameterDirection.Output;

    // open connection and execute stored procedure
    conn.Open();
    cmd.ExecuteNonQuery();

    // read output value from @maxID
    String maxID = Convert.ToString(cmd.Parameters["@maxID"].Value);
    conn.Close();
    return maxID;
}

注意

如果出現任何問題,請使用Try / Catch / Finnaly塊的using塊關閉連接。

您需要為參數指定.Size。 您的存儲過程指定了varchar(10)的輸出,因此應設置param.Size = 10;。

您需要指定cmd.CommandType = CommandType.StoredProcedure,默認CommandType為CommandType.Text

進行這些更改,您的方法將按預期工作。

暫無
暫無

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

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