在SQL中注册用于调用存储过程的输出参数
本文关键字:存储过程 输出 参数 调用 用于 SQL 注册 | 更新日期: 2023-09-27 17:57:40
我有这个存储过程:
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中执行这个过程,它返回了正确的值,但当我在调试模式下执行项目时,它显示了错误:
String[0]:Size属性的大小0无效。
空值?你能帮我吗,非常感谢!
假设e_ID
是integer
,则只需执行SELECT
和ExecuteScalar
即可返回单个值:
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/Finaly块的using块来关闭连接。
您需要为参数指定.Size。存储过程指定varchar(10)的输出,因此应该设置param。尺寸=10;
您需要指定该cmd。CommandType=CommandType.StoredProcedure,默认CommandType为CommandType.Text
做出这些改变,你的方法就会按照你的意图工作。