2014-04-20 158 views
0

我試圖更新使用SQL查詢的Access數據庫,每當我點擊保存按鈕,它會產生一個錯誤錯誤的.ExecuteNonQuery()在SQL更新查詢

類型的未處理的異常「 System.Data.OleDb.OleDbException'發生在System.Data.dll中

附加信息:沒有給出一個或多個所需參數的值。

並突出顯示.ExecuteNonQuery()。你們能幫我解決嗎?我是vb.net的新手。

在此先感謝。

Private Sub SaveButton_Click(sender As Object, e As EventArgs) Handles SaveButton.Click 
     Dim empNum As String 
     Dim empFname As String 
     Dim empLname As String 
     Dim empDept As String 
     Dim empStat As String 
     Dim empYears As String 



     empNum = eNumText.Text 
     empFname = empFnameText.Text 
     empLname = empLnameText.Text 
     empDept = DeptText.Text 
     empStat = StatText.Text 
     empYears = yearstext.Text 

     con.ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0; Data Source= c:\Databse\Company_db.accdb" 
     con.Open() 

     MsgBox(empNum) 


     Dim SqlAdapter As New OleDbDataAdapter 
     Dim Table As New DataTable 

     Dim sqlQuery As String = "UPDATE tbl_empinfo SET EmpID='" & empNum & "', FirstName ='" & empFname & "', LastName='" & empLname & "', Department='" & empDept & "', Status='" & empStat & "', Years='" & empYears & "' WHERE EmpID ='" & empNum & "' " 


     Using cmd As New OleDbCommand(sqlQuery, con) 
      With cmd 
       .CommandText = sqlQuery 
       .Connection = con 
       .Parameters.AddWithValue("EmpID", empNum) 
       .Parameters.AddWithValue("FirstName", empFname) 
       .Parameters.AddWithValue("LastName", empLname) 
       .Parameters.AddWithValue("Department", empDept) 
       .Parameters.AddWithValue("Status", empStat) 
       .Parameters.AddWithValue("Years", empYears) 
       .ExecuteNonQuery() 
      End With 
     End Using 

     sqlQuery = "SELECT * FROM tbl_empinfo " 
     Dim cmd1 As New OleDbCommand 
     Dim da As New OleDbDataAdapter 


     With cmd1 
      .CommandText = sqlQuery 
      .Connection = con 
      With SqlAdapter 
       .SelectCommand = cmd1 
       .Fill(Table) 
      End With 
      With DataGridView1 
       .DataSource = Table 
      End With 
     End With 

     con.Close() 
    End Sub 

回答

2

您的查詢語法錯誤。由於您使用的參數,可以使用佔位符在SQL:(問號是不是有些「等」類型的東西,你用?標記參數!):

Dim sqlQuery As String = "UPDATE tbl_empinfo SET FirstName = ?, 
      LastName=?, Department=?, 
      Status=?, Years=? WHERE empID = ?" 

注:六個參數

' USING will dispose of the cmd when it is done with it 
' ...can also set the SQL and connection props in the constructor: 
Using cmd As New OleDbCommand(sqlQuery, con) 
    With cmd 
     ' no reason to move Textboxes to a variable either: 
     .Parameters.AddWithValue("@p1", empFnameText.Text) 
     .Parameters.AddWithValue("@p2", empLnameText.Text) 
     .Parameters.AddWithValue("@p3", DeptText.Text) 
     .Parameters.AddWithValue("@p4", StatText.Text) 
     .Parameters.AddWithValue("@p5", yearstext.Text) 

丟失的6個參數:

 .Parameters.AddWithValue("@p6", eNumText.Text)   
     .ExecuteNonQuery() 
    End With 
End Using 

我不認爲訪問支持命名參數,可以讓你在指定的順序使用啞的人,但一定要AddWithValue SQL字符串。

編輯

您只需創建嵌入,而不是使用PARAMS是你的SQL字符串做什麼樣值的SQL字符串。 Params更好(研究SQL注入攻擊),但是你的字符串方法是錯誤的(你不能混合方法)。它應該是:

Dim sqlQuery As String = "UPDATE tbl_empinfo " & 
     "SET FirstName = " & empFname & ", LastName=" & empLname 

的變量必須在引號外面,否則你會被設置FirstName字面「empFname」

+0

我仍然得到這個埃羅「型System.Data的」未處理的異常。在System.Data.dll中發生OleDb.OleDbException' 其他信息:沒有給出一個或多個必需參數的值。「 highlight.ExecuteNonQuery():( – user3550659

+0

確保SQL中的參數數量與AddWithValue語句的數量相匹配,並且順序是正確的。如果其中一個文本框爲空,請確保數據庫允許在該列上有空值。 '沒有爲一個或多個必需的參數給出值'意味着它說什麼,你指定了沒有設置參數值的SQL。 – Plutonix

+0

我檢查它是正確的,是我的SQL語句正確使用VB.NET和Access Dim sqlQuery As String = 「UPDATE tbl_empinfo」&_ 「SET FirstName = empFname,LastName = empLname,Department = empDept,」&_ 「Status = empStat,Years = empYears」&_ 「WHERE EmpID = empNum」也許它的編碼方式不同, Amper Sign Accepted? – user3550659