[英]Using variables in MySQL command with Dapper C#
我試圖在c#中將MySQL select命令與2個變量一起使用,但它僅對一個變量起作用。
我的目標是創建一個使用MySQL表的登錄系統,該表包含3列:UserName,Password和TableName。 然后,我想轉到另一個表(使用TableName作為表名),並且在該表中有我在WPF ListBox中顯示的人的信息。
return connection.Query<Person>($"select * from "+ TableName +" where PhoneNumber LIKE "+ searchData and id > 0 order by Name").ToList();
我使用此代碼通過電話號碼搜索列表。
TableName和searchData是變量。
這是我的代碼不起作用。
這是不是在所有的參數; 參數是特定的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注入孔。
我在擴展@MarcGravell答案的最后一段。
它僅適用於一個變量
我猜想您是說它僅適用於TableName
vairable的一個值。 當TableName
指向您的PersonTable
或類似的表時,您的代碼起作用;而當它指向具有不同名稱和列的其他表時,則代碼失敗。
您正在使用TableName
作為變量。 這意味着同一查詢將使用不同的表名執行。 在這種情況下,使用強類型的Query
重載( Query<Person>(...)
)可能不起作用; 我不確定,因為該問題缺少您可能的表定義和Person
類的定義。
在這種情況下,查詢匿名將是更好的解決方案。 請在這里參考樣品。
因此,以下可能是示例代碼:
var result = connection.Query(
"select * from " + TableName + " ...",
new { searchData }).AsList();
return result;
除此之外,避免在查詢中插入表名。 而是為每個表或域模型編寫單獨的代碼。 如果適合您的需求,請考慮使用存儲庫模式。
另外,請考慮在其他答案和評論中實施改進和更正。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.