C#使用输出变量调用存储过程时出错,未提供参数
C# getting error calling stored procedure with an output variable, parameter not supplied
我在 C# 中调用一个通用方法,该方法 returns 来自 Azure SQL 存储过程的字符串,带有输出变量。错误是:
Procedure or function 'TableScriptGenerate' expects parameter '@table', which was not supplied
我将参数作为列表传递 我的代码如下所示:
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
参数?
非常感谢@mjwills 的评论和指导。从错误消息来看,未提供参数 @table
。
你听从了他的建议,发现你没有设置 SqlParameter 的“值”,因为我一直在尝试不同的东西。
我们很高兴得知问题已解决。我帮助 post 将此作为答案,这可能对其他社区成员有益。
我在 C# 中调用一个通用方法,该方法 returns 来自 Azure SQL 存储过程的字符串,带有输出变量。错误是:
Procedure or function 'TableScriptGenerate' expects parameter '@table', which was not supplied
我将参数作为列表传递 我的代码如下所示:
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
参数?
非常感谢@mjwills 的评论和指导。从错误消息来看,未提供参数 @table
。
你听从了他的建议,发现你没有设置 SqlParameter 的“值”,因为我一直在尝试不同的东西。
我们很高兴得知问题已解决。我帮助 post 将此作为答案,这可能对其他社区成员有益。