我试图从一个具有相同名称的sqlite数据库中获取所有的命令 作为Hashtable中的键。
我的陈述是这样的。
// the keys from the hashtable are names equivalent
// to name entrys in the SomeTable Names Collumn
Hashtable names;
String query = "SELECT Id, Name FROM SomeTable WHERE Name LIKE (@Names)";
SQLiteCommand command = new SQLiteCommand(query, _databaseConnection);
command.Parameters.AddWithValue("@Names", names.Keys);
SQLiteDataReader reader = reader.ExecuteReader();
while(reader.Read())
{
Console.WriteLine("Name: {0}, ID: {1}", reader[1].ToString(), reader[0].ToString());
}
我完全确定数据库中有类似的值,但我什么也得不到,读者也没有执行。 是否无法将ICollection添加为参数值,因此我只需要启动一次读取器?
答案 0 :(得分:0)
你不想在那个选择中使用LIKE子句,你想要一个IN子句。
e.g。最终,您希望执行以下查询:
SELECT Id, Name FROM SomeTable WHERE Name IN ('case23', 'carson63000', 'fred')
不幸的是,似乎将此作为参数添加并不简单。
我发现了一个较旧的问题“Parameterizing a SQL IN clause?”,这可能会提供一些想法。
答案 1 :(得分:0)
所以要完成这个。感谢我从Carlson63000获得的链接,我得到了一些工作。
// First i build two String[] based on my Hastable.Keys.
// One which holds the values, one which creates parameter names.
Hashtable hashNames;
String[] names = new String[hashName.Keys.Count];
String[] nameTags = new String[hashName.Keys.Count];
int c = 0;
foreach (String k in hashName.Keys)
{
names[c] = k;
nameTags[c] = "@tag" + c.ToString();
c++;
}
// after this i create my statement using the nameTags String[]
String statementValueTags = String.Join(",", nameTags);
String query = String.Format("SELECT Name, FROM SomeTable WHERE (Name IN ({0}))", statementValueTags);
// for adding the parameterized Statements i use a for loop
// where i add the values from my String[]
SQLiteCommand command = new SQLiteCommand(query, _databaseConnection);
for (int i = 0; i < names.Length; i++)
{
command.Parameters.AddWithValue(nameTags[i], names[i]);
}
SQLiteDataReader reader = command.ExecuteReader();
while(reader.Read())
{
Console.WriteLine(reader[0]);
}