我正在尝试从sqlite数据库中获取所有条目,这些条目与哈希表中的键具有相同的名称。
我的语句看起来像这样。
// 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作为参数值,所以我只需要启动阅读器一次?
发布于 2010-05-22 18:31:05
您不希望在select中有LIKE子句,而需要in子句。
例如,最终,您希望执行如下查询:
SELECT Id, Name FROM SomeTable WHERE Name IN ('case23', 'carson63000', 'fred')不幸的是,将其作为参数添加似乎并不简单。
我发现了一个更老的问题,"Parameterizing a SQL IN clause?",它可能会提供一些想法。
发布于 2010-05-22 19:20:49
所以为了结束这一切。多亏了我从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]);
}https://stackoverflow.com/questions/2887558
复制相似问题