У меня есть база данных NewYekAye на SQL Server с некоторыми таблицами и хранимыми процедурами. Одна из таблиц — TbSoore, а одна из хранимых процедур — spGetSoore.
Я создал spGetSoore с помощью этого кода:
USE [NewYekAye]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE Procedure [dbo].[spGetSoore]
@IdSoore INT
AS
BEGIN
SELECT
IdSoore, NameSoore,
MakiMadani, TextMoghadame, TextHadis, TextMohtava, TextMoarefi
FROM
TbSoore
WHERE
(StutusSoore = 1) AND (IdSoore = @IdSoore)
END
А в C# я использую его с этим кодом:
string strsql = $@"EXEC spGetSoore @IdSoore = @IdSoore;";
DataTable dt = new DataTable();
using (SqlConnection con = new SqlConnection(strcon))
{
using (SqlCommand cmdSQL = new SqlCommand(strsql, con))
{
cmdSQL.CommandType = CommandType.StoredProcedure;
cmdSQL.Parameters.Add(new SqlParameter ("@IdSoore", forwardedIdSoore));
con.Open();
dt.Load(cmdSQL.ExecuteReader());
}
}
Но когда я запускаю сайт, я получаю эту ошибку:
System.Data.SqlClient.SqlException: не удалось найти хранимую процедуру «EXEC spGetSoore @IdSoore = @IdSoore».
Я проверил свое SQL-соединение на С#, используя
SELECT IdSoore, NameSoore, MakiMadani, TextMoghadame, TextHadis, TextMohtava, TextMoarefi
FROM TbSoore
WHERE (StutusSoore = 1) AND (IdSoore = @IdSoore)
запрос вместо Exec spGetSoore и это сработало.
Затем я запустил Exec spGetSoore в SQL Server, и это тоже сработало.
Конечно, в SQL Server, когда я писал EXEC spGetSoore @IdSoore = 1;, spGetSoore подчеркивалось красной подсказкой:
Не удалось найти хранимую процедуру spGetSoore.
но это сработало!
Так:

но я не знаю, почему у меня возникла эта ошибка и что я могу ее исправить.
Пожалуйста, помогите мне.





Когда вы используете CommandType.StoredProcedure, клиентская библиотека предполагает, что предоставленный CommandText — это имя вызываемой хранимой процедуры, а не полная инструкция TSQL. Посмотрите на свою ошибку, и вы увидите, что она ищет процедуру под названием «EXEC spGetSoore @IdSoore = @IdSoore» вместо «spGetSoore».
Либо удалите назначение CommandType, либо исправьте CommandText на «spGetSoore».
В SSMS это работает, поскольку отправляет пакеты SQL, а не вызовы процедур. Вместо этого пакет вызывает процедуру.
Конечно, на сервере sql, когда я писал EXEC spGetSoore @IdSoore = 1; ,показано красным подчеркиванием spGetSoore в этой подсказке:
Красное подчеркивание происходит из-за устаревшего кеша в SSMS. Это происходит, когда вы только что создали процедуру, но Intelisense еще не получил ее. Вы можете принудительно обновить кеш, нажав ctrl+shift+R.
Если вы используете
CommandType.StoredProcedure, тоCommandText— это просто [схема и] имя процедуры (безEXEC, без имен и значений параметров). Существуют тысячи руководств, в которых описывается вызов хранимой процедуры из C#, безопасная передача параметров безAddWithValueи избегание SQL-инъекций.