Использование переменных в команде MySQL с Dapper C#

Я пытаюсь использовать команду выбора MySQL с 2 переменными в C#, но он работает только с одной переменной.

Моя цель - создать систему входа в систему, которая использует таблицу MySQL с 3 столбцами: UserName, Password и TableName. Затем я хочу перейти к другой таблице (с именем таблицы в качестве имени таблицы), и в этой таблице есть информация о людях, которую я отображаю в WPF ListBox.

return connection.Query<Person>($"select * from "+ TableName +" where PhoneNumber LIKE "+ searchData and id > 0 order by Name").ToList();

Я использую этот код для поиска в списке по номеру телефона.

TableName и searchData являются переменными.

Это мой код, который не работает.

2 ответа

Я расширяю последний абзац от ответа @MarcGravell.

Работает только с одной переменной

Я думаю, когда вы говорите это, вы имеете в виду, что это работает только с одним значением TableName vairable. Ваш код работает, когда TableName указывает на ваш PersonTable или аналогичные и не удается, когда он указывает на другую таблицу с другим именем и столбцами.

Ты используешь TableName как переменная. Это означает, что один и тот же запрос будет выполняться с другим именем таблицы. В этом случае использование сильно типизированной перегрузки Query (Query<Person>(...)) МОЖЕТ не работать; Я не уверен, потому что в вопросе отсутствуют ваши возможные определения таблиц и определения Person учебный класс.

В этом случае лучшим решением будет анонимный запрос. Пожалуйста, обратитесь образец здесь.

Таким образом, следующий может быть пример кода:

var result = connection.Query(
 "select * from " + TableName + " ...",
 new { searchData  }).AsList();
return result;

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

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

Это совсем не параметризовано; параметры являются конкретными концепциями SQL, поэтому вы можете иметь:

return connection.Query<Person>(
 $"select * from {TableName} where PhoneNumber LIKE @searchData and id > 0 order by Name",
 new { searchData  }).AsList(); 

(или же :searchData и т. д., в зависимости от варианта SQL)

Это параметризует searchData правильно.

Обратите внимание, однако, что имена таблиц не могут быть параметризованы; в общем, вам не нужно вводить имя таблицы в SQL, но когда вам нужно это сделать, вам придется объединить его так же, как вы уже. Было бы целесообразно внести в белый список имя таблицы, так как вы не можете предотвратить его появление в SQL-инъекции.

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