关于狐表SqlCommand的生命次数与事务原理

发表日期: 2021-10-22

1一个SqlCommand,无生命次数,无限用

例如

Dim cmd As New SQLCommand
cmd.CommandText = "Select Sum(数量) From {订单} Where 日期 > #2012/2/21#"
val  = cmd.ExecuteScalar()
cmd.CommandText = "Select Sum(数量) From {订单} Where 日期 > #2009/2/21#"
val  = cmd.ExecuteScalar() '没问题!

2如果使用事务,也是无限次提交

事务,是记录开始和结束点的快照状态。如果中途的sql语句出错,就回滚,与过程的Sql语句顺序无关

哪怕你写错一个select语句,也会触发回滚

Dim cmd As new SQLCommand
cmd.ConnectionName = "DB" //指定数据源
Try
    cmd.CommandText = "Delete From {订单} Where [订单编号] = 32"
    cmd.ExecuteNonQuery
    cmd.CommandText = "Delete From {订单明细} Where [订单编号] = 32"
    cmd.ExecuteNonQuery
    cmd.Commit() //提交事务
Catch ex As Exception  //如果出错 
    cmd.Rollback() //则回滚事务
End Try

3注意多条语句参数化连用时,要清空参数!!

cmd.Parameters.Clear `清空参数

Dim cmd As new SQLCommand
cmd.ConnectionName = "数据源名称"
cmd.CommandText = "Insert Into 订单 (客户, 日期, 订单编号) Values(?,?,?)"
cmd.Parameters.Add("@客户","01")
cmd.Parameters.Add("@日期",Date.Today)
cmd.Parameters.Add("@订单编号",100)
cmd.ExecuteNonQuery
cmd.CommandText = "Insert Into 订单 (客户, 日期, 订单编号) Values(?,?,?)"
cmd.Parameters.Clear //你不清空的话,它会把上面的也继续用!
cmd.Parameters.Add("@客户","01")
cmd.Parameters.Add("@日期",Date.Today)
cmd.Parameters.Add("@订单编号",100)
cmd.ExecuteNonQuery

4使用事务过程,谨慎与狐表SQLGroup/CrossTable工具混用

  1. 在事务过程里,如果你对表A进行cmd操作,然后还用SQLGroupTableBuilder、SQLCrossTableBuilder对表A进行查询,这时候会因为表锁住了,会出现查询超时

  2. cmd的事务和这些查询工具,不是同一个过程,上锁后不能互相入侵

  3. 所以你要手写cmd group语句达到你的目标,而不能偷懒依赖狐表工具。

  4. 当然,如果你查询的是表B,由于表B没有上锁,所以是不会出现超时问题的

'...事务开始和前面那些cmd
cmd.CommandText="Select StoreID,Sum(Qty) As Qty,Sum(SendQty) As SendQty From CDOrderDetail Where CDOrderID =? Group By StoreID Order by StoreID"
cmd.Parameters.Clear
cmd.Parameters.Add("@CDOrderID",jt("CDOrderID").ToString)
Dim dt3 As DataTable = cmd.ExecuteReader
'...后面那些cmd和事务结束

附加group by 聚合知识:在select指定的字段要么就要包含在Group By语句的后面,作为分组的依据;要么就要被包含在聚合函数中



随便看看
商务联系QQ : 2385350359

Copyright 2016-2023 江门蓬江区华越科技公司 版权所有 | 承接软件定制开发,欢迎联系
粤ICP备19148806号-5