::首页文档中心在线杂志ADO[在线杂志第21期][原创文档本文适合中级读者已阅读55544次]文档使用ADO封装类的数据库程序开发实例[第二版](上)作者:成真下载本文示例工程从上次在VC知识库发表《使用ADO封装类的数据库程序开发实例》一文后,得到许多网友的响应,甚觉欣慰。但由于我对ADO也非完全精通,所以上次写的类很不完美,甚至可能给某些朋友带来麻烦,因此一直想把它写得更完善一点。现在写的这个类功能应该说比较完善了,基本上封装了ADO组件的大部分方法,并扩展了一些人们常用到的方法,如把文件或图片写到数据库中,从数据库中读出位图字段,字段的值的智能转换等等。因为实在是时间不够,我几乎没有对command类做任何有效的测试,也没有写相关的文档,而对connection和recordset类的文档,也写得不甚明了,也许有人又要说我很不负责任了。呵呵!在这个测试程序中,我对连接类和记录集类的大部分方法进行了测试,包括对常用数据类型的存取,添加删除等等,还有对多种数据类型以整型,双精度型,字符型类型的变量读取,其中以字符型兼容性最好,基本上对大部分数据都能返回有效值,其次是双精度型,和整型,它们不能读取字符型,日期型等字段的值.另外对这两个象的属性进行了一些测试,当然有好多属性是没法全面测试得到的。我在开发ADO相关程序中切身体会到有几个方法是很有用的方法,如SetFilter,SetSort,Find,书签等等,它们可以让你很有效的操纵记录,而不用老去想怎样去构建SQL语句来实现这样功能。其中还有一个导入导出xml文件的方法,我不知道这个方法是不是很有用,因为它对中文支持不是很好,导出的xml文件中没法正常显示中文.最后还一个就是datagrid控件与记录集绑定,我觉得这应该是一个比较有用的技巧,我以前都没想到过,在VC中也可以学VB一样绑定数据库的,这样不用写什么代码就可以方便地修改数据了。代码在(vc6+sp5)/vc7+windowsXP英文专业版/windows2000中文专业版/windows2003英文测试版/windows2003中文企业版下编译通过,并在access,sqlserver,mysql下进行了测试,除mysql不支持事务等方法外,大部分方法都可以通过测试.在原则上,我默许您自由地使用,修改,或传播此代码,但您要是用在某某项目中或用于商业用途,那请您注意了,我不会对因代码bug问题,或版权问题对您造成的损失负任何责任。由于初次封装如此多又不是很熟悉的东西,有什么不当之处还请大家多指教.本文代码运行效果图如下:下面详细介绍这几个封装类:CAdoConnectionclass类成员:构造函数:CAdoConnection()创建Connection对象.Open方法:BOOLCAdoConnection::Open(LPCTSTRlpszConnect,longlOptions)连接到数据源.Params:[lpszConnect]:连接字符串,包含连接信息.[lOptions]:可选.决定该方法是以同步还是异步的方式连接数据源.可以是如下某个常量:[常量][说明]adConnectUnspecified(默认)同步方式打开连接.adAsyncConnect异步方式打开连接.Ado用ConnectComplete事件来通知已经完成连接.BOOLCAdoConnection::ConnectSQLServer(CStringdbsrc,CStringdbname,CStringuser,CStringpass,longlOptions)连接到SQLServer数据库.BOOLCAdoConnection::ConnectAccess(CStringdbpath,CStringpass,longlOptions)连接到Access数据库.Params:[dbpath]:AccessMDB数据库文件路径名.[pass]:访问密码.[dbsrc]:SQLSERVER服务器名.[dbname]:默认的数据库名.[user]:用户名.OpenUDLFile方法:BOOLCAdoConnection::OpenUDLFile(LPCTSTRstrFileName,longlOptions)通过打开udl文件连接数据库.Params:[strFileName]:UDL数据库连接文件路径名.//访问SQLServer的例子:CAdoConnectionpAdoConnection;CStringstrConnection=_T(Provider=SQLOLEDB.1;PersistSecurityInfo=False;IntegratedSecurity=SSPI;DataSource=cz\\xyy;InitialCatalog=NoteBook;);if(pAdoConnection.Open(LPCTSTR(strConnection))){DoSomething();}...或者:if(pAdoConnection.ConnectSQLServer(cz\\xyy,NoteBook,sa,007)){DoSomething();}//访问ACCESS的例子:CAdoConnectionpAdoConnection;CStringstrConnection=_T(Provider=Microsoft.Jet.OLEDB.4.0;DataSource=C:\\dbTest.mdb);pAdoDb.SetConnectionString(strConnection);if(pAdoConnection.Open(LPCTSTR(strConnection))){DoSomething();}...或者:if(pAdoConnection.ConnectAccess(C:\\dbTest.mdb,007)){DoSomething();}...Close方法:voidCAdoConnection::Close()关闭与数据源的连接.Remarks:使用Close方法可关闭Connection对象以便释放所有关联的系统资源.关闭对象并非将它从内存中删除,可以更改它的属性设置并且在此后再次打开.在超出Connection对象作用域或重新连接新的数据库时会自动调用此方法.Execute方法:_RecordsetPtrCAdoConnection::Execute(LPCTSTRlpszSQL,longlOptions)执行指定的查询、SQL语句、存储过程等.Remarks:请参考CAdoRecordSet类的Open方法.返回的Recordset对象始终为只读、仅向前的游标.连接对象的此方法一般用来执行一些不用返回记录集的SQL语句.不需要为了执行一条小语句而动用RecordSet对象,显得更为灵活点.如:if(pAdoConnection.IsOpen()){pAdoConnection.Execute(DeleteFromstudentWherenumber=3);}Cancel方法:BOOLCAdoConnection::Cancel()Remarks:请参考CAdoRecordSet类Cancel方法.GetLastErrorText方法:CStringCAdoConnection::GetLastErrorText()取得最后发生的错误信息.Remarks:任何涉及ADO对象的操作都可以产生一个或多个提供者错误.产生错误时,可以将一个或多个Error对象置于Connection对象的Errors集合中.其他ADO操作产生错误时,将清空Errors集合,并且将新的Error对象置于Errors集合中.每个Error对象代表特定的提供者错误,而不是ADO错误.ADO错误被记载在运行时的异常处理机制中.没有产生错误的ADO操作对Errors集合没有影响.使用Clear方式可手工清除Errors集合.ErrorsPtrCAdoConnection::GetErrors()获得错误集对象指针.ErrorPtrCAdoConnection::GetError(longindex)获得错误对象指针.IsOpen属性:BOOLCAdoConnection::IsOpen()检测连接对象是否为打开状态.ConnectTimeOut属性:BOOLCAdoConnection::SetConnectTimeOut(longlTime)longCAdoConnection::GetConnectTimeOut()设置或取得连接超时时间.ProviderName属性:CStringCAdoConnection::GetProviderName()取得Connection对象提供者的名称.Version属性:CStringCAdoConnection::GetVersion()取得当前使用的ADO的版本号State属性:longCAdoConnection::GetState()取得对象的状态(同Recordset对象的GetState方法).returns:返回下列常量之一的长整型值(连接对象一般为下面两种状态之一).[常量][说明]adStateClosed指示对象是关闭的.adStateOpen指示对象是打开的.Remarks:可以随时使用State属性取得指定对象的当前状态.Mode属性:ConnectModeEnumCAdoConnection::GetMode()BOOLCAdoConnection::SetMode(ConnectModeEnummode)设置或取得在Connection对象中修改数据的可用权限.returns:返回以下某个ConnectModeEnum的值.[常量][说明]adModeUnknown默认值.表明权限尚未设置或无法确定.adModeRead表明权限为只读.adModeWrite表明权限为只写.adModeReadWrite表明权限为读/写.adModeShareDenyRead防止其他用户使用读权限打开连接.adModeShareDenyWrite防止其他用户使用写权限打开连接.adModeShareExclusive防止其他用户打开连接.adModeShareDenyNone防止其他用户使用任何权限打开连接.Remarks:使用Mode属性可设置或返回当前连接上提供者正在使用的访问权限.只能在关闭Connection对象时方可设置Mode属性.OpenSchema方法:_RecordsetPtrCAdoConnection::OpenSchema(SchemaEnumQueryType)从数据源获取数据库信息.Params:[QueryType]:所要运行的模式查询类型,下面列出一些较常用的类型及返回的表中多条字段中主要的字段名.adSchemaAssertsCONSTRAINT_NAMEadSchemaCatalogsCATALOG_NAMEadSchemaCharacterSetsCHARACTER_SET_NAMEadSchemaCheckConstraintsCONSTRAINT_NAMEadSchemaCollationsCOLLATION_NAMEadSchemaColumnDomainUsageDOMAIN_NAMECOLUMN_NAMEadSchemaColumnPrivilegesTABLE_NAMECOLUMN_NAMEGRANTORGRANTEEadSchemaColumnsTABLE_NAMECOLUMN_NAMEadSchemaConstraintColumnUsageTABLE_NAMECOLUMN_NAMEadSchemaConstraintTableUsageTABLE_NAMEadSchemaForeignKeysPK_TABLE_NAMEFK_TABLE_CATALOGFK_TABLE_SCHEMAFK_TABLE_NAMEadSche