繁体   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