2017-04-15 106 views
0

使用C#我有List<DateTime> dates,我需要从我的Trip表中删除,其中Trip.Date在我的日期列表中。从SQLite中删除列表中的日期列<DateTime>

我正在尝试用户string.Join创建一个csv日期并将其作为参数传递,但它创建一个文字,因此不起作用。所以我被卡住了 - 我应该创建一个临时表,并通过将它们添加到临时表中的日期来循环?这在SQLite中甚至可能吗?

我现在的(非工作)代码:

SQLiteException:近 “?”:从上面的代码

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 
     }); 
} 

错误语法错误

我也尝试过

StringBuilder sb = new StringBuilder(); 
sb.Append("DELETE FROM Trip "); 
sb.Append("WHERE Date IN (SELECT * FROM ?) "); 

与上面相同的错误。

我想我可以为每个日期附加一条删除语句,但可能不是最佳实践。

+0

请告诉我们什么是行不通的?任何错误或某事? – Sebi

+0

@Sebi - 我刚刚将它添加到问题 – Rick

回答

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

这按预期工作。

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(); 
} 
+0

我刚刚得到错误SQLiteCommand不包含带2个参数的构造函数 – Rick

+0

您是否从Nuget Package Manager安装SQLite?我正在使用[这个软件包](https://www.nuget.org/packages/System.Data.SQLite)。你的SQLiteCommand类对构造函数有什么选择? – granit