SQLite Последняя вставка Rowid не работает - PullRequest
7 голосов
/ 31 декабря 2011

Я нашел несколько примеров того, как получить последний вставленный идентификатор строки из вызова вставки sql в мою базу данных SQLite, но мой скрипт выдал эту ошибку:

SQLiteException
Message = "SQLite error\r\nnear \")\": syntax error"
InnerException
NULL

Ниже приведен текст SQL, который я отправил ви как я это использовал.Очевидно, я что-то неправильно понял.Может ли кто-нибудь помочь мне здесь?

Я пытаюсь вернуть только что введенный идентификационный номер.

private static int Save(Dates date, SQLiteConnection con) {
  // REF: http://www.sqlite.org/c3ref/last_insert_rowid.html
  int result = 0;
  string sql = "INSERT INTO Dates1 " +
  "(ID, TaskID, Last1) " +
  "VALUES " +
  "((SELECT MAX(ID) FROM Dates1)+1, @TaskID, @Last); " +
  "SELECT sqlite3_last_insert_rowid(sqlite3*);";
  using (SQLiteCommand cmd = new SQLiteCommand(sql, con)) {
    cmd.Parameters.AddWithValue(Dates.AT_TASK, date.TaskID);
    cmd.Parameters.AddWithValue(Dates.AT_LAST, date.Last.ToShortDateString());
    cmd.CommandText = Dates.SQL_INSERT;
    try {
      result = cmd.ExecuteNonQuery();
    } catch (SQLiteException err) {
      result = -1;
      LogError("Save(Dates, SQLiteConnection)", err);
    }
  }
  return result;
}

К вашему сведению: я настроил таблицу так, чтобы предполагалось IDбыть автоматически сгенерированными с использованием Create SQL ниже, но таблица хранит только -1 для значений ID, если я не вставлю его вручную.

public const string SQL_CREATE = "CREATE TABLE Dates1 " +
  "(ID INTEGER PRIMARY KEY AUTOINCREMENT, TaskID INTEGER, Last1 TEXT);";

1 Ответ

14 голосов
/ 31 декабря 2011

Цитировать из документации SQLite :

last_insert_rowid () Функция last_insert_rowid () возвращает ROWID вставки последней строки из базы данныхсоединение, которое вызвало функцию.SQL-функция last_insert_rowid () - это оболочка для интерфейсной функции C / C ++ sqlite3_last_insert_rowid ().

Так что вам нужно изменить свой оператор на:

"SELECT last_insert_rowid();"

, потому что вы пытались вызвать функцию API C.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...