例如
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() '没问题!
事务,是记录开始和结束点的快照状态。如果中途的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
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
在事务过程里,如果你对表A进行cmd操作,然后还用SQLGroupTableBuilder、SQLCrossTableBuilder对表A进行查询,这时候会因为表锁住了,会出现查询超时
cmd的事务和这些查询工具,不是同一个过程,上锁后不能互相入侵
所以你要手写cmd group语句达到你的目标,而不能偷懒依赖狐表工具。
当然,如果你查询的是表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语句的后面,作为分组的依据;要么就要被包含在聚合函数中