Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vb.net/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vb.net 如何一次执行四个查询,然后检查成功或失败?_Vb.net_Windows_Visual Studio 2010_Ms Access - Fatal编程技术网

Vb.net 如何一次执行四个查询,然后检查成功或失败?

Vb.net 如何一次执行四个查询,然后检查成功或失败?,vb.net,windows,visual-studio-2010,ms-access,Vb.net,Windows,Visual Studio 2010,Ms Access,我需要执行四个查询,如果成功,则必须返回true,否则返回false 查询会影响数据库,但函数返回false Private Function save_to_data() Dim success As Boolean = False Dim conn As OleDbConnection = GetDbConnection() Dim total_due As Decimal = sanitize(txt_total_due.Text) Dim amount

我需要执行四个查询,如果成功,则必须返回true,否则返回false

查询会影响数据库,但函数返回false

Private Function save_to_data()
    Dim success As Boolean = False

    Dim conn As OleDbConnection = GetDbConnection()

    Dim total_due As Decimal = sanitize(txt_total_due.Text)
    Dim amount_paid As Decimal = sanitize(txt_due.Text)
    Dim discount As Decimal = sanitize(txt_discount.Text)
    Dim balance As Decimal = sanitize(txt_balance.Text)

    Dim cmdfoods As New OleDbCommand("UPDATE foods SET status='billed' WHERE customer_id = " & lbl_id.Text & "", conn)
    Dim cmdservices As New OleDbCommand("UPDATE services SET status =  'billed' WHERE customer_id = " & lbl_id.Text & "", conn)
    Dim cmdreservations As New OleDbCommand("UPDATE reservations SET nights = 4 WHERE customerid = " & lbl_id.Text & "", conn)

    Dim bill As New OleDbCommand("INSERT INTO bills(customer_id, accomendation, food, service, total_due, amount_paid, discount, balance, transaction_date) VALUES " & _
                            "(" & lbl_id.Text & ", " & accomendation_total & ", " & food_total & ", " & service_total & ", " & total_due & ", " & amount_paid & " " & _
                            ", " & discount & ", " & balance & ", '" & Date.Now & "')", conn)


    conn.Open()
    If cmdfoods.ExecuteNonQuery And cmdservices.ExecuteNonQuery And cmdreservations.ExecuteNonQuery And bill.ExecuteNonQuery Then

        success = True
    Else
        success = False

    End If
        conn.Close()


    Return success

End Function

ExecuteOnQuery不返回布尔值,而是表示受insert/delete/update语句影响的行的整数

If cmdfoods.ExecuteNonQuery() > 0 AndAlso cmdservices.ExecuteNonQuery() > 0 AndAlso cmdreservations.ExecuteNonQuery() > 0 AndAlso bill.ExecuteNonQuery() > 0 Then
    success = True
Else
    success = False
End If

请参阅:

ExecuteOnQuery不返回布尔值,而是一个整数,表示受insert/delete/update语句影响的行

If cmdfoods.ExecuteNonQuery() > 0 AndAlso cmdservices.ExecuteNonQuery() > 0 AndAlso cmdreservations.ExecuteNonQuery() > 0 AndAlso bill.ExecuteNonQuery() > 0 Then
    success = True
Else
    success = False
End If

请参阅:

代码sql注入存在许多其他问题,在多个命令之间共享连接,但这里有一个正确的步骤:

Try    
    conn.Open()
    cmdfoods.ExecuteNonQuery()
    cmdservices.ExecuteNonQuery()
    cmdreservations.ExecuteNonQuery()
    bill.ExecuteNonQuery()
    success = True
Catch
    success = False
Finally
    conn.Close()
End Try
更完整的解决方案:

私有函数将\u保存到\u数据 Dim sql作为字符串=_ 更新食品设置状态='billed',其中客户id=?;&_ 更新服务集状态='billed',其中客户id=?;& 更新预订设置夜数=4,其中customerid=; 插入票据和_ 客户id、住宿、食品、服务、应付总额、支付金额、折扣、余额、交易日期和 价值观 将conn用作OleDbConnection=GetDbConnection_ cmd作为新的OleDbCommandsql,康涅狄格州 cmd.Parameters.Addfood\u customer\u id,OleDbType.Integer.Value=lbl\u id.Text cmd.Parameters.Addserv\u customer\u id,OleDbType.Integer.Value=lbl\u id.Text cmd.Parameters.Addres\u customer\u id,OleDbType.Integer.Value=lbl\u id.Text cmd.Parameters.Addbill\u customer\u id,OleDbType.Integer.Value=lbl\u id.Text cmd.Parameters.addAccomendation,OleDbType.VarChar.Value=accomendation\u总计 cmd.Parameters.Addfood\u total,OleDbType.Decimal.Value=food\u total cmd.Parameters.Addservice\u总计,OleDbType.Decimal.Value=service\u总计 cmd.Parameters.Addtotal\u到期日,OleDbType.Decimal.Value=total\u到期日 cmd.Parameters.Addamount\u paid,OleDbType.Decimal.Value=金额\u paid cmd.Parameters.Adddiscount,OleDbType.Decimal.Value=折扣 cmd.Parameters.Addbalance,OleDbType.Decimal.Value=balance cmd.Parameters.Addtransaction_date,OleDbType.date.Value=date.Now 康涅狄格州公开赛 返回cmd.ExecuteNonQuery>0 终端使用 端函数
代码sql注入还存在许多其他问题,在多个命令之间共享连接,但这里有一个正确的步骤:

