从SQLite中删除List <datetime>中Date列的位置

时间:2017-04-15 11:53:52

标签: c# sqlite

使用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 ?) ");

与上述相同的错误。

我想我可以为每个日期附加删除声明,但可能不是最佳做法。

2 个答案:

答案 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();
}

这按预期工作。