无法通过VB.NET查看或插入MS Access oledb

时间:2013-09-25 11:25:54

标签: vb.net ms-access

我试图将值插入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

2 个答案:

答案 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的可能错误。