我试图将值插入MS ACCESS数据库,但我无法向ACCESS插入任何数据。我将CustomerID作为自动增量的主键。运行代码后,它总是给我 总客户0 *请帮我弄清楚这里出了什么问题!
这是我的代码
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 :(得分:0)
MSAccess中没有LAST_INSERT_ID功能。尝试改为
"SELECT @@IDENTITY"
说,我强烈建议你改变你的原始命令来使用参数化查询。它始终是一种安全的数据库命令方法,因为您不必担心正确引用字符串,数字和日期,但最重要的是,您避免使用Sql Injection
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)
答案 1 :(得分: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的可能错误。