作者fumizuki (蒙面加菲狮)
看板Visual_Basic
标题[VB6 ] ADODB
时间Sat Oct 5 22:22:43 2013
状况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
--
▃▅▇▆▄ ▆▂▃ `
逝去感情如何能留住,半点痴情遗留殊不易,██▅▇▄▃ ▇▃▂" .
█████████▃i ▁▄▇
更多凄凄惨惨的遭遇…………██▆▃ █▅▆▃ˍ▄*
◢ ▂█▄▇▅▂▌.
我不知道,王~八~蛋~~! ▂▆███ █▄▃ 。fumizuki。Check。
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 123.194.72.87
1F:推 MOONRAKER:exec()不错 :) 10/05 23:34
2F:推 horngsh:建议用ado.net来处理资料库。 10/27 19:02