#c# #sql #stored-procedures #azure-sql-database #output-parameter
#c# #sql #хранимые процедуры #azure-sql-database #output-параметр
Вопрос:
Я вызываю обобщенный метод на 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.Параметры в отладчике, он правильно отображает все три параметра, их имена, размеры, типы и т.д.
Итак, что я делаю не так? Почему он до сих пор не видит этот @table
параметр?
Комментарии:
1. Вы
null
где-нибудь проходите?2. Где указано имя
@table
параметра в C #?3. Это действительно плохой способ создания параметров. Если вы хотите, чтобы эта вещь получила список параметров, просто передайте IDbParameterCollection с вашими параметрами, определенными в вызывающем. Вы пропустили параметр в вызывающем.
4. mjwills: Я не был, просто общий param0, param1 и т.д. Я добавил имена, и теперь это работает … вроде как. Я не получаю сообщение об ошибке, но я также не получаю правильный вывод, просто «~ n», который выглядит как последний бит того, что он должен возвращать. Пол: То, что вы видите, было результатом перепробования всего, что я мог придумать. Я вернусь к IDdParameterCollection.
5. Ладно, я виноват. Я не устанавливал «Значение» SqlParameter во всех своих попытках попробовать разные вещи. Итак, в конце концов, это были комментарии mjwills по поводу указания параметра @table. Как мне указать, что это был его ответ?
Ответ №1:
Действительно спасибо за комментарий и руководство @mjwills. Из сообщения об ошибке параметр @table
не был указан.
Вы последовали его предложению и обнаружили, что вы не установили «Значение» SqlParameter во всех моих попытках попробовать разные вещи.
Мы рады слышать, что проблема решена. Я помогаю опубликовать это как ответ, и это может быть полезно для других членов сообщества.