Try    
    conn.Open()
    cmdfoods.ExecuteNonQuery()
    cmdservices.ExecuteNonQuery()
    cmdreservations.ExecuteNonQuery()
    bill.ExecuteNonQuery()
    success = True
Catch
    success = False
Finally
    conn.Close()
End Try
更完整的解决方案:

私有函数将\u保存到\u数据 Dim sql作为字符串=_ 更新食品设置状态='billed',其中客户id=?;&_ 更新服务集状态='billed',其中客户id=?;& 更新预订设置夜数=4,其中customerid=; 插入票据和_ 客户id、住宿、食品、服务、应付总额、支付金额、折扣、余额、交易日期和 价值观 将conn用作OleDbConnection=GetDbConnection_ cmd作为新的OleDbCommandsql,康涅狄格州 cmd.Parameters.Addfood\u customer\u id,OleDbType.Integer.Value=lbl\u id.Text cmd.Parameters.Addserv\u customer\u id,OleDbType.Integer.Value=lbl\u id.Text cmd.Parameters.Addres\u customer\u id,OleDbType.Integer.Value=lbl\u id.Text cmd.Parameters.Addbill\u customer\u id,OleDbType.Integer.Value=lbl\u id.Text cmd.Parameters.addAccomendation,OleDbType.VarChar.Value=accomendation\u总计 cmd.Parameters.Addfood\u total,OleDbType.Decimal.Value=food\u total cmd.Parameters.Addservice\u总计,OleDbType.Decimal.Value=service\u总计 cmd.Parameters.Addtotal\u到期日,OleDbType.Decimal.Value=total\u到期日 cmd.Parameters.Addamount\u paid,OleDbType.Decimal.Value=金额\u paid cmd.Parameters.Adddiscount,OleDbType.Decimal.Value=折扣 cmd.Parameters.Addbalance,OleDbType.Decimal.Value=balance cmd.Parameters.Addtransaction_date,OleDbType.date.Value=date.Now 康涅狄格州公开赛 返回cmd.ExecuteNonQuery>0 终端使用 端函数
打开连接后,将和更改为AndAlso。。。还可以在每个ExecuteOnQuery之后添加>0,因为此方法返回受影响的行数。。。计算条件的方法行不通,因为ExecuteOnQuery不返回布尔值。如果数据库支持存储过程,最好将所有四个查询放在一个中。特别是当您需要回滚时。MS Access 2007是否支持存储过程,我正在使用扩展名为.accdb的MS Access文件此处的代码容易受到sql注入攻击。@saedawke没有用于访问的存储过程对不起…请在打开连接后将和改为AndAlso。。。还可以在每个ExecuteOnQuery之后添加>0,因为此方法返回受影响的行数。。。计算条件的方法行不通,因为ExecuteOnQuery不返回布尔值。如果数据库支持存储过程,最好将所有四个查询放在一个中。特皮西亚
lly如果您需要回滚。MS Access 2007是否支持存储过程,我将使用扩展名为.accdb的MS Access文件。此处的代码易受sql注入攻击。@saedawke没有用于访问的存储过程抱歉…没有。除非我在搜索额外的信息,否则我不会阅读评论。我看看我是否能回答这个问题,也看看是否有人已经回答了。不知道这是否值得投反对票,但每个人都有自己的选择。除非我在搜索额外的信息,否则我不会阅读评论。我看看我是否能回答这个问题,也看看是否有人已经回答了。我不知道这是否值得投反对票,但对每个人来说都是自己的。我试图投赞成票,但我必须有更多的声誉。@Joel Coehoorn-如果它不更新一行,会不会引发一个例外?我的印象是,只有出现问题时才会出现异常。因为不符合标准而不更新行不是问题,对吗?尝试投票,但我必须有更多的声誉。@Joel Coehoorn-如果不更新行会引发异常吗?我的印象是,只有出现问题时才会出现异常。因为不符合条件而不更新行不是问题,对吗?