msflexgrid 是老版本的,不能用ADO
mshflexgrid是新版本的,可以用ADO,而且还能做合并单元格之类的,功能强,但非常复杂,
datagrid 可以实现普通的表格,而且几乎不用编程,最简单,当然功能没有上一个强.
mshflexgrid 是一个纯 sheet 的表格
DataGrid和另外两个控件最大的区别在于DataGrid允许用户修改数据,而另外两个不允许。
如果你要用户修改数据,你应该使用DataGrid。
如果只是显示数据,应该使用MSFlexGrid 或者 MSHFlexGrid,因为这两个控件显示的选项更多,更好看。
而MSFlexGrid和MSHFlexGrid之间的区别,主要是MSHFlexGrid支持绑定ADODC控件,而MSFlexGrid只支持Data控件。
MSFlexGrid引用方法:工程->部件->Microsoft FlexGrid Control 6.0
MSHFlexGrid引用方法:工程->部件->Microsoft Hierarchical FlexGrid Control 6.0
MSHFlexGrid 控件的一个主要特性是它能显示层次结构记录集—以层次结构方式显示的关系表。创建层次结构记录集的最容易的方法是使用数据环境设计器并把 MSHFlexGrid 控件的 DataSource 属性赋给数据环境。您也可以用 Shape 命令作为 ADO Data Control 的 RecordSource 在代码中创建层次结构记录,如下面的示例:
' 创建 ConnectionString.
Dim strCn As String
strCn = "Provider=MSDataShape.1;Data Source=Nwind;" & _
"Connect Timeout=15;Data Provider=MSDASQL"
' 创建 Shape 命令.
Dim strSh As String
strSh = "SHAPE {SELECT * FROM `Customers`} AS Customers " & _
"APPEND ({SELECT * FROM `Orders`} AS Orders RELATE " & _
"CustomerID TO CustomerID) AS Orders"
' 把 ConnectionString 赋给 ADO Data Control 的
' ConnectionString 属性, Shape 命令以及
' 控件的 RecordSource 属性.
With Adodc1
.ConnectionString = strCn
.RecordSource = strSh
End With
' 把 HflexGrid 控件的 DataSource 属性设置到
' ADO Data 控件。
Set HFlexGrid1.DataSource = Adodc1
DataGrid 控件是一种类似于电子数据表的绑定控件,可以显示一系列行和列来表示 Recordset 对象的记录和字段。可以使用 DataGrid 来创建一个允许最终用户阅读和写入到绝大多数数据库的应用程序。DataGrid 控件可以在设计时快速进行配置,只需少量代码或无需代码。当在设计时设置了 DataGrid 控件的 DataSource 属性后,就会用数据源的记录集来自动填充该控件,以及自动设置该控件的列标头。然后您就可以编辑该网格的列;删除、重新安排、添加列标头、或者调整任意一列的宽度。
在运行时,可以在程序中切换 DataSource 来察看不同的表,或者可以修改当前数据库的查询,以返回一个不同的记录集合。
注意 DataGrid 控件与 Visual Basic 5.0中的 DBGrid 是代码兼容的,除了一个例外:DataGrid 控件不支持 DBGrid 的“解除绑定模式”概念。DBGrid 控件包括在 Visual Basic 98 的 Tools 目录中。
可能的用法
查看和编辑在远程或本地数据库中的数据。
与另一个数据绑定的控件(诸如 DataList 控件)联合使用,使用 DataGrid 控件来显示一个表的记录,这个表通过一个公共字段链接到由第二个数据绑定控件所显示的表。
使用 DataGrid 控件的设计时特性
可以不编写任何代码,只通过使用 DataGrid 控件的设计时特性来创建一个数据库应用程序。下面的说明概要地说明了在实现 DataGrid 控件的典型应用时的一般步骤。完整的循序渐进的指示,请参阅主题“DataGrid 方案1: 使用 DataGrid 控件创建一个简单数据库应用程序”。
要在设计时实现一个 DataGrid 控件
为您希望访问的数据库创建一个 Microsoft 数据链接 (.UDL) 文件。请参阅“创建 Northwind OLE DB 数据链接”主题,以获得一个示例。
在窗体上放置一个 ADO Data 控件,并将其 ConnectionString 属性设置为在第 1 步中所创建的OLE DB 数据源。
在这个 Ado Data 控件的 RecordSource 属性中输入一条将返回一个记录集的 SQL 语句。例如,
Select * From MyTableName Where CustID = 12
在窗体上放置一个 DataGrid 控件,并将其 DataSource 属性设置为这个 ADO Data 控件。
右键单击该 DataGrid 控件,然后单击“检索字段”。
右键单击该 DataGrid 控件,然后单击“编辑”。
重新设置该网格的大小、删除、或添加网格的列。
右键单击该 DataGrid 控件,然后单击“属性”。
使用“属性页”对话框来设置该控件的适当的属性,将该网格配置为所需的外观和行为。
在运行时更改显示的数据
在创建了一个使用设计时特性的网格后,也可以在运行时动态地更改该网格的数据源。下面介绍实现这一功能的通常方法。
更改 DataSource 的RecordSource
更改所显示的数据的最通常的方法是改变该 DataSource 的查询。例如,如果 DataGrid 控件使用一个 ADO Data 控件作为其 DataSource,则重写 RecordSource、刷新该 ADO Data 控件、都将改变所显示的数据。
' ADO Data 控件连接的是 Northwind 数据库的
' Products 表。新查询查找所有
' SupplierID = 12 的记录。
Dim strQuery As String
strQuery = "SELECT * FROM Suppliers WHERE SupplierID = 12"
Adodc1.RecordSource = strQuery
Adodc1.Refresh
更改 DataSource
在运行时,可以将 DataSource 属性重新设置为一个不同的数据源。例如,您可能具有若干个 ADO Data 控件,每个控件连接不同的数据库,或设置为不同的 RecordSource 属性。可以简单地将 DataSource 从一个 ADO Data 控件重新设置为另一个 ADO Data 控件:
' 将 DataSource 重新设置为一个连接到 Pubs 数据库的、
' 使用 Authors 表的 ADO Data 控件。
Set DataGrid1.DataSource = adoPubsAuthors
重新绑定 DataSource
当将 DataGrid 控件用于一个远程数据库,诸如 SQLServer 时,可以改变表的结构。例如,可以给这个表添加一个字段。在这种情形时,可以调用 Rebind 方法根据新的结构来重新创建该网格。注意,如果已经在设计时改变了这个列的布局,DataGrid 控件将会试图重新创建当前的布局,包括任何空的列。不过,通过首先调用 ClearFields 方法,可以强制该网格重新设置所有的列。
从 DataGrid 返回值
在 DataGrid 被连接到一个数据库后,可能想要监视用户单击了哪一个单元。您可以使用 RowColChange 事件 — 而不是 Click 事件 — 如下所示,:
Private Sub DataGrid1_RowColChange(LastRow As Variant, ByVal LastCol As Integer)
' 显示用户所单击的单元的文字、行和列的信息。
Debug.Print DataGrid1.Text; DataGrid1.Row; DataGrid1.Col
End Sub
使用 CellText 和 CellValue 方法
当一个列使用 NumberFormat 属性设置格式后,CellText 和 CellValue 属性是很有用的。NumberFormat 属性不必更改实际的数据的格式就可以更改任何包含数字的列的格式。例如,给定一个网格,其中包含一个名为 ProductID 的、包含整数的列。下面的代码将使 DataGrid 以"P-0000" 的格式来显示数据。换句话说,尽管在 ProductID 字段中所包含的实际数值为 "3",但该网格所显示的值将是 "P-0003"。
Private Sub Form_Load()
DataGrid1.Columns("ProductID").NumberFormat = "P-0000"
End Sub
要返回数据库中所包含的实际值,应使用 CellValue 方法,如下所示:
Private Sub DataGrid1_RowColChange(LastRow As Variant, ByVal LastCol As Integer)
Debug.Print _
DataGrid1.Columns("ProductID").CellValue(DataGrid1.Bookmark)
End Sub
注意 上面所用的 CellValue 和下面所用的 CellText 值,都需要将 bookmark 属性作为一个参数,功能才正确。
相反地,如果要返回该字段的格式化的值,应使用 CellText 方法:
Private Sub DataGrid1_RowColChange(LastRow As Variant, ByVal LastCol As Integer)
Debug.Print _
DataGrid1.Columns("ProductID").CellText(DataGrid1.Bookmark)
End Sub
注意 上面的 CellText 方法等价于使用 DataGrid 控件的 Texr 属性。
现成本系统已用DataGrid显示数据了.我想只从DataGrid取数据就可以了.
发现不是那么简单了.Rows笔据取不到. 用 grid .VisibleRows 只能取显示的行数.行不通.
又想到分页.方法如下:
if K>grid .VisibleRows then
grid.Scroll 0, grid .VisibleRows
K=0
end if
grid.row=k
这样存在一个问量,每下一页,就grid .VisibleRows+1的数据取不到,不知道什么原因,也不去研究了.
后来就用以下的方法了.
增加一个类模块:clsComm 代码如下:
Public Function ExpFromGrid(ByVal grid As DataGrid, ByVal adors As ADODB.Recordset, ByVal path As String, ByVal title As String) As Boolean
'On Error Resume Next
Dim exlApp As Excel.Application
Dim ExlBook As Excel.Workbook
Dim ExlSheet As Excel.Worksheet
Dim tRow, tCol As Integer
'-----------保存文件
' On Error GoTo OnErr
Set exlApp = New Excel.Application
With exlApp
.Visible = False
.SheetsInNewWorkbook = 1
End With
Set ExlBook = exlApp.Workbooks.Add
Set ExlSheet = ExlBook.Worksheets(1)
With ExlSheet
.Name = title
.Cells(1, 1) = title
.Cells(2, 1) = "序号"
For tCol = 0 To grid.Columns.Count - 1
.Cells(2, 2 + tCol) = grid.Columns.Item(tCol).Caption
Next tCol
adors.MoveFirst
tRow = 0
Do While Not adors.EOF
.Cells(2 + tRow + 1, 1) = tRow + 1
For tCol = 0 To grid.Columns.Count - 1
.Cells(2 + tRow + 1, 2 + tCol) = adors(grid.Columns.Item(tCol).DataField)
Next tCol
' k = k + 1
' If k > grid.VisibleRows + 1 Then
' grid.Scroll 0, grid.VisibleRows
' k = 0
' End If
tRow = tRow + 1
adors.MoveNext
Loop
.Columns.AutoFit
.Range(.Cells(1, 1), .Cells(1, tCol + 1)).MergeCells = True
.rows(1).RowHeight = 30
.rows(1).Font.Bold = True
.rows(2).Font.Bold = True
.Range(.Cells(2, 1), .Cells(2, tCol + 1)).Interior.ColorIndex = 34
.Range(.Cells(1, 1), .Cells(tRow + 2, tCol + 1)).HorizontalAlignment = xlCenter
.Range(.Cells(1, 1), .Cells(tRow + 2, tCol + 1)).Borders.LineStyle = xlContinuous
End With
exlApp.ActiveWorkbook.SaveAs path
exlApp.ActiveWorkbook.Saved = True
exlApp.Quit
MsgBox "导出完成!", vbInformation, "提示"
ExpFromGrid = True
Exit Function
OnErr:
exlApp.ActiveWorkbook.Saved = True
exlApp.Quit
MsgBox "导出失败!", vbCritical, "错误"
ExpFromGrid = False
End Function
Public Function ExportFromMSFlex(ByVal MsFlex As MSHFlexGrid, ByVal path As String, ByVal title As String)
On Error Resume Next
Dim exlApp As Excel.Application
Dim ExlBook As Excel.Workbook
Dim ExlSheet As Excel.Worksheet
Dim tRow, tCol As Integer
'-----------保存文件
On Error GoTo OnErr
Set exlApp = New Excel.Application
With exlApp
.Visible = False
.SheetsInNewWorkbook = 1
End With
Set ExlBook = exlApp.Workbooks.Add
Set ExlSheet = ExlBook.Worksheets(1)
With ExlSheet
.Name = title
.Cells(1, 1) = title
For tRow = 0 To MsFlex.rows - 1
If tRow = 0 Then
.Cells(2, 1) = "序号"
Else
.Cells(2 + tRow, 1) = tRow
End If
For tCol = 0 To MsFlex.Cols - 1
.Cells(2 + tRow, 2 + tCol) = MsFlex.TextMatrix(tRow, tCol)
Next tCol
Next tRow
.Columns.AutoFit
.Range(.Cells(1, 1), .Cells(1, tCol + 1)).MergeCells = True
.rows(1).RowHeight = 30
.rows(1).Font.Bold = True
.rows(2).Font.Bold = True
.Range(.Cells(2, 1), .Cells(2, tCol + 1)).Interior.ColorIndex = 34
.Range(.Cells(1, 1), .Cells(tRow + 1, tCol + 1)).HorizontalAlignment = xlCenter
.Range(.Cells(1, 1), .Cells(tRow + 1, tCol + 1)).Borders.LineStyle = xlContinuous
End With
exlApp.ActiveWorkbook.SaveAs path
exlApp.ActiveWorkbook.Saved = True
exlApp.Quit
MsgBox "导出完成!", vbInformation, "提示"
Exit Function
OnErr:
exlApp.ActiveWorkbook.Saved = True
exlApp.Quit
MsgBox "导出失败!", vbCritical, "错误"
End Function
然后用以下方法调用:
On Error Resume Next
Dim clsExport As New clsComm
Dim adors As New ADODB.Recordset
Dim path As String
Dim title As String
title = "差异数据(" & Format(Me.DtpOptDate, "YYYYMM") & ")"
With Me.CommonDialog1
.CancelError = True
.DialogTitle = "保存文件"
.FileName = title & Format(Date, "YYYY-MM-DD")
.Filter = "Xls(*.Xls)|*.xls"
.Flags = cdlOFNCreatePrompt + cdlOFNHideReadOnly
.ShowSave
End With
If Err = cdlCancel Then
Exit Sub
End If
Me.cmdExport.Enabled = False
path = Me.CommonDialog1.FileName
Set adors = Me.AdoErrBalance.Recordset
Call clsExport.ExpFromGrid(Me.dgdErrExpData, adors, path, title)
adors.Close
Me.cmdExport.Enabled = True
∙标签: VB 、 DataGrid 、 MSHFlexGrid 、 导出Excel
∙分类: VB
应用心得
1)MSHFlexGrid控件与MSFlexGrid控件的异同
MSHFlexGrid控件与Adodc控件绑定,MSFlexGrid控件与Data控件绑定。
2)MSHFlexGrid控件的应用
如果记录集已经在程序中产生,则可以不与Adodc控件绑定,直接在MSHFlexGrid控件中显示数据,并且可以根据需要设置控件中行的颜色,
Public Function DataGrid_Update() As Boolean
On Error GoTo DataGrid_Update_Err
Dim orarsRecordset As Object
Dim adorsRecordset As New ADODB.Recordset
Dim lngDateDiff As Long
Call gGetData(CONST_GENERALTABLE_TIMEOUT_INFO, orarsRecordset)
If Not ADO_DataBaseOpen(dskAttr, 1) Then
DataGrid_Update = False
Exit Function
End If
adorsRecordset.CursorLocation = adUseClient
Call adorsRecordset.Open(CONST_VEHICLETABLE_RECORDSET_QUERIED, _
mobjDataSource.ConnectionString, , , adCmdText)
frmShowNewData.grdSaiShin.ColWidth(0) = 800
frmShowNewData.grdSaiShin.ColWidth(1) = 2000
frmShowNewData.grdSaiShin.AllowUserResizing = flexResizeColumns
Set frmShowNewData.grdSaiShin.DataSource = adorsRecordset
Dim i As Integer
i = 0
i = i + 1
While Not adorsRecordset.EOF
lngDateDiff = DateDiff("n", adorsRecordset.Fields("?位日?"), Now)
If lngDateDiff > orarsRecordset.Fields("GEN_V_NUM").Value Then
frmShowNewData.grdSaiShin.Row = i
Dim j As Integer
For j = 0 To frmShowNewData.grdSaiShin.Cols - 1
frmShowNewData.grdSaiShin.Col = j
frmShowNewData.grdSaiShin.CellBackColor = &H80FFFF
Next
End If
i = i + 1
adorsRecordset.MoveNext
Wend
Call ADO_DataBaseClose
DataGrid_Update = True
Exit Function
DataGrid_Update_Err:
Call ADO_DataBaseClose
DataGrid_Update = False
End Function
datagrid因为和数据库直接进行了绑定,如果频繁修改数据,用它比较好。
MSHFlexGrid主要用来浏览数据,可灵活的设置数据显示的格式。
其它两个我就很少用了。
在分页显示记录中需要显示当前记录也数据,而显示记录页数据有两种方法:
方法一:使用DataGrid控件;DataGrid控件可显示记录集中的全部数据,所以不能直接将分页的记录集绑定到DataGrid控件,需要先将当前记录页中的记录复制到一个新的记录集中,再将其绑定到DataGrid控件,便可显示当前记录也数据。
方法二:使用MSFlexGrid控件;其可在设计时将其绑定到Data控件,在运行时,则可通过设置控件的TextMatrix属性来显示数据。
那么它们到底有什么区别呢?
1,MSFlexGrid控件比较灵活
因为其有TextMatrix属性(设置和返回控件任意单元格的文本内容),所以在做显示数据时,直接可通过循环在其中填充数据(数据有灵活性,可填充一部分,也可全部填充,所以分页显示效果较容易实现)。
下面是它在分页中的代码:
MSFlexGrid1.Clear '清除原有数据
‘通过循环在TextMatrix属性中填充数据
For I = 0 To objRs.Fields.Count - 1
MSFlexGrid1.TextMatrix(0, I) = objRs.Fields(I).Name
Next
For I = 1 To objRs.PageSize
For J = 0 To objRs.Fields.Count - 1
MSFlexGrid1.TextMatrix(I, J) = objRs.Fields(J)
Next
objRs.MoveNext
If objRs.EOF Then Exit For
Next
而DataGrid控件是显示记录集中的全部数据,所以在做分页显示时,需要先将需要显示的部分拷贝到一个新的记录集中,然后再通过DataGrid控件显示该(新)记录集中的全部数据,所以做法较为死板。
例如它在分页显示时的代码:
‘创建一个新的空记录集
For intRecord = 0 To objRs.Fields.Count - 1
objDataSource.Fields.Append objRs.Fields(intRecord).Name, adVarChar, objRs.Fields(intRecord).DefinedSize
Next
‘将需要显示的部分拷贝到一个新的记录集中
For intRecord = 1 To objRs.PageSize '将objRs当前记录页中数据写入objDataSource
objDataSource.AddNew
objDataSource!用户名 = objRs!用户名
objDataSource!口令 = objRs!口令
objDataSource!身份 = objRs!身份
objRs.MoveNext
If objRs.EOF Then Exit For
Next
’通过DataGrid控件显示该(新)记录集中的全部数据
Set DataGrid1.DataSource = objDataSource
2,MSFlexGrid控件显示效果好
MSFlexGrid控件的网格中可以包含字符串和图片,并且它提供了高度灵活的网格排序、合并和格式设置功能,因此它可以设计出非常漂亮且实用的界面。
而DataGrid只有基本的显示数据的功能,相对MSFlexGrid来说就比较乏味。
DataGrid控件:
显示并允许对Recordset对象中代表记录和字段的一系列行和列进行数据操纵。
MSFlexGrid 控件:
Microsoft FlexGrid (MSFlexGrid) 控件可以显示网格数据,也可以对其进行操作。它提供了高度灵活的网格排序、合并和格式设置功能,网格中可以包含字符串和图片。如果将它绑定到一个 Data 控件上,那么 MSFlexGrid 显示的将是只读的数据。
DataGrid控件对于查询出来的数据集进行显示。如果需要一些比如合并单元格经行显示的时候,就不太好实现了。
MSFlexGrid控件比较灵活,可以实现一些DataGrid不能变现出的样式。
MSFlexGrid控件,可以通过行列的方式,操作每一个单元格显示的内容。
DBGrid是专用来操作数据库的网格控件,可以绑定到Data控件,几乎不用写代码就可方便地对数据进行显示,增加、删除或修改记录,DBGrid具有OnAddNew、BeforeDelete等事件,可在增加新记录或删除修改时对数据进行有效性检验,来实现事务处理功能。DBGrid也可以在设计时编辑网格格式,指定显示字段等,由于它提供了Column、Split、SelBookmarks等对象,更增强了显示和操作数据的能力。 由于具有良好的可靠性,灵活性和直观性,所以DBGrid控件现在被广泛使用。但不足之处在于DBGrid直接操作数据库,对数据库的正确性有一定的威胁。改进方法是,在修改数据库时,加入提示信息。
DataGrid 控件是一种类似于电子数据表的绑定控件,可以显示一系列行和列来表示 Recordset 对象的记录和字段。可以使用 DataGrid 来创建一个允许最终用户阅读和写入到绝大多数数据库的应用程序。DataGrid 控件可以在设计时快速进行配置,只需少量代码或无需代码。当在设计时设置了 DataGrid 控件的 DataSource 属性后,就会用数据源的记录集来自动填充该控件,以及自动设置该控件的列标头。然后您就可以编辑该网格的列;删除、重新安排、添加列标头、或者调整任意一列的宽度。
在运行时,可以在程序中切换 DataSource 来察看不同的表,或者可以修改当前数据库的查询,以返回一个不同的记录集合。
注意 DataGrid 控件与 Visual Basic 5.0中的 DBGrid 是代码兼容的,除了一个例外:DataGrid 控件不支持 DBGrid 的“解除绑定模式”概念。DBGrid 控件包括在 Visual Basic 98 的 Tools 目录中。
在vb中adodc控件和data控件有什么区别???
ADO Data 控件
ADO Data 控件使用 Microsoft ActiveX 数据对象(ADO) 来快速建立数据绑定的控件和数据提供者之间的连接。数据绑定控件是任何具有“数据源”属性的控件。数据提供者可以是任何符合 OLEDB 规范的数据源。使用 Visual Basic 的类模块也可以很方便地创建子集的数据提供者。
尽管可以在应用程序中直接使用 ActiveX 数据对象,但 ADO Data 控件有作为一个图形控件的优势(具有“向前”和“向后”按钮),以及一个易于使用的界面,使您可以用最少的代码创建数据库应用程序。
图 7.4 ADO Data 控件
在 Visual Basic 的“工具箱”中不少控件都可以作为数据绑定的控件,包括复选框、组合框、图像、标签、列表框、图片框、以及文本框控件等。此外,Visual Basic 还包括了若干种数据绑定的 ActiveX 控件,诸如 DataGrid、DataCombo、Chart、以及 DataList 控件等。用户也可以创建自己的数据绑定的 ActiveX 控件,或从其他开发商购买控件。
Visual Basic以前的版本提供了内在的 Data 控件和 Remote Data 控件 (RDC) 来进行数据访问。这两种控件仍包括在 Visual Basic 中,以提供向后兼容。不过,因为 ADO 的适应性更广,因此建议用户使用 ADO Data 控件来创建新的数据库应用程序。
详细信息 关于数据绑定的控件的完整列表位于“绑定到 ADO Data 控件的控件”中。要了解如何使用这些内在的Data 控件或 Remote Data 控件,请参阅“使用 Data 控件”或“使用 Remote Data 控件”。关于创建数据提供者的详细信息,请参阅“创建数据识别类”。
可能的用法
连接一个本地数据库或远程数据库。
打开一个指定的数据库表,或定义一个基于结构化查询语言 (SQL) 的查询、或存储过程、或该数据库中的表的视图的记录集合。
将数据字段的数值传递给数据绑定的控件,可以在这些控件中显示或更改这些数值。
添加新的记录,或根据对显示在绑定的控件中的数据的任何更改来更新一个数据库。
要创建一个客户、或前端数据库应用程序,应在窗体中添加 ADO Data 控件,以及其它所需要的任何 Visual Basic 控件。可以根据您的需要在窗体中放置多个 ADO Data 控件。不过,请注意,这种控件是一种相当“昂贵”的创建连接的方法,应在第一个控件至少有两个连接,且以后的每个控件至少多一个连接时使用。
用最少的代码创建一个前端数据库应用程序
通过在设计时设置一些属性,可以用最少的代码来创建一个数据库应用程序。如果正在使用OLE DB 数据源,则相应的Microsoft 数据链接名称(Data Link Name)(.MDL) 必须是在您的机器上创建的。请参阅“创建 Northwind 的OLE DB Data Link”,以获得一个循序渐进的示例。
要创建一个简单的前端数据库应用程序
窗体上放置一个 ADO Data 控件。(该图标的工具提示为 "ADODC"。)
如果该控件不在“工具箱”中,请按 CTRL+T 键,显示“部件”对话框。在这个“部件”对话框中,单击“Microsoft ADO Data Control”。
在“工具箱”中,单击选定“ADO 数据控件”。然后按 F4 键显示“属性”窗口。
在“属性”窗口中,单击“ConnectionString”显示“ConnectionString”对话框。
如果您已经创建了一个 Microsoft 数据链接文件(Data Link file)(.UDL),请选择“使用 OLE DB 文件”并单击“浏览”,以找到计算机上的文件。如果使用 DSN,则单击“使用 ODBC 数据源名”,并从框中选择一个 DSN,或单击“新建”创建一个。如果想创建一个连接字符串,请选择“使用 ConnectionString”,单击“生成”,然后使用“数据链接属性”对话框创建一个连接字符串。在创建连接字符串后,单击“确定”。ConnectionString 属性将使用一个类似于下面这一行的字符串来填充:
driver={SQL Server};server=bigsmile;uid=sa;pwd=pwd;database=pubs
在“属性”窗口中,将“记录源”属性设置为一个 SQL 语句。例如:
SELECT * FROM Titles WHERE AuthorID = 72
在访问一个表时,应始终包括一个 WHERE 子句。如果这样做失败,则会锁定整个表,这样对其他用户将是一个严重的障碍。
在窗体上再放置一个“文本框”控件,用来显示数据库信息。
在其“属性”窗口中,将 Text1 的“数据源”属性设为 ADO Data 控件的名称 (ADODC1)。这样就将这个文本框和 ADO Data 控件绑定在一起。
在其“属性”窗口中,单击“数据字段”将下拉得到一个可用的字段列表。单击所要显示的字段的名称。
对希望访问的其它每个字段重复第 6、7、8 步。
按 F5 键运行该应用程序。用户可以在 ADO Data 控件使用四个箭头按钮,从而允许用户地到达数据的开始、记录的末尾、或在数据内从记录移动到另一个记录。
在程序中设置 ConnectionString、Source、DataSource、以及 DataField
下面的代码演示了如何在程序中设置这四个属性。注意设置 DataSource 属性要使用 Set 语句。
Private Sub Form_Load()
With ADODC1
.ConnectionString = "driver={SQL Server};" & _
"server=bigsmile;uid=sa;pwd=pwd;database=pubs"
. RecordSource = "Select * From Titles Where AuthorID = 7"
End With
Set Text1.DataSource = ADODC1
Text1.DataField = "Title"
End Sub
ADO Data 控件的事件
ADO Data 控件提供了若干个可以编程的事件。下表说明了这些事件及其何时产生,不过这个表不是一个关于这些事件何时发生的所有条件的完整列表。更完整的信息,请参阅各个事件的参考主题。
详细信息 如果试图循序渐进地使用 ADO Data 控件,请参阅“使用 DataGrid 和 ADO 数据控件创建一个简单的数据库应用程序”,“ 创建一个简单的 DataCombo 应用程序”,以及“创建一个连接 DataList 控件的 DataGrid”。
Data 控件
使用三种类型的 Recordset 对象中的任何一种来提供对存储在数据库中数据的访问。Data 控件允许从一个记录移动到另一个记录,并显示和操纵来自被连结的控件的记录的数据。如果没有 Data 控件或等价的数据源控件,比如 RemoteData 控件,窗体上的被连结数据觉察控件不能自动访问数据。
语法
Data
说明
可以使用 Data 控件来执行大部分数据访问操作,而根本不用编写代码。与 Data 控件相连结的数据觉察控件自动显示来自当前记录的一个或多个字段的数据,或者,在某些情况下,显示来自当前记录旁边的一个记录集合中的一个或者多个字段中的数据。Data 控件在当前记录上执行所有操作。
如果 Data 控件被指示移动到一个不同的记录,则所有被连结的控件自动把当前记录的任何改变传递给 Data 控件以保存在数据库中。Data 控件移动到被指定的记录,同时把当前记录中的数据传回被连结的控件,并在那里显示。
Data 控件自动处理一些意外事件包括空记录集,添加新记录,编辑和更新现有记录,处理某些类型的错误。然而,在更复杂的应用程序里,则需要捕获 Data 控件不能处理的某些错误类型。例如,当 Microsoft Jet 数据库引擎访问数据文件有问题、没有权限或不能按照代码执行查询时,会导致可捕获的错误。如果错误发生在应用过程开始之前或由于某些内部错误,Error 事件被触发。
被连结的控件
当与 Data 控件相连结时,DataList、 DataCombo、 DataGrid,和 MSHFlexGrid 控件都能管理记录集合。所有这些控件都允许一次显示或操作几个记录。
内部的 Picture、Label、TextBox、CheckBox、Image、OLE、ListBox 和 ComboBox 控件也是数据觉察的,能和由 Data 控件管理的 Recordset 的一个字段相连结。其它的数据觉察控件,如 MaskedEdit 和 RichTextBox 控件,可以在专业版和企业版中得到,也可以由第三方提供。
操作
一旦应用程序开始,Visual Basic 就用 Data 控件属性打开选定的数据库,创建 Database 对象和创建 Recorset 对象。Data 控件的 Database 和 Recordset 属性引用新创建的,可于 Data 控件操作的 Database 和 Recorset 对象— 带有或没有被连结的控件。Data 控件在其所在窗体的初始化 Form_Load 事件之前被初始化。在初始化阶段中发生任何错误都将导致一个不可捕获的错误。
当 Visual Basic 用 Jet Database 引擎创建一个 Recordset 时,其它的 Visual Basic 操作或事件只能等到该操作完成后才能发生。然而,在 Recordset 创建过程中允许其它基于 Windows 的应用程序继续执行。当 Jet 引擎创建 Recordset 时,按 CTRL+BREAK 键,操作将被终止,导致一个可捕获的错误,而 Data 控件的 Recordset 属性被设置成 Nothing。在设计时内,第二次按 CTRL+BREAK 键会使 Visual Basic 显示 Debug 窗口。
当使用 Data 控件创建 Recordset 对象或用代码创建 Recordset 对象并把它赋值给 Data 控件时,Microsoft Jet 数据库引擎会自动移居到 Recordset 对象上。其结果为,书签(对于快照类型的 Recordset 对象,记录集数据)被保存在局部内存中,用户不必操纵 Data 控件,也不必在代码中调用 MoveLast 方法。用于创建 Recordset 的页面锁也被释放得更快,以使其它的 Recordset 对象能访问相同的数据。在代码中创建但是没有赋值给 Data 控件的 Recordset 对象不能自动被 Jet 引擎移居。请通过代码移居这些对象。由于 Data 控件以后台方式移居它的 Recordset,所以附加的 Recordset 可能被创建。
可以用鼠标操纵 Data 控件,由一个记录移动到另一个记录或移动到 Recordset 的开始或结尾。EOFAction 和 BOFAction 属性决定了当用户使用鼠标移动到 Recordset 的开始或结尾时将发生的事情。不能将焦点置于 Data 控件上。
有效性检查
使用 Validate 事件和 DataChanged 属性对写入数据库的记录执行合法性检查。
数据访问对象
在过程中可以使用由 Data 控件创建的 Database 和 Recordset 数据访问对象。每个 Database 和 Recorset 对象都有自己的属性和方法,可以编写使用这些属性和方法的过程来操纵数据。
例如,Recorset 对象的 MoveNext 方法把当前记录移动到 Recordset 中的下一个记录。要调用这个方法,可以使用此代码:
Data1.Recordset.MoveNext
Data 控件能访问 Jet 引擎 3.0 版中三种 Recorset 对象的任何一种。如果不选择记录集类型,则 dynaset 型的 Recordset 被创建。
在许多情况下,创建的 Recorset 对象的缺省类型和配置效率不是很高。也就是说,可能不需要一个具有可更新的,支持全屏滚动的,keyset 类型的光标访问数据。例如,一个只读的,只能向前的,快照类型的 Recordset 创建起来可能比缺省光标快得多。就现有情况尽可能选择最有效的类型、Exclusive、Options 和 ReadOnly 属性。
注意 使用 Data 控件时用于决定 Recordset 类型的常数不同于用于确定的已创建的 Recorset 类型的或者用来以 OpenRecordset 方法创建 Recorset 对象的常数。
为选择特定的 Recordset 类型,把 Data 控件的 V 属性设成:
Recordset 类型 值 常数
表 0 vbRSTypeTable
Dynaset 1 (缺省)vbRSTypeDynaset
快照 2 vbRSTypeSnapshot
重点 Data 控件不能用于访问通过 dbForwardOnly 选项位设置创建的 Recorset 对象。
专业版和企业版
就数据访问而言,Visual Basic 的学习版、专业版和企业版间的主要差别是创建新数据访问对象的能力。在学习版中,不能在代码中声明(带有 Dim 关键字的)变量为数据访问对象。这意味着只有 Data 控件能创建 Database 和 Recorset 对象。
在专业版和企业版中,可以创建新的 Recordset 对象并把它赋值给 Data 控件的 Recordset 属性。任何和 Data 控件相连的被连结的控件允许在创建的 Recordset 中操纵记录。要保证被连结的控件的 DataField 属性赋值给在新的 Recordset 中合法的字段名。
存储的查询
当使用 Data 控件时,另外一个重要选项是执行存储的查询的能力。如果事先创建 QueryDef 对象,Data 控件能执行它并用 QueryDef 对象保存的 SQL、Connect 和其它属性创建 Recordset。为了执行 QueryDef,请把 Data 控件的 RecordSource 属性设置成 QueryDef 的名字并使用 Refresh 方法。
如果所保存的 QueryDef 包含参数,则需要建立 Recordset 并把它传递给 Data 控件。
BOF/EOF 处理
当遇到无记录的 Recordset 时,Data 控件也能处理所发生的情况。通过改变 EOFAction 属性,可以通过对 Data 控件编程以自动进入 AddNew 模式。
通过使用 Align 属性,能对 Data 控件编程以使它自动移动到它父窗体的顶部或底部。在任何一种情况下,当父窗体改变大小时,Data 控件水平地改变以大小适应父窗体的宽度。该属性允许 Data 控件放在 MDI 窗体中而不必包含 Picture 控件
把表中数据写入MSHFLEXGRID控件和DataGrid控件 dim cnns as adodb.connection
dim rs as adodb.recordset
dim Sql as string
sql = "Provider=sqloledb;" & _
"Data Source=srv;Initial Catalog=pubs;User Id=sa;Password=; "
Set cnn1 = New ADODB.Connection
cnn.Open strCnn
'''首先初始化msf
With Msf
.Clear
.Rows = 2
'清空第一行的数据
.Row = 1
For i = 0 To .Cols - 1
.Col = i
.Text = ""
Next
.Cols = 8
'''定义列的宽度
.ColWidth(0) = 1500
.ColWidth(1) = 1000
.ColWidth(2) = 500
.ColWidth(3) = 1200
.ColWidth(4) = 2000
.ColWidth(5) = 1200
.ColWidth(6) = 1200
.ColWidth(7) = 1200
'''''''''''''''''''
.TextMatrix(0, 0) = "个人编码"
.TextMatrix(0, 1) = "姓名"
.TextMatrix(0, 2) = "性别"
.TextMatrix(0, 3) = "出生日期"
.TextMatrix(0, 4) = "身份证号"
.TextMatrix(0, 5) = "登记人"
.TextMatrix(0, 6) = "登记日期"
.TextMatrix(0, 7) = "家庭类型"
End With
''''''''''''''''''''''''''''''''''''''''''''''''''''
'''生成查询的sql语句
Sql = "select * from rydj where grbm<>'0'"
Set Rs = New ADODB.Recordset
Rs.Open Sql, Cnns, adOpenForwardOnly, adLockReadOnly
R = 1
If Not Rs.EOF Then
Msf.Rows = Rs.RecordCount + 1
End If
With Msf
While Not Rs.EOF
.Row = R
''个人编码
.TextMatrix(R, 0) = IIf(IsNull(Rs!grbm), "", Rs!grbm)
.TextMatrix(R, 1) = IIf(IsNull(Rs!xm), "", Rs!xm) ''姓名
''性别
Select Case Rs!xb
Case 0
.TextMatrix(R, 2) = "男"
Case 1
.TextMatrix(R, 2) = "女"
Case Else
.TextMatrix(R, 2) = "不详"
End Select
''出生日期
.TextMatrix(R, 3) = IIf(IsNull(Rs!csrq), "", Rs!csrq)
''身份证号
.TextMatrix(R, 4) = IIf(IsNull(Rs!sfzh),扮酷你的QQ头像, "",扬州最好的颧骨整形美容医院;, Rs!sfzh)
'''登记人
.TextMatrix(R, 5) = IIf(IsNull(Rs!djr), "", Rs!djr)
'''登记日期
.TextMatrix(R, 6) = IIf(IsNull(Rs!djrq), "", Rs!djrq)
'''家庭类型
Select Case Rs!jtlx
Case 0
.TextMatrix(R, 7) = "普通家庭"
Case 1
.TextMatrix(R, 7) = "特困家庭"
Case 2
.TextMatrix(R, 7) = "五保家庭"
Case Else
.TextMatrix(R, 7) = "不详"
End Select
R = R + 1
Rs.MoveNext
Wend
End With
Rs.Close
Set Rs = Nothing
End Sub
体验新版博客