2015-02-23 80 views
2

在我的節目,我有名爲runSQL函數時的錯誤,那就是:接收試圖更新記錄

Dim Connection As New OleDb.OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=TrainingLog.accdb") 
    Dim DT As New DataTable 
    Dim DataAdapter As OleDb.OleDbDataAdapter 

    Connection.Open() 
    DataAdapter = New OleDb.OleDbDataAdapter(query, Connection) 
    DT.Clear() 
    DataAdapter.Fill(DT) 
    Connection.Close() 
    Return DT 

我試圖在使用更新字符串數據庫更新記錄,從這個源代碼:

Dim sqlString As String 

    sqlString = "UPDATE UserRecords set FirstName = '" & txtName.Text 
    sqlString = sqlString & "', LastName = '" & txtSurname.Text 

    If ChkSmoker.Checked = True Then 
     sqlString = sqlString & "', Smoker = true" 
    ElseIf ChkSmoker.Checked = False Then 
     sqlString = sqlString & "', Smoker = false" 
    End If 

    sqlString = sqlString & ", Weight = " & txtWeight.Text 

    If RdoMale.Checked = True Then 
     sqlString = sqlString & ", Gender = 'm'" 
    ElseIf RdoFemale.Checked = True Then 
     sqlString = sqlString & ", Gender = 'f'" 
    End If 

    sqlString = sqlString & " WHERE UserName = '" & LstUsers.SelectedItem.ToString & "'" 

    runSQL(sqlString) 

然而,一旦我點擊保存按鈕,我從runSQL功能的7號線的錯誤(不包括空行,所以這是DataAdapter.Fill方法(DT)線)說: 「沒有給出一個或多個必需參數的值。」

我想知道是否有人知道這是爲什麼或如何解決它。

我確實想到的一件事是,在更新的表中,除UPDATE語句中提到的字段外,還有其他字段。例如,有一個標題爲「TeamMember」的是/否字段,我在更新聲明中沒有提及。 當使用更新功能時,我是否必須爲每個字段提供值,即使那些沒有更改?

感謝您的閱讀,並希望有所幫助!

+0

您使用TSQL嗎? – Hockenberry 2015-02-23 07:13:38

+0

老實說我不知道​​。我剛剛在學校學習Visual Basic,並且我已經被告知要使用的SQL部分,而不是教給他們。 – DatBrummie 2015-02-23 07:16:07

+0

您是否真的看過所有代碼生成的SQL語句?這將是首先要做的,看看它是否是你期望的。如果你看過,請告訴我們你看到了什麼。 – jmcilhinney 2015-02-23 07:19:06

回答

0

你不應該自己編寫SQL查詢。它非常簡單和安全(用於強化SQL注入)來創建參數化查詢或使用存儲過程。然後通過放置查詢或存儲過程名稱和參數值來執行它。

此外,用這種方法,您不必考慮正確的格式對於特定的值是什麼。例如,你如何格式化日期?而且,如何格式化布爾值?大多數情況下,您的查詢的問題是您嘗試爲Smoker列設置的值爲falsetrue,因爲在TSQL中這是一個比特值,並且只能是01

選中此項可查看使用參數的示例:ADO.NET Code Examples(單擊VB標籤在VB中查看它)。您會看到,您在查詢中定義了一個參數,指定一個名稱前綴爲@的前綴,然後您只需爲查詢中的每個參數傳遞一個值,並且它將以正確的格式傳遞給服務器,而無需關心的。

從樣品的一個措施:

Dim queryString As String = _ 
     "SELECT ProductID, UnitPrice, ProductName from dbo.Products " _ 
     & "WHERE UnitPrice > @pricePoint " _ 
     & "ORDER BY UnitPrice DESC;" 
Dim command As New SqlCommand(queryString, connection) 
command.Parameters.AddWithValue("@pricePoint", paramValue) 

'' command.ExecuteXXX 

請注意,您可以用不同的方式執行命令,根據您的需要簡單地執行,或得到一個標值或全部數據集作爲結果。

+0

當我添加一個用戶到數據庫,雖然,我使用的代碼︰(nevermind,評論我不認爲會允許我粘貼和格式很好)但添加用戶時,真或錯誤是我用於訪問中的是/否列,它用於添加,所以我認爲它可以編輯 – DatBrummie 2015-02-23 10:58:10

+0

在程序的其他地方,我在這裏使用了代碼:http://pastebin.com/qPwW2zTw(不是當然,如果pastebin被允許在網站上,但我不會我可以在註釋中正確地格式化代碼)並且工作正常,使用SQL函數,並使用true作爲它的值。 (TeamMember的複選框與原始問題中的吸菸者相同),所以我相當確定問題在於其他地方。我只是找不到 – DatBrummie 2015-02-23 13:50:33

+0

你是wirgt,@DatBrummie。對不起,我沒有意識到它是Access。 Nexttiem,試着標記你的問題。我已更正了標籤。 – JotaBe 2015-02-23 20:19:01