Ошибка - хранимая процедура не имеет параметров, а аргументы указаны в c# - PullRequest
0 голосов
/ 25 мая 2020

Когда я пытаюсь вызвать процедуру хранилища и вернуть значение из процедуры, я получаю сообщение об ошибке - procedure has no parameters and arguments were supplied

Ниже приведен код c#:

using (SqlCommand command2 = new SqlCommand("getservername8", conn1))
{
    command2.CommandType = CommandType.StoredProcedure;
    command2.Parameters.Add("@s", SqlDbType.NVarChar, 500);
    command2.Parameters["@s"].Direction = ParameterDirection.Output;
    command2.ExecuteNonQuery();
    string server = (string)command2.Parameters["@s"].Value;
}

Ниже приведена хранимая процедура:

GO
ALTER procedure [dbo].[getservername9]
@s varchar(50)
as begin
declare @server_name varchar(500)
select  @server_name = short_description from [Event_alerts].[dbo].[event_alerts]
select @s= SUBSTRING(@server_name, CHARINDEX('-', @server_name) + 15, 50)
return @s
end

Сохраненная процедура выполняется без ошибок. Любая помощь будет принята с благодарностью

Ответы [ 3 ]

1 голос
/ 25 мая 2020

Внесите следующие изменения в свой код -

  1. Отметьте свою переменную в хранимой процедуре как output, как показано ниже -

     @s varchar(50) output
    
  2. Вы не можете возвращать выходные значения varchar, как вы добавили в хранимую процедуру. При использовании оператора return here хранимые процедуры всегда возвращают целочисленные значения. В вашем случае при выполнении вы получите ошибку ниже - (то же самое можно наблюдать и в. NET end).

    declare @s varchar(50)         
    exec [dbo].[getservername9] @s
    

Ошибка преобразования при преобразовании значение varchar '' в тип данных int.

Remove the return statement из хранимой процедуры, которая автоматически вернет значение обратно в. NET код.

Наконец, сделайте сохраненные имена процедур согласован в обоих. NET и SQL процедурах.

1 голос
/ 25 мая 2020

Используйте ExecuteScalar вместо Executenonquery. См. ..

https://docs.microsoft.com/en-us/dotnet/api/system.data.sqlclient.sqlcommand.executescalar?view=dotnet-plat-ext-3.1

0 голосов
/ 25 мая 2020

Во-первых, нужно изменить имя вашей процедуры хранилища, в коде, который вы используете getservername8 , в то время как имя вашей хранимой процедуры - getservername9 , во второй точке вам нужно отметить свой параметр как выходной как показано в коде ниже

Код:

using (SqlCommand command2 = new SqlCommand("getservername", conn1))
{
   command2.CommandType = CommandType.StoredProcedure;
   command2.Parameters.Add("@s", SqlDbType.NVarChar, 500);
   command2.Parameters["@s"].Direction = ParameterDirection.Output;
   command2.ExecuteNonQuery();
   string server = (string)command2.Parameters["@s"].Value;
}

Сохраненная процедура:

GO
ALTER procedure [dbo].[getservername]
@s varchar(50) output
as begin
declare @server_name varchar(500)
select  @server_name = short_description from [Event_alerts].[dbo].[event_alerts]
select @s= SUBSTRING(@server_name, CHARINDEX('-', @server_name) + 15, 50)
return @s
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...