我在VB6.0 中,使用ADO访问SQL Server 2000,数据控件使用MSHFlexGrid,但在应用过程中发现MSHFlexGrid控件存在缺陷。具体表现为当数据集的记录数太多时,比如10000条记录,MSHFlexGrid无法完全显示出来,只能显示500多条,我不知道是ADO的问题还是MSHFlexGrid控件的问题,总之在我的程序中会出现这种情况。下面我将我的代码拿出来,给大家看看是哪里出了毛病: Private Sub Command1_Click() 
On Error GoTo errhap 
Dim Conn As New ADODB.Connection 
Dim RS As New ADODB.Recordset 
Dim ConnStr As String 
ConnStr = "Driver={sql server};server=MyServer;uid=sa;pwd=123456;database=MyDataBase" conn.Open ConnStr RS.Open "Select * from T1 order by in_id", Conn 
Set MSHFlexGrid1.DataSource = rs 
rs.Close 
conn.Close 
Exit Sub 
errhap: 
MsgBox Err.Description 
Exit Sub 
End Sub 在以上的代码中,T1是SQL Server中的一个表,其记录数超过10000条。 
当程序运行的时候,没有错误,但是MSHFlexGrid1这个控件显示出来的记录就只得500多条,访问T1的时候,我也没有使用Where 语句过滤记录,理论上说,应该可以显示出来10000条记录的,但就是不行,不知是什么原因? 
ADO 我引用的是 2.8版本的Library,这么新的版本,应该不会有毛病。 我怎么弄都弄不出原因。为此,我不使用ADO.Recordset,改用控件ADODC作为记录集,重新试了一遍,代码如下: 
Adodc1.ConnectionString = connstr 
Adodc1.RecordSource = "Select * from t1 order by in_id" 
Set MSHFlexGrid1.DataSource = Adodc1 
Adodc1.Refresh 
但出来的结果也是只有2000多条,MSHFlexGrid1 没有显示出来预计的1万条记录。我更加感到奇怪了!!!!!!! 最后我没有办法了,将MSHFlexGrid1控件改成 DataGrid控件,使用ADODC控件作为数据集,奇迹出现了!!可以显示10000条记录了!!!!!!! 但这不是我要的结果,因为DataGrid这个控件太单调了,不好看,而且功能少,不能达到程序的要求。我要的是用MSHFlexGrid1控件来做程序, 
以上的都是真实的,请大家找找MSHFlexGrid1控件不能显示所有查询记录的原因是什么?????感激涕零!!!!!

解决方案 »

  1.   

    这个是VB的问题还是 ADO的问题?安装VB6 SP5真的可以解决问题吗?还有,sp5哪里有得下载呢?
      

  2.   

    我想这个肯定是VB MSHFlexGrid的缺陷来的,我刚刚在不同的电脑重新试了一次(没有打补丁),结果,如果用ADO.Recordset的话,MSHFlexGrid也只是显示522条记录,无法显示表的1万条记录!!!!!!!
      

  3.   

    这是 Microsoft Visual Basic 6.0 Enterprise Edition 的一个 Bug。 Visual Studio 6.0 Service Pack 3 改正了此问题。另外一种绕过 Bug 的方法是用记录集对象的 GetString 方法和 MSHFlexGrid 的 Clip 粘贴方法:   Dim cn As New ADODB.Connection
       Dim rs As New ADODB.Recordset
       Dim rsVar As Variant
       Dim i As Integer
       cn.Open "Testing"  '<-- Your DSN   rs.Open "select * from Cies", cn, adOpenStatic, adLockOptimistic
       rs.MoveLast   rs.MoveFirst
       ' Assuming that rs is your ADO recordset
       MSHFlexGrid1.Rows = rs.RecordCount + 1   rsVar = rs.GetString(adClipString, rs.RecordCount)   MSHFlexGrid1.Cols = rs.Fields.Count   ' Set column names in the grid
       For i = 0 To rs.Fields.Count - 1       MSHFlexGrid1.TextMatrix(0, i) = rs.Fields(i).Name   Next   MSHFlexGrid1.Row = 1
       MSHFlexGrid1.Col = 0   ' Set range of cells in the grid
       MSHFlexGrid1.RowSel = MSHFlexGrid1.Rows - 1
       MSHFlexGrid1.ColSel = MSHFlexGrid1.Cols - 1
       MSHFlexGrid1.Clip = rsVar   ' Reset the grid's selected range of cells
       MSHFlexGrid1.RowSel = MSHFlexGrid1.Row
       MSHFlexGrid1.ColSel = MSHFlexGrid1.Col   rs.Close
       Set rs = Nothing
       cn.Close
       Set cn = Nothing