我有這樣的列的表:
table(INT id, serial, data)
我想創建以下 SELECT 命令:
SELECT * FROM table WHERE serial IN (list-of-serial)
但問題是,當我向序列串列中添加多個值時,我得到空查詢。
例如:
id serial
1 1234
2 5678
3 1234
4 9012
5 1234
6 5678
7 9012
SELECT * FROM table WHERE serial IN ('1234','9012')
在這種形式下,它可以作業,但我需要將其轉換為 C# 查詢。
string file="my-sqlite-database";
SQLiteConnection database = new SQLiteConnection($@"URI=file:{file}");
database.Open();
SQLiteCommand C = new SQLiteCommand("SELECT * FROM table WHERE serial IN (@serials)", database);
C.Parameters.AddWithValue("@serials","('1234','9012')");
C.Prepare();
SQLiteDataReader R = C.ExecuteReader();
While(R.Read()){} // 0 rows
我究竟做錯了什么?我試過傳遞字串陣列,帶引號和不帶引號的字串,沒有區別。
uj5u.com熱心網友回復:
只是一種預感,我可能是錯的。
我從未使用過 C#,但我覺得正在發生的事情可能被"('1234','9012')"視為一個字串。
您是否嘗試創建一個陣列并傳遞該陣列?
uj5u.com熱心網友回復:
除非你直接將它注入到 SQL 陳述句中,否則引數只會被解釋為文字值。所以它將尋找單個字串匹配('1234','9012')。注射是一個壞主意,你通常應該避免。
不幸的是,SQLite 不支持表值引數。所以這里需要使用多個引數:
string file = "my-sqlite-database";
var parms = new string[]{"1234", "9012"};
using (SQLiteConnection database = new SQLiteConnection($@"URI=file:{file}"))
using (SQLiteCommand C = new SQLiteCommand("", database))
{
C.Parameters.AddRange(parms.Select((p, ind) => new SqliteParameter("@p" ind, p)));
C.CommandText = $@"
SELECT *
FROM table
WHERE serial IN ({string.Join(",", parms.Select((p, ind) => "@p" ind))})
";
database.Open();
C.Prepare();
using (SQLiteDataReader R = C.ExecuteReader())
{
while(R.Read())
{ //do something
}
}
}
Dapper 可以在本機執行上述操作,因此您可能需要查看它。
還要注意正確使用using要處理的塊。
uj5u.com熱心網友回復:
您需要從"SELECT * FROM table WHERE serial IN (@serials)". 應該是這樣的
string parameter = "('1234','9012')";
string query = $"SELECT * FROM table WHERE serial IN {parameter}";
另外,請不要*在查詢中使用,相反,您可以使用別名提及列。
你可以洗掉 C.Parameters.AddWithValue("@serials","('1234','9012')");
正如lasse-v-karlsen所評論的,您可以從代碼中定義的引數中洗掉括號。
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/360084.html
上一篇:將7天添加到日期的觸發器
