关于vb.net:正确的代码但无法插入数据库

Proper code but can't insert to database

我有一个使用Access数据库的Visual Basic项目。我运行查询,但在数据库表上看不到任何新数据。我没有任何异常或错误。如图所示。
这是我的代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
    Dim ID As Integer = 2
    Dim TableNumber As Integer = 2
    Dim OrderDate As Date = Format(Now,"General Date")
    Dim TotalPrice As Double = 100.0
 Dim ConnectionString As String ="myconnectionstring"
    Dim con As New OleDb.OleDbConnection(ConnectionString)


    Try
        Dim InsertCMD As OleDb.OleDbCommand

        InsertCMD = New OleDb.OleDbCommand("INSERT INTO Orders([ID],[TableNumber],[OrderDate],[TotalPrice]) VALUES(@ID,@TableNumber,@OrderDate,@TotalPrice);", con)
        InsertCMD.Parameters.AddWithValue("@ID", ID)
        InsertCMD.Parameters.AddWithValue("@TableNumber", TableNumber)
        InsertCMD.Parameters.AddWithValue("@OrderDate", OrderDate)
        InsertCMD.Parameters.AddWithValue("@TotalPrice", TotalPrice)

        con.Open()
        InsertCMD.ExecuteNonQuery()
        MessageBox.Show("Successfully Added New Order",
                       "Success", MessageBoxButtons.OK, MessageBoxIcon.Information)
        con.Close()
    Catch ex As Exception
        'Something went wrong
        MessageBox.Show(ex.ToString)
    Finally
        'Success or not, make sure it's closed
        If con.State <> ConnectionState.Closed Then con.Close()
    End Try

出什么问题了?


将ConnectionString设置为String =" myconnectionstring"

我将ADO与Delphi一起使用ADO来连接到Access,所以也许有些不同,但是我想使用这样的连接字符串,您甚至可能都没有连接到数据库,更不用说更新它了。

con.Open()可能是一个函数,它将返回某种指示连接成功或失败的结果。 Open和ExecuteNonQuery命令的失败可能不会导致引发异常,在这种情况下,您的成功消息将显示是否建立连接。异常不是唯一的错误类型。通常,如果函数返回指示成功或失败的结果,则应在条件语句中查询该结果以确定是否处理或显示错误消息。将大量的代码package在异常处理程序中是懒惰的,并且在许多情况下没有用。


正在发生以下两种情况之一:要么数据没有被更新,要么数据正在被更新,之后您寻找它时就会丢失它。 ExecuteNonQuery通常返回作用的行数。如果为零,则可能会毫无例外地失败。这可能与重复的ID有关。

如果插入成功,则由于某种原因您将看不到新记录。也许您在错误的位置查找,或者由于某种原因该记录未在查询中出现。我不知道默认情况下具有"重复更新"的任何内容,但是如果Access拥有它,可能会导致问题。


我看到的唯一可能的问题是数据库中的ID字段是否为自动递增字段,否则它将正常工作。另外,我发现以下方法更简单

使用表适配器和数据集如下插入新数据

Me.OrdersTableadapter.insert(ID,tableNumber,orderDate,TotalPrice)
'注意:此方法的参数将按表列的顺序
Me.OrdersTableadapter.Fill(me.Dataset.Orderstableadapter)