Vb.net 如何通过两次查询在access中添加一条记录的数据?

Vb.net 如何通过两次查询在access中添加一条记录的数据?,vb.net,ms-access,if-statement,Vb.net,Ms Access,If Statement,当我在组合框中为“付款方式”值选择“货到付款”并单击按钮时,ordersql查询命令将使用其参数成功执行,但if条件的第一组代码在cmd2.ExecuteOnQuery()行显示错误“查询输入必须至少包含一个表或查询” 当我选择“信用卡/借记卡”时,无论我点击按钮多少次,都不会发生任何事情 有谁能告诉我如何使用一个简单的代码通过两个查询添加一条记录的数据吗?您可以一次性插入所有数据。不要根据某个对象的值添加参数,而是根据该对象添加参数并设置其值 像这样: Dim todaydate As Str

当我在组合框中为“付款方式”值选择“货到付款”并单击按钮时,ordersql查询命令将使用其参数成功执行,但if条件的第一组代码在cmd2.ExecuteOnQuery()行显示错误“查询输入必须至少包含一个表或查询”

当我选择“信用卡/借记卡”时,无论我点击按钮多少次,都不会发生任何事情


有谁能告诉我如何使用一个简单的代码通过两个查询添加一条记录的数据吗?

您可以一次性插入所有数据。不要根据某个对象的值添加参数,而是根据该对象添加参数并设置其值

像这样:

Dim todaydate As String = String.Format("{0:dd/MM/yyyy}", DateTime.Now)
        Dim expdate As String = String.Format("{0:dd/MM/yyyy}", dtpexpdate.Value)
        Dim ordersql As String
        ordersql = "Insert into SalesTable([BookID],[Username],[Phone No],[Address],[Payment method],[SaleDate]) Values(?,?,?,?,?,?)"
        conn.Open()
        Dim cmd As New OleDbCommand(ordersql, conn)
        cmd.Parameters.AddWithValue("@BookID", lbid.Text)
        cmd.Parameters.AddWithValue("@Username", txtusernm.Text)
        cmd.Parameters.AddWithValue("@Phone No", txtphone.Text)
        cmd.Parameters.AddWithValue("@Address", txtaddr.Text)
        cmd.Parameters.AddWithValue("@Payment method", cbpaymeth.Text)
        cmd.Parameters.AddWithValue("@SaleDate", todaydate)
        cmd.ExecuteNonQuery()
        MsgBox("1st Done!")

        Dim order2sql As String
        order2sql = "Insert into SalesTable([Payment status],[Card No],[Expiry Date]) Values(?,?,?) Where BookID='" & lbid.Text & "'AND Username='" & txtusernm.Text & "'"

        If cbpaymeth.Text Like "Cash-on-Delivery" Then
            Dim cmd2 As New OleDbCommand(order2sql, conn)
            cmd2.Parameters.AddWithValue("@Payment status", False)
            cmd2.Parameters.AddWithValue("@Card No", 0)
            cmd2.Parameters.AddWithValue("@Expiry Date", "")
            cmd2.ExecuteNonQuery()
            MsgBox("2nd Do-o-one")
        Else
            Dim cmd2 As New OleDbCommand(order2sql, conn)
            cmd2.Parameters.AddWithValue("@Payment status", True)
            cmd2.Parameters.AddWithValue("@Card No", txtcardno.Text)
            cmd2.Parameters.AddWithValue("@Expiry Date", expdate)
            cmd2.ExecuteNonQuery()
            MsgBox("2nd Done")
        End If

        Dim quansql As String
        quansql = "Update BooksTable Set Quantity = Quantity-1 Where [BookID]= '" & lbid.Text & "'"
        Dim cm As New OleDbCommand(quansql, conn)
        cm.ExecuteNonQuery()
        conn.Close()
        MsgBox("Your Order has been Placed", vbExclamation)
您需要更改每个
.OleDbType
.Size
的值,以匹配数据库中的声明-我刚刚猜到了


您可能不想存储信用卡信息,因为存储信用卡信息会让您在出现问题时承担大量费用。

