Использование переменных в команде 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-инъекции.