2016-08-24 67 views
1

我有一個vb.net項目中有一個更新函數,其中我通過保存按鈕單擊方法將值傳遞給數據庫SQL函數。這個查詢有什麼問題?我提供了所有參數的值

在我正在更新的數據庫表中,有10個字段。正如您在下面的查詢中看到的,我提供了10個值,每個字段一個值。

然而,儘管如此,當它擊中行Dc.ExecuteNonQuery(),它輸出錯誤

沒有爲一個或多個必需參數

給定值

我不能工作了,爲什麼 - 任何人可以其他?

Public Shared Function UpdateFreight(ByVal OrderNumber As Integer, _ 
            ByVal OrderRef As String, _ 
            ByVal FreightNum As Integer, _ 
            ByVal FreightVal As Double, _ 
            ByVal FreightDesc As String, _ 
            ByVal ProductCode As String, _ 
            ByVal EstDelivery As DateTime, _ 
            ByVal SCode As String, _ 
            ByVal CCode As String, _ 
            ByVal AddressCode As String, _ 
            con As OleDbConnection) 

    Try 
     Dim Dc As New OleDbCommand 
     Dc.Connection = con 

     Dc = New OleDb.OleDbCommand("UPDATE [Order_Freight] SET [Order_Number] = ?, _ 
              [Order_Reference] = ?, _ 
              [Freight_Number] = ?, [Freight_Val] = ?, _ 
              [Freight_Desc] = ?, [Product_Code] = ?,_ 
              [Est_Delivery] = ?, [Supplier_Code] = ?, _ 
              [Customer_Code] = ?, [Address_Code] = ? _ 
              WHERE [OrderNumber] = ?", con) 

     Dc.Parameters.AddWithValue("@ono", OrderNumber) 
     Dc.Parameters.AddWithValue("@oref", OrderRef) 
     Dc.Parameters.AddWithValue("@fnum", FreightNum) 
     Dc.Parameters.AddWithValue("@fval", FreightVal) 
     Dc.Parameters.AddWithValue("@fdesc", FreightDesc) 
     Dc.Parameters.AddWithValue("@pcode", ProductCode) 
     Dc.Parameters.AddWithValue("@estd", EstDelivery) 
     Dc.Parameters.AddWithValue("@scode", SCode) 
     Dc.Parameters.AddWithValue("@ccode", CCode) 
     Dc.Parameters.AddWithValue("@acode", AddressCode) 
     Dc.Parameters.AddWithValue("@onum", OrderNumber) 

     Dc.ExecuteNonQuery() 

    Catch ex As Exception 
     errorLog(ex) 
     MsgBox("Failed to update data, refer to error log") 
     Throw 

    End Try 
End Function 

如果有幫助,這是那裏的函數被調用

database.UpdateFreight(OrderNumber, OrderRef, FNum, FreightVal, FreightDesc, PCode, EstDate, SCode, custCode, Address, con) 

,並澄清所有的參數都被給定的值

enter image description here

(此外,與代碼格式無關,爲了可讀性,我已經調整了格式離子,它看起來並不像這樣在VB)

+0

當您調試時,您可以在調用ExecuteNonQuery之前打開'Dc.Parameters'來查看所有參數的值?在那裏失蹤?任何無序? – Brad

+1

你的sql語句不需要命名參數嗎? 「set [Order_Number] =:ono」(或任何正確的訪問語法)?看過我們的代碼庫後,它看起來像將它們添加到參數集合中而不是@然後用冒號在sql中指定它們。 –

+0

這就是你的代碼的確切方式 - 即,你確定你沒有改變更多的格式嗎?我只問,因爲你正在初始化'Dc'兩次,這似乎有點奇怪。你的SQL字符串在這個問題上也有點奇怪 - 它有'_'延續字符,但是每一行都沒有終止,並且沒有連接'&'。 – Mark

回答

2

我認爲這個問題是因爲你有名不副實的

​​

通知SET [Order_Number] = ?WHERE [OrderNumber] = ?列。其中之一可能是不正確的,並被解釋爲未知列,因此Access將它視爲參數。修正您的訂單號碼欄上的拼寫是正確的。

+1

你應該被授予「鷹眼」徽章。 :) – Andre

+0

@Andre嘿嘿今天又回來了吧:) – Brad

+1

當然,多麼明顯!我不相信我沒有意識到,也沒有其他人在這裏爲此事......謝謝哈哈 – David

1

由於OleDb不支持命名參數,並期待在MSDN文檔爲OleDbCommand.Parameters,如果你在你的參數傳遞爲OleDbParameter對象,而不是它可能工作?例如 -

Dc = New OleDb.OleDbCommand("UPDATE [Order_Freight] SET [Order_Number] = ?, _ 
             [Order_Reference] = ?, _ 
             [Freight_Number] = ?, [Freight_Val] = ?, _ 
             [Freight_Desc] = ?, [Product_Code] = ?,_ 
             [Est_Delivery] = ?, [Supplier_Code] = ?, _ 
             [Customer_Code] = ?, [Address_Code] = ? _ 
             WHERE [OrderNumber] = ?", con) 

     Dc.Parameters.Add(New OleDbParameter("@ono", OrderNumber)) 
     Dc.Parameters.Add(New OleDbParameter("@oref", OrderRef)) 
     Dc.Parameters.Add(New OleDbParameter("@fnum", FreightNum)) 
     Dc.Parameters.Add(New OleDbParameter("@fval", FreightVal)) 
     Dc.Parameters.Add(New OleDbParameter("@fdesc", FreightDesc)) 
     Dc.Parameters.Add(New OleDbParameter("@pcode", ProductCode)) 
     Dc.Parameters.Add(New OleDbParameter("@estd", EstDelivery)) 
     Dc.Parameters.Add(New OleDbParameter("@scode", SCode)) 
     Dc.Parameters.Add(New OleDbParameter("@ccode", CCode)) 
     Dc.Parameters.Add(New OleDbParameter("@acode", AddressCode)) 
     Dc.Parameters.Add(New OleDbParameter("@onum", OrderNumber)) 

     Dc.ExecuteNonQuery() 
+0

嗨,感謝您的建議,這仍然給我同樣的問題, – David