C#使用输出变量调用存储过程时出错,未提供参数
Posted
技术标签:
【中文标题】C#使用输出变量调用存储过程时出错,未提供参数【英文标题】:C# getting error calling stored procedure with an output variable, parameter not supplied 【发布时间】:2021-03-15 11:24:57 【问题描述】:我在 C# 中调用一个通用方法,该方法从带有输出变量的 Azure SQL 存储过程返回一个字符串。错误是:
过程或函数“TableScriptGenerate”需要参数“@table”,但未提供该参数
我将参数作为列表传递我的代码如下所示:
static public string ReadSpData(string cnxn, string storedProcedure,List<string> paramName,List<string> paramValue, List<string> paramType, List<int> paramSize, List<string> paramDir)
string rtn = "";
int i = 0;
try
List<SqlParameter> sqlParam = new List<SqlParameter>();
DbProviderFactory dbf = DbProviderFactories.GetFactory("System.Data.SqlClient");
DbConnection dbcn = dbf.CreateConnection();
dbcn.ConnectionString = cnxn;
dbcn.Open();
DbCommand dbcmd = dbcn.CreateCommand();
for (i = 0; i < paramValue.Count; i++)
SqlDbType sdt = SqlDbType.NVarChar;
switch (paramType[i])
case "varchar":
sdt = SqlDbType.VarChar;
break;
case "char":
sdt = SqlDbType.Char;
break;
case "int":
sdt = SqlDbType.Int;
break;
sqlParam.Add(new SqlParameter(paramName[i], sdt, paramSize[i]));
sqlParam[sqlParam.Count - 1].ParameterValue = paramValue[i]; //edited
switch (paramDir[i].ToLower())
case "input":
sqlParam[sqlParam.Count - 1].Direction = ParameterDirection.Input;
break;
case "output":
sqlParam[sqlParam.Count - 1].Direction = ParameterDirection.Output;
break;
case "return":
sqlParam[sqlParam.Count - 1].Direction = ParameterDirection.ReturnValue;
break;
dbcmd.Parameters.Add(sqlParam[sqlParam.Count - 1]);
dbcmd.CommandType = CommandType.StoredProcedure;
dbcmd.CommandText = storedProcedure;
dbcmd.ExecuteNonQuery();
rtn = dbcmd.Parameters["@table_definition"].ToString(); //edited
storedProcedure = TableScriptGenerate
paramValue = 'path_person', 1, @tab
paramType = nvarchar, char, nvarchar
paramSize = 4000,1,4000
paramDir = input, input, output
被调用的存储过程如下所示:
ALTER PROCEDURE [dbo].[TableScriptGenerate]
(@table nvarchar(4000) = NULL,
@isExternal char = NULL,
@table_definition nvarchar(4000) = NULL OUTPUT)
AS
BEGIN
...
SET @table_definition = CONCAT(@preTbl, @sql, @post, '~/n')
END
我添加了输入参数的初始化,读到它们可能有帮助,但没有。当我在调试器中查看 dbcmd.Parameters 时,它会正确显示所有三个参数、它们的名称、大小、类型等。
那么,我做错了什么?为什么还是看不到@table
参数?
【问题讨论】:
你在任何地方传递null
吗?
C#中@table
参数名在哪里指定?
这是一个非常糟糕的创建参数的方法。如果你希望这个东西接收参数列表,只需传入一个 IDbParameterCollection 并在调用者中定义你的参数。你错过了调用者中的一个参数。
mjwills:我不是,只是通用的 param0、param1 等。我添加了名称,现在它可以工作了……有点。我没有收到错误,但我也没有得到正确的输出,只是“~\n”,它看起来像是它应该返回的最后一点。保罗:你看到的是尝试了我能想到的一切的结果。我会回到 IDdParameterCollection。
好吧,我的错。在我尝试不同的事情时,我并没有设置 SqlParameter 的“值”。因此,它的长短是关于指定 @table 参数的 mjwills 的 cmets。我如何指定他的答案是?
【参考方案1】:
非常感谢@mjwills 的评论和指导。从错误消息来看,没有提供参数@table
。
你听从了他的建议,发现你没有在我所有的尝试不同的事情上设置 SqlParameter 的“值”。
我们很高兴听到问题已解决。我帮助将其发布为答案,这可能对其他社区成员有益。
【讨论】:
以上是关于C#使用输出变量调用存储过程时出错,未提供参数的主要内容,如果未能解决你的问题,请参考以下文章