2017-07-27 203 views
0

我有一個簡單的二十一點遊戲,我試圖通過添加2個簡單的值來更新數據庫。我希望它將用戶名和玩家的分數添加到數據庫中。大酒杯項目無法更新Access數據庫

看的在線教程後,這是我試過的代碼:

Imports System.Data.OleDb 

Public Class Form1 

    'for updating database 
    Dim provider As String 
    Dim dataFile As String 
    Dim connString As String 
    Dim myConnection As OleDbConnection = New OleDbConnection 

    Private Sub ButtonSaveScore_Click(sender As Object, e As EventArgs) Handles ButtonSaveScore.Click 

     provider = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" 
     dataFile = "F:\Documents\Class Documents\CSC289 - K6A - Programming Capstone Project\Project\BlackJack\BlackJack\Scoreboard.accdb" 
     connString = provider & dataFile 
     myConnection.ConnectionString = connString 
     myConnection.Open() 
     Dim str As String 
     str = "Update [Scores] set [UserName] = '" & playerName & "',[Score] =' " & wins & "' where [ID] = NEW" 
     Dim cmd As OleDbCommand = New OleDbCommand(str, myConnection) 

     Try 
      cmd.ExecuteNonQuery() 
      cmd.Dispose() 
      myConnection.Close() 
     Catch ex As Exception 
      MsgBox(ex.Message) 
     End Try 

    End Sub 

我得到的錯誤:

one or more variables is not provided

我第一次打的保存按鈕。第二次它打破了應用程序,它說我「不能調整文件目前的狀態已經打開,然後它突出myConnection.ConnectionString = connString

+0

你忘了'around'NEW',所以它認爲它是一個列名,對於訪問表中沒有找到的所有名稱都是參數。 – litelite

+0

此外,您的代碼有[SQL注入](https://stackoverflow.com/questions/601300/what-is-sql-injection)的風險,您應該使用具有適當參數的預準備語句。 – litelite

+0

你的第二個問題。這是因爲您必須在嘗試重新打開數據庫之前關閉數據庫。目前只有在查詢沒有拋出任何東西時才關閉數據庫。您應該將連接關閉到['Finally'塊](https://docs.microsoft.com/en-us/dotnet/visual-basic/language-reference/statements/try-catch-finally-statement)。或者,您可以使用['使用'塊](https://docs.microsoft.com/en-us/dotnet/visual-basic/language-reference/statements/using-statement) – litelite

回答

1

考慮實施Using:。

Sometimes your code requires an unmanaged resource, such as a file handle, a COM wrapper, or a SQL connection. A Using block guarantees the disposal of one or more such resources when your code is finished with them. This makes them available for other code to use.

下面是一些示例代碼:

Using con As New OleDbConnection(connectionString), 
     cmd As New OleDbCommand(commandString, con) 

    con.Open() 

    cmd.ExecuteNonQuery() 

End Using 

這將處理關閉和你的對象的處置。

我也會考慮使用參數來避免SQL注入。有關詳細信息,請參閱Bobby Tables

下面是一些示例代碼:

Using con As New OleDbConnection(connectionString), 
     cmd As New OleDbCommand("UPDATE [Scores] SET [UserName] = ?, [Score] = ? WHERE [ID] = ?", con) 

    con.Open() 

    cmd.Parameters.Add("@Username", OleDbType.[Type]).Value = playerName 
    cmd.Parameters.Add("@Score", OleDbType.[Type]).Value = wins 

    'I've popped this into a parameter as I'm unsure what it is. I'll leave that for you to decide 
    cmd.Parameters.Add("@ID", OleDbType.[Type]).Value = "NEW" 

    cmd.ExecuteNonQuery() 

End Using 

Note that I have used OleDbType.[Type] . You will want to replace this with the data type you have specified for your columns.

隨着OleDb你參數的順序是非常重要的,而不是命名。確保您創建參數,如上所示,它們出現在您的命令中。