Re: [VB6 ] ADODB

楼主: fumizuki (蒙面加菲狮)   2014-06-28 20:33:42
有些时候,之前说的方法仍然会有意外发生:
在SQL Server中发生错误的时候,程式不会引发错误,整个TSQL批次也没有完成
也就是说程式看起来一切正常,但实际上没有正确执行,执行结果也可能不正确
解决方法:
'Const adExecuteNoRecords = 128 'ASP 中自行定义常数
Call cn.Execute(CommandText, Options:=adExecuteNoRecords)

Call cn.Execute(CommandText, Options:=128)
'于 VB6 中
'设定引用项目 Microsoft ActiveX DataObject Library,即有adExecuteNoRecords常数
'于 ASP 中,必须自行定义常数,或者直接用 128 当做参数值
'此常数表示不要接收查询的结果集,也就表示不会获得 Recordset
※ 引述《fumizuki (蒙面加菲狮)》之铭言:
: 状况1:
: ADODB.Connection 无法执行批次命令。
: 执行的命令中,遇到下列陈述式即会暂停查询,
: select/insert/update/delete/use ...
: 当呼叫 Recordset.NextRecordset() 时才会继续执行。
: 但批次查询中可能会包含上述陈述式多个,
: 则 NextRecordset 就必须要呼叫多次才能一直执行到批次结束为止。
: 例如:
: Set rs = cn.Execute("INSERT INTO T1 VALUES(1); SELECT 1 / 0")
: 不会引发除以零的错误,因为执行到 INSERT 就暂停了
: Set rs = rs.NextRecordset()
: 当呼叫 NextRecordset(),就会继续执行,结果发生除以零的错误。
: 解决方法:
: CommandText = "'" & Replace(命令文字, "'", "''") & "'"
: CommandText = "EXEC(" & CommandText & ")"
: Set rs = cn.Execute(CommandText)
: 'EXEC 中指定的命令文字会被当成一整个批次执行
: '两个单引号为SQL Server中的跳脱字符,用来表示字串中的单引号
: 状况2:
: 如果有多个 ADODB.RecordSet 为 Open 的状态,
: 每一个 RecordSet 都会以 SQL CURSOR 的方式进行查询。
: (例如:sp_cursor、sp_execute...)
: 这表示每一次 RecordSet.MoveNext 之类的要求,都会向 SQL Server 要求资料,
: 跟SQL Server通讯的次数太多,效能也会比较差。
: 解决方法:
: 记得 RecordSet 用完立即关闭,再继续执行下一个批次命令。
: 范例1:
: Set rs1 = cn.Execute(命令1)
: Do While Not rs1.EOF
: 'do something
: rs1.MoveNext
: Loop
: rs1.Close
: Set rs2 = cn.Execute(命令2)
: Do While Not rs2.EOF
: 'do something
: rs2.MoveNext
: Loop
: rs2.Close
: 范例2:
: Set rs1 = cn.Execute(命令1)
: If Not rs1.EOF Then HasData1 = True: aryData1 = rs1.GetRows()
: rs1.Close
: Set rs2 = cn.Execute(命令2)
: If Not rs2.EOF Then HasData2 = True: aryData2 = rs2.GetRows()
: rs2.Close
: result = ""
: For i = RowIndex To UBound(aryData1, 2)
: For ColIndex = 0 To UBound(aryData1, 1)
: If ColIndex > 0 Then result = result & ","
: result = result & aryData1(ColIndex, RowIndex)
: Next
: result = result & vbCrLf
: Next

Links booklink

Contact Us: admin [ a t ] ucptt.com