Авто приращение не правильно при запуске двух экземпляров - PullRequest
1 голос
/ 26 сентября 2019

У меня работает 2 экземпляра приведенного ниже кода, который подключается к базе данных system.data.sqlite.Когда я вставляю строку в базу данных, используя какой-либо один экземпляр, автоматически увеличиваемое значение (ID) не подходит при чтении из другого экземпляра.В чем причина этого?

Imports System.Data.SQLite
Public Class Form1
    Public cnn As SQLiteConnection
    Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
        cnn = New SQLiteConnection("Data Source=\\abc\xx\x_backup.db;Password=password;Connect Timeout=55;FailIfMissing=True")
        cnn.ParseViaFramework = True
        cnn.Open()
    End Sub
Public Function inserttoTable(ByVal sql As String) As DataTable

         Try
            sql = "SELECT max(ID) FROM joblog;"
            Dim mycommand As SQLiteCommand = New SQLiteCommand(cnn)
            mycommand.CommandText = sql
            MsgBox(mycommand.ExecuteScalar)
            sql = "INSERT INTO joblog (jobid) VALUES (123);"

            mycommand = New SQLiteCommand(cnn)
            mycommand.CommandText = sql
            MsgBox(mycommand.ExecuteNonQuery())
        Catch ex As Exception
            MsgBox(ex.ToString)
        End Try

Ответы [ 2 ]

0 голосов
/ 27 сентября 2019

Функция, которую я использовал, в некоторой степени эквивалентна Scope_Identity в Sql Server.У меня нет базы данных Sqlite, поэтому я не смог протестировать.Я не уверен, что вы можете объединять команды в Sqlite, но если не просто сделать 2 отдельных запроса.ExecuteScalar возвращает первый столбец первой строки в наборе результатов, который является требуемым числом.

Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
    Dim NewID As Long
    Using cn As New SQLiteConnection("Your connection string")
        Using cmd As New SQLiteCommand("INSERT INTO joblog (jobid) VALUES (123); Select last_insert_rowid()")
            NewID = CLng(cmd.ExecuteScalar())
        End Using
    End Using
    MessageBox.Show($"The new ID is {NewID}")
End Sub
0 голосов
/ 26 сентября 2019

Когда я вставляю строку в базу данных, используя какой-либо один экземпляр, автоинкрементное значение (ID) некорректно при чтении из другого экземпляра

I подозревают, что это потому, чтоВаши соединения и команды не закрыты / удалены , поэтому они остаются открытыми.

Лучший совет для подключения - использовать его, а затем закрыть / утилизировать.То же самое касается команд, убедитесь, что они расположены.

Вот один из способов сделать это:

 Dim intReturn As Integer
 sql = "SELECT max(ID) FROM joblog;"

 ' First query to get your scalar return value
 Using cnn As New New SQLiteConnection("Data Source=\\abc\xx\x_backup.db;Password=password;Connect Timeout=55;FailIfMissing=True")
    Using mycommand As New SQLiteCommand(sql, cnn)
       cnn.ParseViaFramework = True
       cnn.Open()

       intReturn = mycommand.ExecuteScalar
       MessageBox.Show(intReturn)

    End Using
 End Using

 ' Second query to actually do the insert
 sql = "INSERT INTO joblog (jobid) VALUES (123);"
 Using cnn As New New SQLiteConnection("Data Source=\\abc\xx\x_backup.db;Password=password;Connect Timeout=55;FailIfMissing=True")
    Using mycommand As New SQLiteCommand(sql, cnn)
       cnn.ParseViaFramework = True
       cnn.Open()

       intReturn = mycommand.ExecuteNonQuery()
       MessageBox.Show("Records affected " & intReturn)

    End Using
 End Using

В другой заметке, рассмотрите использование Параметры SQL , в противном случаеВы можете быть подвержены атакам SQL-инъекций.

...