Удалить из SQLite, где столбец Date в списке <datetime>

107
9

С помощью С# у меня есть List<DateTime> dates, мне нужно удалить из моей таблицы Trip где Trip.Date в моем списке дат.

Я пытался создать пользовательский string.Join чтобы создать csv дат и передать это как параметр, но он создает литерал и, следовательно, не работает. Итак, я застрял - должен ли я создать временную таблицу и пропустить даты, добавив их в таблицу temp? Возможно ли это в 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: рядом с "?": Синтаксическая ошибка

Я также пробовал

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

такая же ошибка, как указано выше.

Думаю, я мог бы добавить инструкцию удаления для каждой даты, но, вероятно, не лучшую практику.

спросил(а) 2020-04-04T02:36:34+03:00 6 месяцев, 2 недели назад
1
Решение
71

После большого количества проб и ошибок я решил просто создать запрос, используя соответствующее число ? и 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();
}

Это работало так, как ожидалось.

ответил(а) 2020-04-04T02:48:51.589583+03:00 6 месяцев, 2 недели назад
41

Вы должны использовать 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();
}

ответил(а) 2020-04-04T02:36:34+03:00 6 месяцев, 2 недели назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема