2017-08-02 85 views
0

我已經創建了一個包含3個值的ID,用戶名和分數的數據庫。當點擊保存按鈕時,我需要創建一個新的條目到這個數據庫。我的程序需要創建一個由應用程序提供的用戶名和分數的新行。Visual Basic項目無法更新Microsoft Access數據庫

這是我的代碼,以更新現有的數據庫:

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\Scoreboard.accdb" 
    connString = provider & dataFile 
    myConnection.ConnectionString = connString 


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

     con.Open() 

     cmd.Parameters.Add("@ID", OleDbType.Char).Value = "NEW" 
     cmd.Parameters.Add("@UserName", OleDbType.Char).Value = playerName 
     cmd.Parameters.Add("@Score", OleDbType.Char).Value = wins 


     cmd.ExecuteNonQuery() 

    End Using 

End Sub 

我得到

OLEDB例外是未處理

它強調cmd.ExecuteNonQuery()並說數據標準不匹配

有人能給我推薦這個工作嗎?

+0

野生猜測---分數應該是數字......也許OleDbType.Integer – jsotola

+0

'@ ID'被分配爲Char,但是你寫了一個字符串。請檢查您的OleDbTypes。我想,'@ ID'和'@ UserName'應該是一個VarChar/String和'@ Score'一個Int32。 – muffi

回答

0

你有幾個問題在那裏。首先,至少有一個參數是錯誤的數據類型。其次,你的參數的順序是錯誤的。

Jet和ACE OLE DB提供程序僅部分支持命名參數,因爲它們允許您使用名稱,以便您的代碼可以更清晰,但他們忽略名稱並僅使用該位置。這意味着您需要按照它們在SQL代碼中出現的順序將參數添加到您的OleDbCommand。你沒有這樣做,所以你有一個問題,雖然這不是你的錯誤信息的直接原因。

即使這些提供程序完全支持命名參數,但您並未在SQL代碼中使用名稱。這意味着無論如何都無法通過名稱匹配參數,那麼您是如何認爲以錯誤的順序添加它們不會成爲問題的呢?

鑑於您的所有三個參數都指定爲相同的數據類型,但錯誤的順序不會導致您看到的錯誤消息。如果這種數據類型是正確的,那麼你會發現錯誤的數據被保存到了一些列中,這會更糟糕,即看起來工作但不是失敗。您需要確保您爲要保存的列使用正確的OleDbType值。如果您的數據庫中的ID列指定爲包含32位數字,則應該使用OleDbType.Integer作爲相應的參數。我也建議使用VarChar而不是Char,除非你的列是專門固定寬度的,而Access中的Text列不太可能是,我甚至不能確定。

相關問題