【发布时间】:2021-12-29 12:32:57
【问题描述】:
我的数据库中有一个存储过程:
ALTER PROCEDURE [dbo].[SP_UPDATE_PARAMS]
(@ELEMENT NUMERIC (10),
@NUM_PARAM_OP_DINT NUMERIC (3,0) OUTPUT,
@NUM_PARAM_OP_REAL NUMERIC (3,0) OUTPUT,
@NUM_PARAM_LL NUMERIC (3,0) OUTPUT,
.... + other 500 output params
该过程根据@Element 的值为每个值生成一个输出。否则返回值 0。
所以,在我的 C# 代码中,我尝试使用它:
....
using (SqlConnection connection = new SqlConnection(connectString))
{
connection.Open();
using (SqlCommand cmd = new SqlCommand("[dbo].[SP_UPDATE_PARAMS]", connection))
{
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.AddWithValue("@ELEMENT", SqlDbType.Int).Value = element;
SqlDataReader rdr = cmd.ExecuteReader();
.....
但我收到此错误:
存储过程或函数 [dbo].[SP_UPDATE_PARAMS] 需要 @NUM_PARAM_OP_DINT 未提供的参数
如果我没有为[dbo].[SP_UPDATE_PARAMS] 的 504 个值中的每一个提供值(即使它们是输出),就会发生这种情况
我尝试过使用
foreach (IDataParameter param in cmd.Parameters)
{
param.Value = DBNull.Value;
}
和
foreach (SqlParameter parameter in cmd.Parameters)
{
parameter.Value = DBNull.Value;
}
打电话之前
SqlDataReader rdr = cmd.ExecuteReader();
但它们都不行,因为cmd.Parameters 在(我猜)cmd.ExecuteReader() 被执行之前为空。
我怎样才能避免必须为所有参数提供一个值,或者让它们都为空?
【问题讨论】:
-
输出并不意味着参数是由存储过程为您创建的。您仍然需要创建它们,然后存储过程可以设置每个参数中的值,以便您在执行命令后检索
-
旁注:您应该不为您的存储过程使用
sp_前缀。微软有reserved that prefix for its own use (see Naming Stored Procedures),你确实会在未来某个时候冒着名称冲突的风险。 It's also bad for your stored procedure performance。最好只是简单地避免sp_并使用其他东西作为前缀 - 或者根本不使用前缀! -
500 个输出参数是真正的代码异味。它们不能被合并,或者您应该使用
SELECT返回一个常规结果集?另请注意,如果您为参数创建默认值但不传递它们,SqlCommand将不会返回它们
标签: c# .net sql-server sqlcommand