База данных заблокирована в vb.net при попытке обновить данные в vb.net

Здравствуйте, у меня есть простой способ обновить информацию о клиенте в одной из таблиц моей базы данных, однако, когда я пытаюсь обновить ее, возникает ошибка, говорящая о том, что база данных заблокирована. Я понятия не имею, как это исправить, потому что мои запросы на добавление и удаление работают нормально. Это сообщение об ошибке: System.Data.SQLite.SQLiteException: «база данных заблокирована база данных заблокирована"

Public Sub updateguest(ByVal sql As String)
    Try

        con.Open()
        With cmd
            .CommandText = sql
            .Connection = con
        End With

        result = cmd.ExecuteNonQuery
        If result > 0 Then
            MsgBox("NEW RECORD HAS BEEN UPDATED!")
            con.Close()


        Else
            MsgBox("NO RECORD HASS BEEN UPDATDD!")
        End If

    Catch ex As Exception
        MsgBox(ex.Message)
    Finally
        con.Close()
    End Try
End Sub

 Private Sub IbtnUpdate_Click(sender As Object, e As EventArgs) Handles ibtnUpdate.Click

    Dim usql As String = "UPDATE Customers SET fname = '" & txtFName.Text & "'" & "WHERE CustomerID ='" & txtSearchID.Text & "'"
    updateguest(usql)

End Sub
 Private Sub IbtnSearch_Click(sender As Object, e As EventArgs) Handles ibtnSearch.Click
    Dim sSQL As String
    Dim newds As New DataSet
    Dim newdt As New DataTable
    Dim msql, msql1 As String
    Dim con As New SQLiteConnection(ConnectionString)
    con.Open()
    msql = "SELECT * FROM Customers Where Fname Like '" & txtSearchName.Text & "%'"
    msql1 = "SELECT * FROM Customers Where CustomerID '" & txtSearchID.Text & "'"
    Dim cmd As New SQLiteCommand(msql, con)
    Dim cmd1 As New SQLiteCommand(msql1, con)

    Dim dt = GetSearchResults(txtSearchName.Text)
    dgvCustomerInfo.DataSource = dt

    Dim mdr As SQLiteDataReader = cmd.ExecuteReader()



    If mdr.Read() Then


        If txtSearchName.Text <> "" Then
            sSQL = "SELECT * FROM customers WHERE fname LIKE'" & txtSearchName.Text & "%'"

            Dim con1 As New SQLiteConnection(ConnectionString)
            Dim cmd2 As New SQLiteCommand(sSQL, con1)
            con1.Open()
            Dim da As New SQLiteDataAdapter(cmd2)
            da.Fill(newds, "customers")
            newdt = newds.Tables(0)
            If newdt.Rows.Count > 0 Then
                ToTextbox(newdt)
            End If
            dgvCustomerInfo.DataSource = newdt
            con1.Close()
            txtSearchID.Clear()

        ElseIf txtSearchID.Text <> "" Then
            sSQL = "SELECT * FROM customers WHERE CustomerID ='" & txtSearchID.Text & "'"

            Dim con2 As New SQLiteConnection(ConnectionString)
            Dim cmd2 As New SQLiteCommand(sSQL, con2)
            con2.Open()
            Dim da As New SQLiteDataAdapter(cmd2)
            da.Fill(newds, "customers")
            newdt = newds.Tables(0)
            If newdt.Rows.Count > 0 Then
                ToTextbox(newdt)
            End If
            dgvCustomerInfo.DataSource = newdt
            con2.Close()
            txtSearchName.Clear()


        End If

    Else
        MsgBox("No data found")
    End If


End Sub
   Private Sub IbtnDelete_Click(sender As Object, e As EventArgs) Handles ibtnDelete.Click
    Dim dsql As String = "DELETE FROM customers WHERE customerid = " & txtSearchID.Text & ""
    deleteme(dsql)
    updatedgv(dgvCustomerInfo)
    txtSearchID.Clear()
    txtSearchName.Clear()


