Vb.net 如何一次执行四个查询,然后检查成功或失败?
我需要执行四个查询,如果成功,则必须返回true,否则返回false 查询会影响数据库,但函数返回falseVb.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
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-如果不更新行会引发异常吗?我的印象是,只有出现问题时才会出现异常。因为不符合条件而不更新行不是问题,对吗?