it-swarm.com.ru

Получение идентификатора последней вставки с помощью SQLite.NET в C #

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

                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, похоже, открывает и закрывает соединения для каждой операции набора данных. Я думал, что подключение к настольному адаптеру изменит ситуацию. Но это не так.

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

Спасибо.

Правка: 

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

20
vanneto
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.
45
Will Marcouiller

Используя 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()
}
54
Alex Smith

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();
7
Greg Carrier
    database = new SQLiteConnection(databasePath);

    public int GetLastInsertId()
    {
        return (int)SQLite3.LastInsertRowid(database.Handle);
    }
1
Олег Ладыко

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

0
stonito