2014-01-22 62 views
0

我已經有了一個帶有MySql數據庫的Asp.Net應用程序。爲了訪問這個數據庫,我使用了一個數據集(.xsd),我在TableAdapters中放置了我的查詢。其中一個查詢有WHERE IN條款,如:如何在c#數據綁定中傳遞值列表作爲參數

SELECT somefield 
FROM sometable 
WHERE somefield IN (?) 

somefield是一個字符串值。 TableAdapter函數需要一個字符串參數來替換查詢參數。但是,我想通過一個List<string>(或一個數組,或任何其他類型)來檢查多個值。到目前爲止,我發現的唯一方法是到列表轉換成一個逗號separeted列表:

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

它工作正常,只要有只有一個列表中的值。使用兩個值查詢返回0行。我激活了MySql中的常規日誌,發現它與引號有關。到達數據庫的查詢是:

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

但額外的報價只得到逃脫,結果仍然是0行:

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

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

我加盟值時,添加額外的引號

現在我看到的唯一選擇是將每個單個字符串轉換爲一個id並將這些整數連接成一個字符串。像在this線程中一樣。但是這意味着需要額外的數據庫來調用這些ID。我真的更喜歡使用字符串值!

誰知道如何解決這個難題?

+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())); 
相關問題