Получение идентификатора последней вставки с помощью SQLite.NET в C # - PullRequest
21 голосов
/ 03 декабря 2010

У меня простая проблема с не таким простым решением ... В настоящее время я вставляю некоторые данные в базу данных, например:

                kompenzacijeDataSet.KompenzacijeRow kompenzacija = kompenzacijeDataSet.Kompenzacije.NewKompenzacijeRow();
                kompenzacija.Datum = DateTime.Now;
                kompenzacija.PodjetjeID = stranka.id;
                kompenzacija.Znesek = Decimal.Parse(tbZnesek.Text);

                kompenzacijeDataSet.Kompenzacije.Rows.Add(kompenzacija);

                kompenzacijeDataSetTableAdapters.KompenzacijeTableAdapter kompTA = new kompenzacijeDataSetTableAdapters.KompenzacijeTableAdapter();
                kompTA.Update(this.kompenzacijeDataSet.Kompenzacije);

                this.currentKompenzacijaID = LastInsertID(kompTA.Connection);

Последняя строка важна.Почему я поставляю соединение?Ну, есть функция SQLite с именем last_insert_rowid () , которую вы можете вызвать и получить последний идентификатор вставки.Проблема в том, что он связан с соединением, и .NET, похоже, открывает и закрывает соединения для каждой операции набора данных.Я думал, что подключение к настольному адаптеру изменит ситуацию.Но это не так.

Кто-нибудь знает, как решить эту проблему?Может, откуда взять постоянную связь?Или, может быть, что-то более элегантное?

Спасибо.

РЕДАКТИРОВАТЬ:

Это также проблема с транзакциями, мне нужно такое же соединение, если я хочу использовать транзакции, так что это такжепроблема ...

Ответы [ 5 ]

59 голосов
/ 10 февраля 2016

Используя C # (.net 4.0) с SQLite, класс SQLiteConnection имеет свойство LastInsertRowId, равное первичному целочисленному ключу последнего вставленного (или обновленного) элемента.

rowID возвращается, еслитаблица не имеет первичного целочисленного ключа (в этом случае rowID is column создается автоматически).

Подробнее см. https://www.sqlite.org/c3ref/last_insert_rowid.html.

Что касается объединения нескольких команд в одну транзакцию, любые команды, введенные после начала транзакции и до ее фиксации, являются частью одной транзакции.

long rowID;
using (SQLiteConnection con = new SQLiteConnection([datasource])
{
    SQLiteTransaction transaction = null;
    transaction = con.BeginTransaction();

    ... [execute insert statement]

    rowID = con.LastInsertRowId;

    transaction.Commit()
}
46 голосов
/ 03 декабря 2010
select last_insert_rowid();

И вам нужно будет выполнить его как скалярный запрос.

string sql = @"select last_insert_rowid()";
long lastId = (long)command.ExecuteScalar(sql); // Need to type-cast since `ExecuteScalar` returns an object.
7 голосов
/ 11 сентября 2015

last_insert_rowid () является частью решения.Возвращает номер строки, а не фактический идентификатор.

cmd = CNN.CreateCommand();
cmd.CommandText = "SELECT last_insert_rowid()";
object i = cmd.ExecuteScalar();

cmd.CommandText = "SELECT " + ID_Name + " FROM " + TableName + " WHERE rowid=" + i.ToString();
i = cmd.ExecuteScalar();
1 голос
/ 28 октября 2017
    database = new SQLiteConnection(databasePath);

    public int GetLastInsertId()
    {
        return (int)SQLite3.LastInsertRowid(database.Handle);
    }
0 голосов
/ 02 августа 2017

Объект SQLiteConnection имеет свойство для этого, поэтому нет необходимости в дополнительном запросе.После INSERT вы просто используете LastInsertRowId свойство вашего SQLiteConnection объекта, который использовался для команды INSERT.Тип LastInsertRowId свойство равно Int64 .Конечно, как вы уже сейчас, чтобы автоинкремент работал, первичный ключ на таблице должен быть установлен в поле AUTOINCREMENT , что является другой темой.

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