@Nikita07

В чем может быть ошибка при обращении к БД через ADO.NET?

Всем привет, есть следуюший запрос SQL

DECLARE @Test table (ids INT)

SELECT
    [AdvertXrefDsp].[advertId],
    [Dsp].[dspId],
    [Dsp].[name],
    [Dsp].[endpoint],
    [Dsp].[protocol],
    [Dsp].[protocolOptions]

FROM 
    [AdvertXrefDsp]

INNER JOIN [Dsp] on [AdvertXrefDsp].[dspId] = [Dsp].[dspId]

WHERE
    [advertId] in (SELECT * FROM @Test)


И есть код на C# для обращения к этому SQL запросу и соответственно извлечения необходимых данных из БД

private const string SELECT_PARTNERS_PARAM = "SELECT_PARTNERS_PARAM.sql";

private static string GetQuerySelect(string sql_file)
        {
            using (var stream = Assembly.GetExecutingAssembly().GetManifestResourceStream($"Api.Dal.Query.{sql_file}"))
            using (StreamReader reader = new StreamReader(stream, Encoding.UTF8))
                return reader.ReadToEnd();
        }

public async Task<IEnumerable<RtbModel>> GetPartnerDal(int[] idsS)
        {
            var listOfPartners = new List<RtbModel>();

            var sqlCommand = GetQuerySelect(SELECT_PARTNERS_PARAM);

            DataTable dataTable = new DataTable();
            dataTable.Columns.Add(new DataColumn("ids", typeof(int)));

            foreach (var id in idsS)
            {
                dataTable.Rows.Add(id);
            }
            
            var cmd = CreateCommand(sqlCommand);
            SqlParameter parameter = cmd.Parameters.AddWithValue("Test", dataTable);
            parameter.TypeName = "Test";

            using (var reader = await cmd.ExecuteReaderAsync())
            {
                while (await reader.ReadAsync())
                {
                   // Код для записи данных из БД
                }
            }
            return listOfPartners;
        }


При обращении к этому и методу и передачи например 2ух значений (68 и 65) выкидывает вот такую ошибку
System.Data.SqlClient.SqlException (0x80131904): Column, parameter, or variable @Test. : Cannot find data type Test. Из-за чего может появляться такая ошибка?

P.S.
Если я пишу скрипт в самом SQL Server
DECLARE @Test TABLE (ids INT)
INSERT INTO @Test
VALUES(68),
(65),


SELECT
    [AdvertXrefDsp].[advertId],
    [Dsp].[dspId],
    [Dsp].[name],
    [Dsp].[endpoint],
    [Dsp].[protocol],
    [Dsp].[protocolOptions]

FROM 
    [AdvertXrefDsp]

INNER JOIN [Dsp] on [AdvertXrefDsp].[dspId] = [Dsp].[dspId]

WHERE
    [advertId] in (SELECT * FROM @Test)


то все прекрасно выполняется
  • Вопрос задан
  • 40 просмотров
Пригласить эксперта
Ответы на вопрос 1
@vabka Куратор тега C#
Токсичный
ADO не позволяет закидывать табличные переменные.
Используйте string.Join(',') и интерполяцию в этом случае.

UPD: Табличную переменную передать можно, но для этого надо заранее объявить в БД кастомный тип, и передавать параметр с соответствующим DbType
https://qastack.ru/programming/11102358/how-to-pas...
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы