Здравствуйте, у меня есть простой способ обновить информацию о клиенте в одной из таблиц моей базы данных, однако, когда я пытаюсь обновить ее, возникает ошибка, говорящая о том, что база данных заблокирована. Я понятия не имею, как это исправить, потому что мои запросы на добавление и удаление работают нормально. Это сообщение об ошибке: 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
Где вы инициируете cmd и con? Вы на 100% уверены в их состоянии, когда доберетесь до методов updateguest?
Широко открыты для SQL-инъекций.
Является ли ваше поле CustomerID строковым типом?
Объекты базы данных должны быть объявлены и удалены в методе, в котором они используются.
@Mary Как мне объявить и удалить объекты базы данных, а мой CustomerID является целым числом в базе данных, и для поиска я использую .text
Смотрите мой ответ.
Вы сделали хорошее начало, отделив код базы данных от кода пользовательского интерфейса. Однако любые окна сообщений должны отображаться в пользовательском интерфейсе, а любые операторы 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
Привет, ваш код работает, однако он работает только до того, как я сделаю какой-либо поисковый запрос в базе данных, как обновление, так и удаление работают так, однако, если я выполняю поисковый запрос и пытаюсь обновить или удалить записи, возникает ошибка, говорящая, что база данных, которую он заблокировал.
Используете ли вы Using...End Using
для каждого соединения в обновлениях, поиске и удалении?
Могу ли я увидеть код для поиска и удаления? Добавьте его как редактирование исходного вопроса.
Вы избавились от каких-либо соединений, объявленных на уровне формы?
Можете ли вы добавить полное и точное сообщение об ошибке, которое вы получаете, пожалуйста?