使用C#我有List<DateTime> dates
,我需要从我的Trip
表中删除Trip.Date
在我的日期列表中。
我试图用string.Join
来创建日期的csv并将其作为参数传递,但它会创建一个文字,因此不起作用。所以我被卡住 - 我应该创建一个临时表并循环将日期添加到临时表中吗?这在SQLite中甚至可能吗?
我当前的(非工作)代码:
using (SQLiteConnection conn = new SQLiteConnection(new SQLitePlatformWinRT(), _sqliteDatabasePath))
{
StringBuilder sb = new StringBuilder();
sb.Append("DELETE FROM Trip ");
sb.Append("WHERE Date IN (?) ");
conn.Execute(sb.ToString(),
new object[] {
dates
});
}
以上代码出错:
SQLiteException:near“?”:语法错误
我也试过
StringBuilder sb = new StringBuilder();
sb.Append("DELETE FROM Trip ");
sb.Append("WHERE Date IN (SELECT * FROM ?) ");
与上述相同的错误。
我想我可以为每个日期附加删除声明,但可能不是最佳做法。
答案 0 :(得分:0)
您应该使用SQLiteCommand
并手动添加所有参数。
一种方法是这样的:
using (SQLiteConnection conn = new SQLiteConnection(new SQLitePlatformWinRT(), _sqliteDatabasePath))
{
conn.Open();
SQLiteCommand sqlCommand = new SQLiteCommand("", conn);
List<string> paramNames = new List<string>();
for (int i = 0; i < dates.Count; i++)
{
paramNames.Add("@date" + i.ToString());
sqlCommand.Parameters.AddWithValue("@date" + i.ToString(), dates[i]);
}
sqlCommand.CommandText =
string.Format("DELETE FROM Trip WHERE Date IN ({0}) ",
string.Join(", ", paramNames));
sqlCommand.ExecuteNonQuery();
}
答案 1 :(得分:0)
经过大量的反复试验后,我决定使用适当数量的?
和List<DateTime> dates
作为参数构建查询,如下所示:
using (SQLiteConnection conn = new SQLiteConnection(new SQLitePlatformWinRT(), _sqliteDatabasePath))
{
StringBuilder sb = new StringBuilder();
sb.Append("DELETE FROM Trip ");
sb.Append("WHERE Date IN ( ? ");
if (dates.Count > 1)
{
for (int i = 1; i < dates.Count; i++)
{
sb.Append(", ? ");
}
}
sb.Append(")");
conn.BeginTransaction();
conn.Execute(
sb.ToString(),
dates.Cast<object>().ToArray());
conn.Commit();
}
这按预期工作。