SQLite, как прочитать значение поля из последней команды ExecuteNonQuery ()

vb.net sqlite

125 просмотра

1 ответ

Мне нужно управлять отношениями между двумя таблицами, такими как:

Dim mainTable = "CREATE TABLE IF NOT EXISTS users (userID INTEGER PRIMARY KEY, name VARCHAR(20))"

Dim typeTable = "CREATE TABLE IF NOT EXISTS userType (type VARCHAR(20), user INTEGER, FOREIGN KEY(user) REFERENCES users (userID))"

Затем я принимаю данные от пользователя из выпадающего списка для поля «имя» и списка для поля «тип», поэтому я могу получить что-то вроде:

Mike > Rock - Pop - Metal
Tom > Pop - Tecno

и так далее...

Следующим кодом я записываю информацию в таблицу пользователей.

Dim connSave = New SQLiteConnection("Data Source=DataBaseUserType.sqlite;Version=3")
Try
    Using (connSave)
        connSave.Open()
        Dim sql = "INSERT INTO users (name) VALUES (@paramName)"
        Dim cmdSave As SQLiteCommand = New SQLiteCommand(sql, connSave)
        'Tomando parámetros de https://www.devart.com/dotconnect/sqlite/docs/Devart.Data.SQLite~Devart.Data.SQLite.SQLiteCommand_members.html'
        cmdSave.CommandText = sql
        cmdSave.Connection = connSave
        cmdSave.Parameters.AddWithValue("@paramName", cboName.Text)
        cmdSave.ExecuteNonQuery()

    End Using

Catch ex As Exception
    MsgBox(ex.ToString())
End Try

Но мне нужно знать значение userID для автоматически сгенерированного поля, чтобы я мог сохранить первую запись в typeTable примерно так:

48 - Rock (где 48 - это идентификатор Майка)

Есть ли способ прочитать значение userID сразу после cmdSave.ExecuteNonQuery ()? или мне нужно снова открыть соединение и прочитать последнюю запись, чтобы загрузить userID с чем-то вроде SELECT * FROM mainTable, ГДЕ ROWID IN (SELECT max (ROWID) FROM mainTable) ??

Автор: fedeteka Источник Размещён: 08.11.2019 11:20

Ответы (1)


1 плюс

Решение

Ну, вам не нужно снова открывать соединение. Согласно документации вы должны вызвать эту функцию

last_insert_rowid()

так что сразу после ExecuteNonQuery добавьте эти строки

    .....
    cmdSave.ExecuteNonQuery()
    cmdSave.Parameters.Clear()
    cmdSave.CommandText = "SELECT last_insert_rowid()"
    Dim lastID = cmdSave.ExecuteScalar()
    .....
End Using

В Sql Server есть возможность объединить две команды в одну строку, разделяя их точкой с запятой. Я не могу проверить это сейчас на SQLite, но вы можете попробовать запустить их вместе с

Dim sql = "INSERT INTO users (name) VALUES (@paramName);
           SELECT last_row_id()"

и все еще используя ExecuteScalar, чтобы получить результат выбора

Автор: Steve Размещён: 20.08.2016 01:18
Вопросы из категории :
32x32