2010-12-09 118 views
4

我正在處理一些SQL代碼。SQL SELECT * FROM XXX WHERE columnName in Array

我熟悉的語法

SELECT * FROM myTable WHERE myColumn in ('1','2','3'); 

假設我寫,我想用C#數組,其中我用('1','2','3')一些C#代碼。我怎麼做?

+3

是否使用LINQ到SQL?如果不是,你用什麼來訪問數據? – 2010-12-09 00:56:44

+0

是myColumn字符串還是整數數據?如果是整數,你應該使用(1,2,3) – 2010-12-09 01:01:30

回答

7

您可以動態建立你的SQL字符串。

如果你知道數組中的數據是好的(不是由用戶提供的),你可以做一個字符串。加入。

var sql = string.Format("SELECT * FROM myTable WHERE myColumn in ({0})", string.Join(", ", myArray)); 

如果您不知道它是已清理過的數據,那麼您應該使用帶參數的Command。

var myArray = new string[] { "1", "2", "3" }; 
//var sql = string.Format("SELECT * FROM myTable WHERE myColumn in ({0})", string.Join(", ", myArray)); 

var cmd = new System.Data.SqlClient.SqlCommand(); 
var sql = new System.Text.StringBuilder(); 
sql.Append("SELECT * FROM myTable WHERE myColumn in ("); 
for (var i = 0; i < myArray.Length; i++) 
{ 
    cmd.Parameters.Add("@" + i, myArray[i]); 
    if (i > 0) sql.Append(", "); 
    sql.Append("@" + i); 
} 
sql.Append(")"); 
cmd.CommandText = sql.ToString(); 
+0

中的tsql:myColumn接受:看起來有點KLUDGEy給我,但它的工作原理。 – 2010-12-13 15:42:05

0

我會通過for循環並按照你想要的方式進行格式化。例如,假設你有一個數組:6,3,abc。使用for循環將其添加到一般字符串中,以便得到結果:(6,3,abc);不要太難,然後將其插入聲明中。

2

SQL不支持通過IN子句對逗號分隔的值列表使用單個變量,這意味着您的C#代碼必須將數組轉換爲逗號分隔列表。該列表然後在執行查詢之前連接到查詢中。

否則,你需要看使用數據庫本地動態SQL語法 - 但仍然意味着你必須讓C#數組轉換成SQL被操縱......

0

您只需做一個string.Join創建的數組,可以作爲參數傳遞給查詢字符串。

例如:

var values = new string[] { "1", "2", "3" }; 
var parameterString = string.Join(",", values); 

var sql = "SELECT * FROM myTable WHERE myColumn in (@param)"; 

var cmd = new SqlCommand(sql, connectionstring); 
cmd.Parameters.AddWithValue("@param", parameterString); 
var reader = cmd.ExecuteReader(); 
相關問題