【发布时间】: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。我如何指定他的答案是?
标签: c# sql stored-procedures azure-sql-database output-parameter