1主要内容数据库访问概述ODBC数据源ADO对象(基于OLEDB标准)数据控件与数据绑定的控件数据绑定的对话框第9讲访问数据库29.1数据库访问概述主要方法开放数据库连接(ODBCOpenDatabaseConnectivity)数据访问对象(DAODataAccessObject)ActiveX数据对象(ADOActiveXDataObject)3ODBCODBC管理器在Windows控制面板中,包含连接数据源所需信息,即为每套连接建立(DataSourceNames)DSNODBC驱动器ODBC驱动程序,包含需处理的数据源信息适用于访问关系型数据库编程只需知道DSN和SQL应用程序SQL语句ODBC管理器DSNODBC数据源ODBCAPIODBCAPI4ODBC对数据库的操作不依赖任何DBMS每个DBMS提供自己的ODBC驱动程序能以统一的方式处理各种数据库要访问一个数据库,需要先用“ODBC数据源管理器”把它注册为一个ODBC数据源VC++6.0可以安装的ODBC驱动程序:SQLServerAccessFoxproOracleExcel其他5DAO是第一个面向对象的接口最初用于Access等产品中依赖于用Access自动获得的MicroSoftJet数据库引擎在这种方案中Access运行良好,但在SQLServer,Oracle网络环境中运行不好有被ADO取代的趋势6ADO是一种特殊的OLEDB客户程序OLE数据库(OLEDataDase)OLE——对象连接与嵌入ObjectLinkingandEmbeddingOLEDB提供统一的数据访问接口除了各种关系数据库外,还包括:邮件数据、Web上的文本或图形、目录服务、……被多种语言支持(VC++、VB、Java等)支持客户/服务器模式和基于Web的数据操作7ADOSQL语句,ADO对象库DSNODBC数据源ADOOLEDBODBC管理器JetSQLServerExchangeOracle8ADO模型中的对象Connection对象:处理与数据源之间的连接,并使用事务机制,提供初始化Command对象:处理传递给数据源的命令RecordSet对象:处理SQL查询返回的记录数据,允许用户编辑,添加和删除数据Field对象:处理记录集中的列信息Parameter对象:对传递给数据源的命令赋参数值Property对象:操作在ADO中使用的其他对象的详细属性Error对象:获得连接对象所发生的错误信息9ADO模型中的集合Error集合:任何包含ADO对象的操作都可能产生提供者错误,当错误发生时,错误对象被放在错误集合中,每个错误对象代表一个提供者错误Parameter集合:Command对象包含了Parameter对象集合,参数集合包含了应用于Command对象的所有参数对象Field集合:RecordSet对象包含Field对象的集合,Field对象集合包含了Field对象Properties集合:包含了个对象的属性109.2ODBC操作MFC中与ODBC有关的主要类CDatabase(数据库类)提供对数据源的连接等操作CRecordSet(记录集类)代表从数据源选择的一组记录(记录集)对记录集中记录进行滚动、添加、修改、删除等操作CRecordView(记录集视图类)是CFormView的派生类,用于派生视图窗口提供一个表单视图与某个记录集直接关联可用DDX在记录集与变淡视图的控件之间传递数据11创建ODBC数据源创建一个数据库在Windows中创建数据源“控制面板”、“管理工具”、“数据源(ODBC)”在“用户DSN”卡中单击“添加”选“MicrosoftAccessDriver(*.mdb)”在打开的对话框中输入数据源名称,单击“选择”在打开的对话框中选择数据库,单击“确定”,则该数据源显示在“用户数据源”列表中12在MFC中选择数据源创建一个单文档应用程序(ODBCStudent)在第2步选“数据库查看使用文件支持”视图类将从CRecordView派生,全面支持文档操作和数据库操作单击“DataSource”选“ODBC”,并选已经建立的数据源在“Recordsettype”中“Snapshot”(快照),单击“OK”选择数据表(例如students),单击“OK”,回到第2步界面继续后面的步骤13生成的程序中添加的内容在生成的程序中添加了一个ODBCStudentSet类它与students表进行数据绑定负责数据表的操作有与students表对应的数据成员视图类由CRecordView派生CRecordView由CFromView派生可以直接使用控件视图类中添加了一个CODBCStudentSet类指针:m_pSet指向文档类的CODBCStudentSet类对象m_oDBCStudentSet14设计浏览记录的界面为表中的每个字段设计一个控件编辑框用于显示字符型、数值型字段DateTimePicker用于显示日期型字段编译错误:'DDX_FieldDateTimeCtrl':undeclaredidentifier解决方案DDX_FieldDateTimeCtrl改为DDX_DateTimeCtrl去掉()中的最后一个参数为每个用于显示字段的控件关联相应的变量这些变量已经在CODBCStudentSet类中存在15浏览数据库运行后界面切换记录169.3在基于对话框的应用程序中使用ADO技术使用Data控件使用ADO的data控件控制数据库的连接和记录切换使用ADO的数据绑定控件显示或编辑数据库中的记录不需编写代码利用对话框编辑器添加控件使用数据绑定(data-bound)对话框生成一个对话框生成控制记录切换的按钮生成显示记录每个字段的控件不需编写代码17使用Data控件添加ADOData控件(ADODataControl)并设置属性控制数据库的连接控制记录的切换添加数据绑定控件(Data-BoundControls)并设置属性显示、编辑数据库中的数据18添加ADOData控件创建一个基于对话框的应用程序添加ADOData控件(ADODataControl)并设置属性添加的步骤选“工程”、“添加工程”、“ComponentsandControls…”双击对话框中“RegisteredActiveXControls”选“MicrosoftADODataControlsVersion6.0(OLEDB)”,并单击“Insert”,再单击“OK”单击“OK”,“结束”在工程中添加了若干类在控件工具箱窗口中添加了一个ADODataControl控件图标19添加ADOData控件设置属性在对话框中画一个数据控件,并打开属性窗口设置ID(例如IDC_ADODC1)和标题(例如Adodc1)设置连接资源(数据库)选“通用”、“使用连接字符串”,单击“生成”选“MicrosoftJet4.0OLEDBprovider”(Access),“下一步”输入或选择数据库名称单击“测试连接”,连接成功后,单击“OK”设置数据源类型,选“数据源”,命令类型:“adCmdTable”表:选择数据库中的一个表注:若命令类型为“adCmdText”,则在“命令文本”中输入SQL语句20ADOData控件的几个消息WillMove记录集被打开,或当前记录位置变化(记录指针移动)MoveComplete——WillMove消息之后WillChangeField——数据属性值被修改时FieldChangeComplete——WillChangeField之后WillChangeRecord——记录被更新时RecordChangeComplete——WillChangeRecord之后InfoMessage当数据提供者(数据源)返回一个结果21添加ADOData-Bound控件添加数据绑定控件(显示数据)并设置属性添加的步骤选“工程”、“添加工程”、“ComponentsandControls…”双击对话框中“RegisteredActiveXControls”选“MicrosoftDataGridControlsVersion6.0(OLEDB)”,并单击“Insert”,再单击“OK”单击“OK”,“结束”在工程中添加了若干类在控件工具箱窗口中添加了一个DataGridControl控件图标22添加ADOData-Bound控件设置属性在对话框中画一个数据绑定控件,并打开属性窗口设置ID和标题在“All”中设置数据源()设置DataSource值为数据控件的ID(例如IDC_ADODC1)在“All”中设置允许的数据操作(也可在“通用”中设置)设置AllowAddNew、AllowArrows、AllowDelete、AllowUpdate在其他选项卡中设置其他属性23运行界面24其他数据绑定控件DataList类似于列表框DataCombo类似于组合框MSFlexGrid可以显示网格数据(与DataGrid类似)无表处理的常用功能(添加、修改、删除等)RemoteData和DBGridRemoteData为DBGrid提供数据源有表处理的常用功能25添加VC++部件(与添加data控件类似)添加的步骤选“工程”、“添加工程”、“ComponentsandControls…”双击对话框中“VisualC++Components”选“ADODataBoundDialog”,并单击“Insert”,再单击“OK”,打开ADODataBoundDialogWizardTheADODataBoundDialogWizard共4步编写打开此对话框的代码例如,在应用程序类的InitInstance()中添加CRsCgDlgdlg;dlg.DoModal();应用程序类的cpp文件中加#includeRsCgDlg.h使用数据绑定(data-bound)对话框26ADODataBoundDialogWizard第1步:建立连接字符串单击“build”,出现“数据连接属性”(DataLinkproperties)对话框MicrosoftJet4.0OLEDBprovider(对于Access)选择已有数据库的名字,测试连接是否能够成功,按“OK”查看生成的连接字符串第2步:选择数据源CommandText——输入SQL语句Table——选择数据表27ADODataBoundDialogWizard第3步:选择游标指针(SelecttheCursor)游标位置(CursorLocation)adUseClient:结果集放在客户机的缓冲区内,速度块,无法感觉他人对数据库的修改(不敏感)adUseServer:结果集放在服务器的缓冲区内,对数据的变化较敏感游标类型(CursorType)adOpenDynamic(动态游标):其他用户对记录的改变会体现在记录集中adOpenStatic(静态游标):其他用户对记录的改变不体现在记录集中adOpenForwardOnly(向前游标):与静态游标类似,但只能在记录集中向前移动adOpenKeyset(关键字游标):能反映他用户对记录的修改与删除,但不显示他用户添加的新记录第4步:确认单击“完成”28添加的新内容添加了一个对话框默认ID为:CG_IDD_RECORDSET切换记录的按钮显示所有字段的控件可以根据需要修改资源(添加控件)添加了代码CCustomRs类CRsCgDlg类29添加的代码CCustomRs类只有.h文件,没有.cpp文件其父类是CADORe