Использование именованных параметров с MySQL .NET Provider - PullRequest
1 голос
/ 17 мая 2009

В провайдере MySQL .NET вы можете использовать именованные параметры в синтаксисе:

?parametername

Теперь я пытаюсь создать именованный параметр для параметра, который будет использоваться в списке «IN», например, :

select * from mytable where id in (?ids)

Как я могу использовать именованный параметр с этим, если я использую varchar, он будет добавлять кавычки до и после списка, т. Е .:

Если я передаю значение параметра, используя varchar:

cmd.Parameters.Add("?ids", MySqlDbType.Varchar).Value = ids; // ids is a string which contains the ids separated by commas, e.g. 1, 2, 3 .. etc

запрос будет выполнен так:

select * from mytable where id in ('1, 2 ,3')

Конечно, это выдаст ошибку, как я могу передать именованный параметр без получения кавычек, это способ, которым он должен быть выполнен:

select * from mytable where id in (1, 2 , 3)

Есть ли обходной путь для этого? В настоящее время я использую String.Format (), но хотел бы использовать именованный параметр, возможно ли это как-то?

P.S. Я использую только текстовые операторы, без sproc, поэтому ничего из этого не будет передано sproc (на тот случай, если вы считаете, что это невозможно, поскольку sprocs не принимает массивы)

Ответы [ 2 ]

3 голосов
/ 17 мая 2009

Это спрашивалось здесь так много раз, что я перестал считать.

Это всегда один и тот же ответ, независимо от технологии. Вы просто должны добавить как можно больше параметров в свой запрос, так как планируете использовать IN «аргументы».

Если вы хотите запросить WHERE id IN (1, 2 ,3), ваш подготовленный оператор должен выглядеть следующим образом:

SELECT * FROM mytable WHERE id IN (?, ?, ?)

Используйте любые средства построения строк, которые вы считаете подходящими, для создания такой строки SQL. После этого добавьте к нему три значения параметров.

Весь смысл подготовленных операторов в том, чтобы отделить код SQL от данных. Запятые являются кодом SQL, вы никогда не попадете в оператор с одним параметром, они должны быть в до .

Хорошо, есть одна альтернатива. Создайте отдельную / временную таблицу, сохраните в ней свои идентификаторы и сделайте запрос примерно так:

SELECT
  * 
FROM 
  mytable m
  INNER JOIN searchtable s ON m.id = s.id
1 голос
/ 17 мая 2009

Проблема в том, что вы не передаете только один параметр. Вы хотите передать коллекцию параметров. Насколько я знаю, пока это не поддерживается (нет DbType для массивов или коллекций). Таким образом, вы не можете добавить несколько значений в качестве одного параметра.

Поскольку (я предполагаю) числовые элементы в 'ids' могут варьироваться, вам нужно изменить командную строку, чтобы иметь правильное количество параметров. Можно было бы использовать некоторые циклы для генерации как командной строки, так и для заполнения параметров их соответствующими значениями. В основном это означает, что вы создаете новую команду для каждого запроса.

Другим решением будет использование хранимой процедуры, которая берет ваш разделенный запятыми список и использует его для построения запроса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...