簡體   English   中英

使用Dapper C#在MySQL命令中使用變量

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM