VB 6.0 下經常用到 ADODB.Record ,用於獲取查詢結果(select查詢、存儲過程返回的查詢結果集 等)
其中,select查詢一般不會有什麼問題,但是 返回存儲過程中的查詢結果集卻容易出問題。特別是 VB6.0 + SQL2000 的情況。
下面舉例:
procedure -- sp_rpt1 中有如下語句:
CREATE TABLE ##tmp_2
(
calltype NVARCHAR(30),
calldesStrCollection NVARCHAR(4000)
)
INSERT INTO ##TMP_2 calltype='1' calldesStrCollection ='abcdefghijk'
....
select * from ##TMP_2
VB 6.0 中有如下語句:
Dim cmd As ADODB.Command
Dim Rs_Data As ADODB.Recordset
Dim Irowcount As Integer
Dim Icolcount As Integer
Set Rs_Data = New ADODB.Recordset
Set cmd = New ADODB.Command
cmd.CommandTimeout = 0
If g_Conn Is Nothing Then OpenConn
g_Conn.CommandTimeout = 6000
cmd.CommandTimeout = 6000
cmd.ActiveConnection = g_Conn
cmd.CommandType = adCmdStoredProc
cmd.CommandText = ProcedureName 'sp_rpt1
cmd.Parameters("@Dt1") = par1
cmd.Parameters("@Dt2") = par2
Set Rs_Data = cmd.Execute
If Rs_Data.State = 1 Then
MsgBox "Rs_Data is Opened!"
Else
MsgBox "Rs_Data is closed!連接已經關閉或未返回任何數據"
Exit Sub
End If
在VB6.0程序執行中,會出現 Rs_Data.State = 0 的情況。
經過分析才知道, 在 sql 2000 DB中執行sp_rpt1 會產生一些警告信息:
“已經創建##tmp_2.但其行大小(8085字節)超出最大行大小(8086字節)限制。對此表的update insert操作將失敗。”
正是這些警告信息,導致 sp_rpt1沒有返回"結果集"給Rs_Data,由於Rs_Data沒有獲得結果集,所以自動關閉了。
解決方法是:
修改表##tmp_2定義,calldesStrCollection NVARCHAR(4000) 改成 calldesStrCollection NVARCHAR(3000)
或者
將Nvarchar 改成 Ntext 類型。