End Sub
    Public Sub deleteme(ByVal sql As String)
    Try

        con.Open()
        With cmd
            .CommandText = sql
            .Connection = con
        End With

        result = cmd.ExecuteNonQuery
        If result > 0 Then
            MsgBox("NEW RECORD HAS BEEN DELTED!")
            con.Close()

        Else
            MsgBox("NO RECORD HASS BEEN DELTED!")
        End If

    Catch ex As Exception
        MsgBox(ex.Message)
    Finally
        con.Close()


    End Try
End Sub

Можете ли вы добавить полное и точное сообщение об ошибке, которое вы получаете, пожалуйста?

JayV 22.12.2020 14:45

Где вы инициируете cmd и con? Вы на 100% уверены в их состоянии, когда доберетесь до методов updateguest?

Hursey 22.12.2020 20:52

Широко открыты для SQL-инъекций.

Mary 23.12.2020 18:26

Является ли ваше поле CustomerID строковым типом?

Mary 23.12.2020 18:34

Объекты базы данных должны быть объявлены и удалены в методе, в котором они используются.

Mary 23.12.2020 18:35

@Mary Как мне объявить и удалить объекты базы данных, а мой CustomerID является целым числом в базе данных, и для поиска я использую .text

Milosz Laksa 23.12.2020 20:55

Смотрите мой ответ.

Mary 24.12.2020 01:41
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
7
219
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы сделали хорошее начало, отделив код базы данных от кода пользовательского интерфейса. Однако любые окна сообщений должны отображаться в пользовательском интерфейсе, а любые операторы sql должны быть записаны в коде доступа к данным.

Я использовал блоки Using...End Using, чтобы убедиться, что объекты базы данных закрыты и удалены. Я использовал параметры для защиты от SQL-инъекций. Я не слишком уверен в сопоставлении типов DbType с типами Sqlite. Возможно, вам придется немного пошалить с этим. В исходном заявлении об обновлении у вас было значение идентификатора в кавычках. Это передаст строку. Когда вы используете параметры, вам не нужно беспокоиться об этом или амперсандах и двойных кавычках. Всего одна чистая струна.

Private ConStr As String = "Your connection string"

Public Function updateguest(FirstName As String, ID As Integer) As Integer
    Dim Result As Integer
    Dim usql As String = "UPDATE Customers SET fname = @fname WHERE CustomerID = @ID;"
    Using con As New SQLiteConnection(ConStr),
            cmd As New SQLiteCommand(usql, con)
        cmd.Parameters.Add("@fname", DbType.String).Value = FirstName
        cmd.Parameters.Add("@ID", DbType.Int32).Value = ID
        con.Open()
        Result = cmd.ExecuteNonQuery
    End Using
    Return Result
End Function

Private Sub IbtnUpdate_Click(sender As Object, e As EventArgs) Handles ibtnUpdate.Click
    Try
        Dim Result = updateguest(txtFName.Text, CInt(txtSearchID.Text))
        If Result > 0 Then
            MsgBox("New RECORD HAS BEEN UPDATED!")
        Else
            MsgBox("NO RECORD HAS BEEN UPDATDD!")
        End If
    Catch ex As Exception
        MsgBox(ex.Message)
    End Try
End Sub

Привет, ваш код работает, однако он работает только до того, как я сделаю какой-либо поисковый запрос в базе данных, как обновление, так и удаление работают так, однако, если я выполняю поисковый запрос и пытаюсь обновить или удалить записи, возникает ошибка, говорящая, что база данных, которую он заблокировал.

Milosz Laksa 26.12.2020 14:47

Используете ли вы Using...End Using для каждого соединения в обновлениях, поиске и удалении?

Mary 26.12.2020 19:36

Могу ли я увидеть код для поиска и удаления? Добавьте его как редактирование исходного вопроса.

Mary 26.12.2020 20:17

Вы избавились от каких-либо соединений, объявленных на уровне формы?

Mary 26.12.2020 20:18

Другие вопросы по теме