[英]I can't delete a row from MS access database from VB.net
我正在嘗試按照YT 教程從 MS 數據庫中刪除一行,但出現了兩種錯誤。 當我嘗試這個時:
Dim provider As String
Dim dataFile As String
Dim connString As String
Dim myConnection As OleDbConnection = New OleDbConnection
provider = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source="
dataFile = "C:\Users\user\Desktop\PU\SEMESTER 4\Visual Programming\Hospital Databases\Patient DB.accdb"
connString = provider & dataFile
myConnection.ConnectionString = connString
myConnection.Open()
Dim str As String
str = "Delete * from [Patient] Where [PatientID] = " & PatientID.ToString & ""
Dim cmd As OleDbCommand = New OleDbCommand(str, myConnection)
我收到此錯誤:“查詢表達式中的格式錯誤的 GUID '[PatientID]=DataGridViewTextBoxColumn { Name=PatientID, index=0 }'
所以我使用了這里所說的括號,所以現在是這樣的:
str = "Delete * from [Patient] Where [PatientID] = [" & PatientID.ToString & "]"
但這給出了一個錯誤:“沒有為一個或多個必需參數提供值”。 當我用單引號替換括號時,我也收到此錯誤。
我嘗試了 this , this和this ,但仍然出現錯誤。
不知道該怎么辦。
編輯:
我做了PatientID.ToString
是因為我想這樣當用戶點擊一個 ID 單元格時,它會在用戶無需輸入任何內容的情況下獲得 ID。 但顯然那是錯誤的,所以我做了一個輸入框並按照瑪麗的回答。 但我在Execute...
行收到此錯誤:“沒有為一個或多個必需參數提供值”
我進行了搜索,他們中的大多數人都說要加上單引號才能正常工作。 我做了(^)但仍然出現錯誤:(我是否以錯誤的方式調用了子?
Private Sub DischargeToolStripMenuItem1_Click(sender As Object, e As EventArgs) Handles DischargeToolStripMenuItem1.Click
Dim ID As Integer
ID = InputBox("Enter the ID of the patient to be discharged", "Discharge")
DeleteRecord(ID)
End Sub
Sub DeleteRecord(ID As Integer)
Dim provider = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source="
Dim dataFile = "C:\Users\user\Desktop\PU\SEMESTER 4\Visual Programming\Hospital Databases\Patient DB.accdb"
Dim connString = provider & dataFile
Using myConnection As New OleDbConnection(connString),
cmd As New OleDbCommand("Delete * from Patient Where PatientID = @ID", myConnection)
cmd.Parameters.Add("@ID", OleDbType.Integer).Value = ID
myConnection.Open()
cmd.ExecuteNonQuery()
End Using
End Sub
需要處理連接和命令。 Using...End Using
塊將負責關閉連接以及處理連接和命令。 在此代碼中,連接和命令都包含在同一塊中。 注意Using
第一行末尾的逗號。
直到最后一刻才打開連接,直接在.Execute...
行之前。 之后立即關閉與End Using
的連接。
始終使用參數。 對於 Access,我們使用參數名稱以便於閱讀代碼。 Access 不注意名稱。 重要的是參數出現在 sql 查詢中的順序必須與參數添加到參數集合中的順序相匹配。 我不得不猜測參數的數據類型。 檢查您的數據庫的實際類型。
Private Sub DeleteRecord(ID As Integer)
Dim provider = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source="
Dim dataFile = "C:\Users\user\Desktop\PU\SEMESTER 4\Visual Programming\Hospital Databases\Patient DB.accdb"
Dim connString = provider & dataFile
Using myConnection As New OleDbConnection(connString),
cmd As New OleDbCommand("Delete * from Patient Where PatientID = @ID", myConnection)
cmd.Parameters.Add("@ID", OleDbType.Integer).Value = ID
myConnection.Open()
cmd.ExecuteNonQuery()
End Using
End Sub
編輯
應始終驗證用戶輸入。 用戶可能會或可能不會輸入可以轉換為數字的內容。 服務器數據類型有一個.TryParse
方法來測試。 .TryParse
返回一個Boolean
所以它正好適合If
語句。 您要測試的第一個參數字符串。 第二個參數是您要轉換為的類型的變量。 .TryParse
將用轉換后的值填充第二個變量。
Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
'An InputBox always returns a String, not a number
Dim ID = InputBox("Enter the ID of the patient to be discharged", "Discharge")
Dim intID As Integer
If Integer.TryParse(ID, intID) Then
DeleteRecord(intID)
Else
MessageBox.Show("Please enter a valid number")
End If
End Sub
我認為您的問題出在 datafile 的定義中,因為它沒有正確讀取文件名。 雖然我同意其他人的觀點,即使用參數是最好的方法,但在此期間,試試這個:
Dim MyFile as string = "Patient DB.accdb"
Dim dataFile = "C:\Users\user\Desktop\PU\SEMESTER 4\Visual Programming\Hospital Databases\" & MyFile
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.