2016-11-16 58 views
2

我見過很多參數化SQL查詢的例子,但遇到了幾個問題。參數化的SQL UPDATE語句

我知道我不是哈希密碼,所以請不要這樣。

以下是我的代碼:

cmd.CommandText = "UPDATE users SET [email protected], [email protected], [email protected], [email protected] WHERE ID=" & recordID 
cmd.Parameters.AddWithValue("@uName", tbUsername.Text) 
cmd.Parameters.AddWithValue("@pWord", tbPassword1.Text) 
cmd.Parameters.AddWithValue("@uRole", cbRole.SelectedItem) 
cmd.Parameters.AddWithValue("@uActive", isActive) 

我得到的錯誤是:

「標準表達式中數據類型不匹配」 我不明白爲什麼,因爲在代碼嘗試運行時,數據庫中的所有內容都是「短字符串」,除了「執行器」設置爲「是/否」並且「isActive」設置爲「是」之外。我已驗證表列標題是準確的,我不知道爲什麼這不起作用。

此格式似乎與INSERT語句一起使用,但不是UPDATE語句......但我無法在此刻確認。

任何幫助,將不勝感激。

編輯:

更新的代碼具有相同的錯誤。

Dim isActive As Boolean = False 
    If cbxActive.CheckState = CheckState.Checked Then 
     isActive = "True" 
    End If 

    cmd.CommandText = "UPDATE users SET [email protected], [email protected], [email protected], [email protected] WHERE [email protected]" 
    cmd.Parameters.AddWithValue("@uName", tbUsername.Text) 
    cmd.Parameters.AddWithValue("@pWord", tbPassword1.Text) 
    cmd.Parameters.AddWithValue("@uRole", cbRole.SelectedItem.ToString()) 
    cmd.Parameters.AddWithValue("@uActive", If(isActive, "Yes", "No")) 
    cmd.Parameters.AddWithValue("@ID", recordID) 

    myConnection.Open() 
    Try 
     cmd.ExecuteNonQuery() 
    Catch ex As OleDb.OleDbException 
     MsgBox(ex.Message) 
     Exit Sub 
    End Try` 

SelectedItem正在從組合框的集合返回一個字符串。

這是我的數據庫結構。 Link to Picture of Access DB structure

這是另一種結構圖。 enter image description here

+1

不使用'AddWithValue' - 它使提供者猜測數據類型。 'cbRole.SelectedItem'就是Object。通常有更多的例外情況表明哪種類型會給你一個線索。當然,我們不知道「isActive」是什麼類型 - 聽起來應該是布爾值,但我們不能看到它是聲明。 recordID可以/也應該是一個參數。 – Plutonix

+1

'除了設置爲是/否的「執行器」和「isActive」設置爲「是」之外(如果準確描述的話)。首先,MySql沒有yes/No列類型,通常使用tinyint。但Yes/No是Access-ism,但它只是布爾的另一個名稱。如果你傳遞''Yes'',那是一個不匹配的字符串 – Plutonix

+0

只是猜測,因爲你的代碼不顯示變量或數據庫表的聲明:是'recordId'正確的數據類型? – Robert

回答

2

當然,我們只能猜測isActivecbRole.SelectedItem中的內容,但我們肯定知道其中的一個,如果不是兩者,就會導致您的問題。

具體而言,只有在使用直接匹配類型時,纔可以使用AddWithValue。否則你需要精確設置這樣的參數數據類型

Dim p As New OleDbParameter(@pName, OleDbType.SomeType) 
p.Value = [your value] 
cmd.Parameters.Add(p) 

在你的情況下,這2行可能是[scratch]!有問題

cmd.Parameters.AddWithValue("@uRole", cbRole.SelectedItem) 
cmd.Parameters.AddWithValue("@uActive", isActive) 

第一行返回的對象可以是任何東西(只有你知道)。怎麼用它做

' If selected item is string 
cmd.Parameters.AddWithValue("@uRole", cbRole.SelectedItem.ToString()) 
' If selected item is integer 
cmd.Parameters.AddWithValue("@uRole", CInt(cbRole.SelectedItem)) 
' If selected item is complex object in which you use property 
Dim val As Integer = DirectCast(cbRole.SelectedItem, MyObjectType).SomeIntProperty 
cmd.Parameters.AddWithValue("@uRole", val) 

' If your value 'isActive' is boolean and you keep Yes/No in DB, you need this 
cmd.Parameters.AddWithValue("@uActive", if(isActive, "Yes", "No")) 
' and opposite 
cmd.Parameters.AddWithValue("@uActive", if(isActive = "Yes", 1, 0)) 
' you have to be careful here. In .NET false=0, all else <> 0. so, if your business logic needs True=1, all else <> 1, you need to convert correspondingly 

而最後一件事 - 爲什麼不參數...WHERE ID=" & recordID...?做同樣的事情

cmd.CommandText = ". . . . . WHERE ID= @id" 
cmd.Parameters.AddWithValue("@id", recordID) 
+0

@MattBrown所以,你需要使用'if(isActive =「Yes」,1,0)'。另外,當我說「結構」時,我的意思是:user varchar; ID整數....等 –

+0

非常感謝你,這是正確的,並解決了問題!我很抱歉沒有發佈準確的第一篇文章,我將在未來做到這一點。我是新來的教授,你的建議和提示真的幫助我學習!再次感謝你! –

+0

@MattBrown享受!不要忘記投票。謝謝 –