簡體   English   中英

我無法從 VB.net 的 MS 訪問數據庫中刪除一行

[英]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 & "]"

但這給出了一個錯誤:“沒有為一個或多個必需參數提供值”。 當我用單引號替換括號時,我也收到此錯誤。

我嘗試了 thisthisthis ,但仍然出現錯誤。

不知道該怎么辦。

編輯:

我做了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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM