2014-01-22 2 views
0

У меня есть приложение Asp.Net с базой данных MySql. Для доступа к этой базе данных я использую набор данных (.xsd), где я поставил свои запросы в TableAdapters. Один из этих запросов есть пункт WHERE IN, как:Как передать список значений в качестве параметра в привязке C#

SELECT somefield 
FROM sometable 
WHERE somefield IN (?) 

Это somefield является строкой. Функция TableAdapter ожидает, что параметр строки заменит параметр запроса. Однако я хотел бы передать List<string> (или массив или любой другой тип) для проверки нескольких значений. Единственный способ я нашел до сих пор, чтобы преобразовать список в разделителями separeted списке:

GetData(string.Join(",", myList.ToArray()); 

Он отлично работает до тех пор, пока есть только одно значение в списке. С двумя значениями запрос возвращает 0 строк. Я активировал общий журнал в MySql и выяснил, что он связан с кавычками. Запрос, который достигает базы данных является:

SELECT somefield 
FROM sometable 
WHERE somefield IN ('foo,bar') 

Я добавил дополнительные кавычки при соединении значения:

GetData(string.Join("','", myList.ToArray()); 

Но дополнительные кавычки получить только сбежавших и результат все еще 0 строк:

SELECT somefield 
FROM sometable 
WHERE somefield IN ('foo\',\'bar') 

Прямо сейчас единственный вариант, который я вижу, - преобразование каждой отдельной строки в идентификатор и объединение этих целых чисел в строку. Как в this нить. Но это означает много дополнительных вызовов в базу данных, чтобы получить эти идентификаторы. Я действительно предпочитаю использовать строковые значения!

Кто знает, как решить эту загадку?

+0

Почему вы не используете LINQ? – dursk

+0

Краткий ответ: исторические причины с этим приложением. Более длинный ответ: вы начали думать, и я искал информацию о LINQ. Я обязательно взгляну на Entity Framework/LINQ в будущем! – Briqunullus

ответ

0

TableAdapter будет держать побега котировки. Вы можете создать определенную пользователем функцию, которая принимает аргумент с разделителями-запятыми и возвращает его в виде строк. Таким образом, вы можете получить доступ к функции следующим образом. Раньше я делал это с T-SQL. Это должно быть выполнимо в MySQL.

SELECT somefield 
FROM sometable 
WHERE somefield IN UDFDelimitedToRows(?) 
+0

Да, это маршрут, который я принимаю прямо сейчас. Проблема заключается в том, что функции не могут возвращать несколько строк. Поэтому я создал тот, который сравнивает строку со списком в xml и возвращает bool. В настоящее время тестирование ... – Briqunullus

0

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

GetData(String.Format("'{0}'", String.Join(",", myList.ToArray())); 

Если одиночные кавычки получить спасся, удвоить их, такие как:

GetData(String.Format("''{0}''", String.Join(",", myList.ToArray())); 
Смежные вопросы