您在
INSERT
语句中没有
WHERE
子句。
WHERE
子句的作用是过滤现有行,以确定对哪些行进行操作。
INSERT
语句不能对现有行进行操作,因此
WHERE
子句如何解释?你真的想更新你刚才插入的记录吗?@jmcilhinney。这是正确的。我想更新刚刚插入的记录。但是我在第二个insert命令中有一个Where子句,它指定了第一个insert命令插入的两个唯一字段
order2sql=“插入SalesTable([付款状态]、[卡号]、[到期日])值(?,,?),其中BookID='”、&lbid.Text&'、Username='”、&txtusernm.Text&'”
此外,永远不要将日期作为文本处理,始终作为日期时间处理。@Gustav。尽管我在access中将日期的数据类型作为DateTime,并将表单中的值作为日期返回,但我始终收到数据类型不匹配错误。所以我用绳子来约会。那是不可能的,这是一条死胡同。它甚至可能引起严重的麻烦。浏览如何插入日期时间值。“您可能不想存储信用卡信息,因为存储信用卡信息会让您在出错时承担大量费用。”那么,如果我在账单中不包括卡号和到期日期,可以吗?这将为我节省很多麻烦。如果它使用某种第三方支付系统,存储交易参考可能会很有用,但是是的,尽量避免存储抄送信息。我尝试了使用信用卡信息的解决方案。这是同样的问题。货到付款可以,但当我点击按钮时,信用卡/借记卡不起作用。ETA:每当我选择信用卡/借记卡选项时,代码似乎在某个地方中断。如果
cbpaymeth
是一个复选框,那么它应该是
if cbpaymeth.Checked then
而不是检查它的.Text属性。@halfer。我会注意的。谢谢
Dim todaydate As DateTime = DateTime.UtcNow
Dim expdate As DateTime = dtpexpdate.Value

Dim ordersql As String = "INSERT INTO SalesTable([BookID], [Username], [Phone No], [Address], [Payment method], [SaleDate], [Payment status], [Card No], [Expiry Date]) VALUES(?, ?, ?, ?, ?, ?, ?, ?, ?)"

Using conn As New OleDbConnection("your connection string"),
        cmd As New OleDbCommand(ordersql, conn)

    cmd.Parameters.Add(New OleDbParameter With {.ParameterName = "@BookID", .OleDbType = OleDbType.VarWChar, .Size = 99, .Value = lbid.Text})
    cmd.Parameters.Add(New OleDbParameter With {.ParameterName = "@Username", .OleDbType = OleDbType.VarWChar, .Size = 255, .Value = txtusernm.Text})
    cmd.Parameters.Add(New OleDbParameter With {.ParameterName = "@Phone No", .OleDbType = OleDbType.VarChar, .Size = 24, .Value = txtphone.Text})
    cmd.Parameters.Add(New OleDbParameter With {.ParameterName = "@Address", .OleDbType = OleDbType.VarChar, .Size = 24, .Value = txtaddr.Text})
    cmd.Parameters.Add(New OleDbParameter With {.ParameterName = "@Payment method", .OleDbType = OleDbType.VarChar, .Size = 24, .Value = cbpaymeth.Text})
    cmd.Parameters.Add(New OleDbParameter With {.ParameterName = "@SaleDate", .OleDbType = OleDbType.Date, .Value = todaydate})

    cmd.Parameters.Add(New OleDbParameter With {.ParameterName = "@Payment status", .OleDbType = OleDbType.Boolean})
    cmd.Parameters.Add(New OleDbParameter With {.ParameterName = "@Card No", .OleDbType = OleDbType.VarChar, .Size = 16})
    cmd.Parameters.Add(New OleDbParameter With {.ParameterName = "@Expiry Date", .OleDbType = OleDbType.Date})

    If cbpaymeth.Text.Equals("Cash-on-Delivery", StringComparison.InvariantCultureIgnoreCase) Then
        cmd.Parameters("@Payment status").Value = False
        cmd.Parameters("@Payment status").Value = DBNull.Value
        cmd.Parameters("@Expiry Date").Value = DBNull.Value
    Else
        cmd.Parameters("@Payment status").Value = True
        cmd.Parameters("@Payment status").Value = txtcardno.Text
        cmd.Parameters("@Expiry Date").Value = expdate
    End If

    cmd.ExecuteNonQuery()

    MsgBox("1st Done!")

End Using

Dim quansql As String = "UPDATE BooksTable SET [Quantity] = [Quantity] - 1 WHERE [BookID] = ?"

Using conn As New OleDbConnection("your connection string"),
        cmd As New OleDbCommand(quansql, conn)

    cmd.Parameters.Add(New OleDbParameter With {.ParameterName = "@BookID", .OleDbType = OleDbType.VarWChar, .Size = 48, .Value = lbid.Text})

    cmd.ExecuteNonQuery()

End Using

MessageBox.Show("Your order has been placed", "Success", MessageBoxButtons.OK, MessageBoxIcon.Information)