Не удалось найти хранимую процедуру при вызове с веб-сайта C#

У меня есть база данных 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.

но это сработало!

Так:

Не удалось найти хранимую процедуру при вызове с веб-сайта C#

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

Пожалуйста, помогите мне.

Если вы используете CommandType.StoredProcedure, то CommandText — это просто [схема и] имя процедуры (без EXEC, без имен и значений параметров). Существуют тысячи руководств, в которых описывается вызов хранимой процедуры из C#, безопасная передача параметров без AddWithValue и избегание SQL-инъекций.

Aaron Bertrand 02.05.2024 18:18
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
1
63
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Когда вы используете 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.

Другие вопросы по теме