Хранимая процедура SQL Server не видит параметр - PullRequest
0 голосов
/ 03 июля 2018

Я использую C # для вызова хранимой процедуры и заполнения ее из таблицы данных, но я делаю что-то не так.

Моя хранимая процедура:

CREATE PROCEDURE [dbo].[getStationInfo]
    @stationList AS dbo.udtableStationCode READONLY
AS  
BEGIN
    SELECT * 
    FROM stations
    WHERE StationCode IN (SELECT * FROM @stationList) 
END 

В этой процедуре используется определенный пользователем тип таблицы:

CREATE TYPE [dbo].[udtableStationCode] 
     AS TABLE (StationCode NVARCHAR(50))

Я пытаюсь отправить таблицу данных в хранимую процедуру и вернуть результат в другую таблицу данных. Вот мой C #:

    using (SqlConnection con = new SqlConnection(strConn))
    {
        con.Open();

        using (SqlCommand cmd = new SqlCommand("getStationInfo", con))
        {
            using (SqlDataAdapter ada = new SqlDataAdapter(cmd))
            {
                using (DataTable dtStationsReturned = new DataTable())
                {
                    cmd.CommandType = CommandType.StoredProcedure;
                    cmd.Parameters.Clear();
                    cmd.CommandText = "dbo.getStationInfo";
                    cmd.Parameters.AddWithValue("@stationList", dtStationCodes);
                    ada.Fill(dtStationsReturned);
                }
            }
        }
    }

Независимо от того, что я пытаюсь, когда мой код попадает в строку 'ada.Fill', я получаю ошибку:

Процедура "getStationInfo" не имеет параметра с именем "@stationList".

Но хранимая процедура getStationInfo явно имеет этот параметр. Может кто-нибудь сказать мне, что я делаю не так? Любая помощь приветствуется.

РЕДАКТИРОВАТЬ: я проверил содержимое dtStationCodes, и это нормально.

РЕДАКТИРОВАТЬ: Вот как я создаю мой dtStationCodes дата:

DataTable dtStationCodes = new DataTable();
dtStationCodes.Columns.Add("StationCode", typeof(String));

1 Ответ

0 голосов
/ 03 июля 2018

Попробуйте это:

using (SqlConnection con = new SqlConnection(strConn))
{
    con.Open();
    using (SqlCommand cmd = new SqlCommand("dbo.getStationInfo", con))
    {
        using (SqlDataAdapter ada = new SqlDataAdapter(cmd))
        {
            using (DataTable dtStationsReturned = new DataTable())
            {
                cmd.CommandType = CommandType.StoredProcedure;
                cmd.Parameters.Clear();
                cmd.CommandText = "dbo.getStationInfo";
                SqlParameter sp = new SqlParameter("@stationList", dtStationCodes);
                sp.SqlDbType = SqlDbType.Structured;
                sp.TypeName = "dbo.udtableStationCode";
                cmd.Parameters.Add(sp);
                ada.Fill(dtStationsReturned);
            }
        }
    }
}

См. этот вопрос для другого примера передачи определенных пользователем типов таблиц.

Также см. на этой странице для получения дополнительной информации о создании SqlParameters и передаче TVP в хранимую процедуру.

...