2013-09-25 56 views
0

我試圖向MS ACCESS DB插入值,但無法將任何數據插入到ACCESS中。我有CustomerID作爲主鍵與自動增量。運行代碼後,它總是給我總客戶0 *請幫我弄清楚這裏出了什麼問題!無法通過VB.NET查看或插入MS Access oledb

這是我的代碼

Public Const settings As String = "Provider=Microsoft.ACE.OLEDB.12.0;" + 
            "Data Source=Provider=Microsoft.ACE.OLEDB.12.0;" + 
            "Data Source=C:\Users\sha\Documents\Visual Studio 2010\Projects\Assign2_24\Assign2_24\db24.accdb;" 

Dim vConnStr As New OleDbConnection(settings) 

If vboo = "" Then 

     Try 
      vConnStr.Open() 
      Dim vSQL As String = "Insert into Customer " 
      vSQL = vSQL & " (FirstName, LastName, Telephone, Email)" 
      vSQL = vSQL & " Values (?, ?, ?, ?)" 
      Dim cmd As New Data.OleDb.OleDbCommand(vSQL, vConnStr) 
      cmd.Parameters.AddWithValue("@p1", cusFName) 
      cmd.Parameters.AddWithValue("@p2", cusLName) 
      cmd.Parameters.AddWithValue("@p3", cusTP) 
      cmd.Parameters.AddWithValue("@p4", cusEmail) 


      Dim vRowsUpdated As Integer = cmd.ExecuteNonQuery 
      MessageBox.Show("Successfully saved to the system" & vRowsUpdated) 


      '*************************************** Retrieve the CusID that have inserted ******************************* 

      Dim vSQL2 As String = "SELECT @@IDENTITY" 
      Dim cmd2 As New Data.OleDb.OleDbCommand(vSQL2, vConnStr) 

      Dim vCusId As Integer = CInt(cmd2.ExecuteScalar()) 
      MessageBox.Show("*** ID: " & vCusId) 

      'Dim vCusId As Integer = CInt(cmd2.ExecuteScalar()) 
      'MessageBox.Show("*** ID: " & vCusId) 

      Dim vSQL3 As String = "Select count (*) from Customer" 
      Dim cmd3 As New Data.OleDb.OleDbCommand 
      cmd3.CommandText = vSQL3 

      Dim vCount3 As Integer = cmd.ExecuteScalar() 
      MessageBox.Show("***** Total Customers " & vCount3) 



     Catch ex As Data.Odbc.OdbcException 

      Dim vErMsg As String = " *** Error occured while registering the customer ***" 
      vErMsg = vErMsg & ex.ErrorCode & "***" & ex.Message & "***" 


     Finally 
      vConnStr.Close() 
     End Try 

回答

0

有一個在MSACCESS沒有LAST_INSERT_ID功能。嘗試改爲

"SELECT @@IDENTITY" 

說,我強烈建議改變你原來的命令使用參數化查詢。它總是一種安全的方法,以數據庫命令,因爲你不必擔心正確地引用你的字符串,數字和日期,但是,最重要的是,您避免SQL注入

Dim vSQL As String = "Insert into Customer " 
vSQL = vSQL & " (FirstName, LastName, Telephone, Email)" 
vSQL = vSQL & " Values (?, ?, ?, ?)" 
Dim cmd As New Data.OleDb.OleDbCommand(vSQL, vConnStr) 
cmd.Parameters.AddWithValue("@p1", cusFName) 
cmd.Parameters.AddWithValue("@p2", cusLName) 
cmd.Parameters.AddWithValue("@p3", cusTP) 
cmd.Parameters.AddWithValue("@p4", cusEmail) 

補充說明。您正在捕獲ODBC異常,但您的代碼使用OleDb。 (剩餘從以前的版本?)

GOT IT

該行執行的第一個查詢,而不是第二個

Dim cmd2 As New Data.OleDb.OleDbCommand(vSQL2, vConnStr) 
              ^

,最後用CMD3實例來計算客戶

Dim vCount3 As Integer = cmd3.ExecuteScalar() 
MessageBox.Show("***** Total Customers " & vCount3) 
+0

感謝您指出這一點! ( –

+0

)你的第二個查詢中有一個輸入錯誤,你再次傳遞第一個sql而不是'SELECT @@ IDENTITY' – Steve

+0

嗨Steve感謝你現在拿起vCusId部分工作;)但是主要問題是它不會存儲在我的數據庫中!當我運行Dim vCusId作爲Integer = CInt(cmd2.ExecuteScalar()) MessageBox.Show(「***** Total Customers」&vCusId)它拋出我*****總共客戶0和沒有什麼是在數據庫 –

0

看看這篇文章,autoincremented-value,顯然它在2000年或更大的作品不同。

另外,我認爲你有你的變量的問題。你用cmd使用vSQL,但你也可以用cmd2使用vSQL。所以,當你做你的CInt(cmd2.ExecuteScalar()),你實際上是再次運行你的插入。嘗試一起分組你的東西,所以很容易跟隨,就像這樣:

Dim vSQL As String = " Insert into Customer " 
vSQL = vSQL & " (FirstName, LastName, Telephone, Email)" 
vSQL = vSQL & " Values (" 
vSQL = vSQL & "'" & cusFName & "'" 
vSQL = vSQL & "," & "'" & cusLName & "'" 
vSQL = vSQL & "," & cusTP 
vSQL = vSQL & "," & "'" & cusEmail & "'" 
vSQL = vSQL & ");" 

Dim cmd As New Data.OleDb.OleDbCommand(vSQL, vConnStr) 
Dim vRowsUpdated As Integer = cmd.ExecuteNonQuery 
MessageBox.Show("Successfully saved to the system" & vRowsUpdated) 

Dim vSQL2 As String = "SELECT LAST_INSERT_ID()" 
Dim cmd2 As New Data.OleDb.OleDbCommand(vSQL2, vConnStr) 
Dim vCusId As Integer = CInt(cmd2.ExecuteScalar()) 
MessageBox.Show("*** ID: " & vCusId) 

這將有助於使你不能使用vSQL2或CMD2宣告發放和拆卸可能出現的錯誤的1/2了。

+0

您好史蒂夫感謝您帶來了現在我得到的vCusId部分工作;)但主要問題是它不存儲在我的數據庫!當我運行Dim vCusId作爲Integer = CInt(cmd2.ExecuteScalar()) MessageBox.Show(「***** Total Customers」&vCusId)它拋出我*****總共客戶0和沒有什麼是在數據庫 –

+0

假設你做了這些評論和答案中提到的所有事情,我認爲你錯過了訪問所需的冒號。你有'vSQL = vSQL&「值(?,?,?,?)」'但它應該是'vSQL = vSQL&「值(?,?,?,?); – Steve