我想把数据库中的一些列放在msflexgrid控件中,但在“do while。。”处出现“对象变量为设置”,flexgrid控件中只有第一行有标题,而数据没有,这是为什么呢?请高手指教一下。连接access数据库也是这样。用的是sql7,引用了activex 2.6 library
部分代码如下:
Private Sub Command2_Click()
Dim txtSQL As String
Dim MsgText As String
Dim mrc As ADODB.Recordset
txtSQL = "select soldtocontactid,orderid,carrierid,ordernet from transorderheader"
Set mrc = ExecuteSQL(txtSQL, MsgText)With MSFlexGrid1
     .Rows = 2
     .CellAlignment = 4
     .TextMatrix(1, 0) = "客户编号"
     .TextMatrix(1, 1) = "订单号"
     
     .TextMatrix(1, 2) = "输入人员"
     .TextMatrix(1, 3) = "订单金额"
     Do While Not mrc.EOF
     .Rows = .Rows + 1
     .CellAlignment = 4
     .TextMatrix(.Rows - 1, 0) = mrc.Fields(0)
     .TextMatrix(.Rows - 1, 1) = mrc.Fields(1)
     
     .TextMatrix(.Rows - 1, 2) = mrc.Fields(2)
     .TextMatrix(.Rows - 1, 3) = mrc.Fields(3)     mrc.MoveNext
     Loop
End With
mrc.Close
end sub
类模块的内容如下:
Public Function Connectstring() As String
Connecstring = "Provider=SQLOLEDB.1;Integrated Security=SSPI;Persist Security Info=False;Initial Catalog=rdtry;Data Source=mlirdtry"
End FunctionPublic Function ExecuteSQL(ByVal SQL As String, MsgString As String) As ADODB.Recordset
Dim cnn As ADODB.Connection
Dim rst As ADODB.Recordset
Dim sTokens() As String
On Error GoTo executesql_error
sTokens = Split(SQL)
Set cnn = New ADODB.Connection
cnn.Open Connectstring
If InStr("INSERT,DELETE,UPDATE", UCase$(sTokens(0))) Then
cnn.Execute SQL
MsgString = sTokens(0) & "query successful"
Else
Set rst = New ADODB.Recordset
rst.Open Trim$(SQL), cnn, adOpenKeyset, adLockOptimistic
Set ExecuteSQL = rst
MsgString = "查询到" & rst.RecordCount & "条记录"
End If
executesql_exit:
Set rst = Nothing
Set cnn = Nothing
Exit Function
executesql_error:
MsgString = "查询错误:" & Err.Description
Resume executesql_exit
End Function

解决方案 »

  1.   

    是不是这句要改成:Dim mrc As ADODB.Recordset->Dim mrc As New ADODB.Recordset
      

  2.   

    在你的ExecuteSQL函数中使用了“Set rst = Nothing”,它已经被关闭而且释放了。
    要去掉这两句:
    Set rst = Nothing
    Set cnn = Nothing
      

  3.   

    坦白来讲,这段代码不很规范。你的cnn在ExecuteSQL函数里打开,然后在另一个函数中调用记录集,感觉上比较乱。
      

  4.   

    我想因为cnn, rst都是函数级的变量,只在ExecuteSQL里有效。可以把这两个定义放到最上面-模块极变量
    Dim cnn As ADODB.Connection
    Dim rst As ADODB.Recordset