已阅读5页,还剩9页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
ADO数据库开发的基本流程(1)初始化COM库,引入ADO库定义文件 (2)用Connection对象连接数据库 (3)利用建立好的连接,通过Connection、Command对象执行SQL命令,或利用Recordset对象取得结果记录集进行查询、处理。 (4)使用完毕后关闭连接释放对象。 准备工作: 为了大家都能测试本文提供的例子,我们采用Access数据库,您也可以直接在我们提供的示例代码中找到这个test.mdb。 下面我们将详细介绍上述步骤并给出相关代码。 【1】COM库的初始化 我们可以使用AfxOleInit()来初始化COM库,这项工作通常在CWinApp:InitInstance()的重载函数中完成,请看如下代码: BOOL CADOTest1App:InitInstance() AfxOleInit(); . 【2】用#import指令引入ADO类型库 我们在stdafx.h中加入如下语句:(stdafx.h这个文件哪里可以找到?你可以在FileView中的Header Files里找到) #import c:program filescommon filessystemadomsado15.dll no_namespace rename(EOF,adoEOF) 这一语句有何作用呢?其最终作用同我们熟悉的#include类似,编译的时候系统会为我们生成msado15.tlh,ado15.tli两个C 头文件来定义ADO库。 几点说明: (1) 您的环境中msado15.dll不一定在这个目录下,请按实际情况修改 (2) 在编译的时候肯能会出现如下警告,对此微软在MSDN中作了说明,并建议我们不要理会这个警告。 msado15.tlh(405) : warning C4146: unary minus operator applied to unsigned type, result still unsigned 【3】创建Connection对象并连接数据库 首先我们需要添加一个指向Connection对象的指针: _ConnectionPtr m_pConnection; 下面的代码演示了如何创建Connection对象实例及如何连接数据库并进行异常捕捉。 BOOL CADOTest1Dlg:OnInitDialog() CDialog:OnInitDialog(); HRESULT hr; try hr = m_pConnection.CreateInstance(ADODB.Connection);/创建Connection对象 if(SUCCEEDED(hr) hr = m_pConnection- Create table(access sql)自动编号Create table(access环境下)自动编号类型的写法方法一:create table tablename(id counter constraint primarykey primary key) 需要注意的地方是:第二个primary中间有空格,另外,关键字不区分大小写. 方法二:create table mytb (id autoincrement(25,1) primary key,age int)或create table testtb (id autoincrement,age int,email char, primary key (id)其中在access中,autoincrement为自动编号类型字段,(25,1)分别为初始值及步长值,如果不写的话,默认是1,1,primary key指定了主键,以上示例,两种指定方法都可以.实例:create table jf_17(id autoincrement(1,1) primary key, username text, email text, homepage text, title text, content Memo, addtime datetime, ip text, lastname text, lasttime datetime, re_count int, icon text, click int);创建一张空表:Sql=Create TABLE 表名创建一张有字段的表:Sql=Create TABLE 表名(字段名1 MEMO NOT NULL, 字段名2 MEMO, 字段名3 COUNTER NOT NULL, 字段名4 DATETIME, 字段名5 TEXT(200), 字段名6 TEXT(200)字段类型:2 : SmallInt, / 整型3 : Int, / 长整型4 : Real, / 单精度型5 : Float, / 双精度型6 : Money, / 货币7 : DateTime, / 日期时间11 : Bit, / 是否13 : TimeStamp,17 : TinyInt, / 字节72 : UniqueIdentifier, / 同步复制 ID128 : Binary,129 : Char,130 : NChar,131 : Decimal, / 小数133 : DateTime,135 : SmallDateTime,200 : VarChar,201 : Text,202 : VarChar, / 文本203 : Text, / 长文本204 : Binary, / 二进制205 : Image / OLE 对象memo 备注 以下字段为无编码字段(NChar、NVarchar、NText型)8,128,130,202,203,204,205以下字段为按当前系统内码编码的字段(Asp中可用CodePage=936纠正为gb2312内码)129,200,201在现有的表中增加字段:Sql=alter table 表名 add column 字段名 varchar(200)修改字段类型:Sql=alter table 表名 Alter COLUMN 字段名 varchar(50)删除表:Sql=Drop table 表名删除字段:sql=alter table 表名 drop 字段名修改字段:Alter TABLE 表名 Alter COLUMN 字段名 类型(大小) NULL新建约束:Alter TABLE 表名 ADD CONSTRAINT 约束名 CHECK (约束字段 = 2007-1-1)删除约束:Alter TABLE 表名 Drop CONSTRAINT 约束名新建默认值:Alter TABLE 表名 ADD CONSTRAINT 默认值名 DEFAULT Gziu.CoM FOR 字段名删除默认值:Alter TABLE 表名 Drop CONSTRAINT 默认值名=conn.open connstrsql=alter table tablename add hehe char(20)conn.execute(sql)response.write(添加成功)ACCESS新建数据库和表还不简单,有了表字段初始化就更简单=生成数据表,添加字段,其中id字段为自动增加,测试通过Sub GenAutoIncrementFld()set cn=server.CreateObject(ADODB.Connection)set clx=server.CreateObject(ADOX.Column)set cat=server.CreateObject(ADOX.Catalog)set tblnam=server.CreateObject(ADOX.Table)cn.Open Provider=Microsoft.Jet.OLEDB.4.0;Data Source=E:dbtest.mdbSet cat.ActiveConnection = cntblnam.Name = Testclx.ParentCatalog = catclx.Type = 3clx.Name = Idclx.Properties(AutoIncrement) = truetblnam.Columns.Append clxtblnam.Columns.Append DataField,130,20cat.Tables.Append tblnamSet clx = NothingSet cat = Nothingcn.CloseSet cn = NothingEnd Subcall GenAutoIncrementFld=字段类型对应数值- DataTypeEnum Values - Const adEmpty = 0 Const adTinyInt = 16 Const adSmallInt = 2 Const adInteger = 3 Const adBigInt = 20 Const adUnsignedTinyInt = 17 Const adUnsignedSmallInt = 18 Const adUnsignedInt = 19 Const adUnsignedBigInt = 21 Const adSingle = 4 Const adDouble = 5 Const adCurrency = 6 Const adDecimal = 14 Const adNumeric = 131 Const adBoolean = 11 Const adError = 10 Const adUserDefined = 132 Const adVariant = 12 Const adIDispatch = 9 Const adIUnknown = 13 Const adGUID = 72 Const adDate = 7 Const adDBDate = 133 Const adDBTime = 134 Const adDBTimeStamp = 135 Const adBSTR = 8 Const adChar = 129 Const adVarChar = 200 Const adLongVarChar = 201 Const adWChar = 130 Const adVarWChar = 202 Const adLongVarWChar = 203 Const adBinary = 128 Const adVarBinary = 204 Const adLongVarBinary = 205 Const adChapter = 136 Const adFileTime = 64 Const adPropVariant = 138 Const adVarNumeric = 139 Const adArray = &H2000 用ADO操作数据库的方法步骤 /*ADO接口简介 */ADO库包含三个基本接口:_ConnectionPtr接口、_CommandPtr接口和_RecordsetPtr接口。 _ConnectionPtr接口返回一个记录集或一个空指针。通常使用它来创建一个数据连接或执行一条不返回任何结果的SQL语句,如一个存储过程。使用_ConnectionPtr接口返回一个记录集不是一个好的使用方法。通常同Cdatabase一样,使用它创建一个数据连接,然后使用其它对象执行数据输入输出操作。_CommandPtr接口返回一个记录集。它提供了一种简单的方法来执行返回记录集的存储过程和SQL语句。在使用_CommandPtr接口时,你可以利用全局_ConnectionPtr接口,也可以在_CommandPtr接口里直接使用连接串。如果你只执行一次或几次数据访问操作,后者是比较好的选择。但如果你要频繁访问数据库,并要返回很多记录集,那么,你应该使用全局_ConnectionPtr接口创建一个数据连接,然后使用_CommandPtr接口执行存储过程和SQL语句。 _RecordsetPtr是一个记录集对象。与以上两种对象相比,它对记录集提供了更多的控制功能,如记录锁定,游标控制等。同_CommandPtr接口一样,它不一定要使用一个已经创建的数据连接,可以用一个连接串代替连接指针赋给_RecordsetPtr的connection成员变量,让它自己创建数据连接。如果你要使用多个记录集,最好的方法是同Command对象一样使用已经创建了数据连接的全局_ConnectionPtr接口,然后使用_RecordsetPtr执行存储过程和SQL语句。/*基本流程*/(1)初始化COM库,引入ADO库定义文件(2)用Connection对象连接数据库(3)利用建立好的连接,通过Connection、Command对象执行SQL命令,或利用Recordset对象取得结果记 录集进行查询、处理。(4)使用完毕后关闭连接释放对象。 /*【1】COM库的初始化*/我们可以使用AfxOleInit()来初始化COM库,这项工作通常在CWinApp:InitInstance()的重载函数中完成,请看如下代码:BOOL CADOTest1App:InitInstance() AfxOleInit(); . /*【2】用#import指令引入ADO类型库*/我们在stdafx.h中加入如下语句:#import c:program filescommon filessystemadomsado15.dll no_namespace rename(EOF,adoEOF)其最终作用同我们熟悉的#include类似,编译的时候系统会为我们生成msado15.tlh,ado15.tli两个C+头文件来定义ADO库。 /*【3】创建Connection对象并连接数据库*/首先我们需要添加一个指向Connection对象的指针:_ConnectionPtr m_pConnection;BOOL CADOTest1Dlg:OnInitDialog() CDialog:OnInitDialog(); try HRESULT hr = m_pConnection.CreateInstance(ADODB.Connection);/创建Connection对象 if(SUCCEEDED(hr) hr = m_pConnection-Open(Provider=Microsoft.Jet.OLEDB.4.0;Data Source=test.mdb,adModeUnknown);/连接数据库 /上面一句中连接字串中的Provider是针对ACCESS2000环境的,对于ACCESS97,需要改为:Provider=Microsoft.Jet.OLEDB.3.51; catch (_com_error e) /COM错误取得,当执行COM功能的时候,如果出错,可以捕捉到_com_error的异常 CString strComError; strComError.Format(错误编号: %08lxn错误信息: %sn错误源: %sn错误描述: %s, e.Error(), / 错误编号 e.ErrorMessage(), / 错误信息 (LPCSTR) e.Source(), / 错误源 (LPCSTR) e.Description(); / 错误描述 :MessageBox(NULL,strComError,错误,MB_ICONEXCLAMATION); 也可以使用UDL文件进行连接。try m_pConnection.CreateInstance(_uuidof(Connection); m_pConnection-ConnectionString =File Name=e.udl; m_pConnection-Open(,NULL); catch(_com_error e).在这段代码中我们是通过Connection对象的Open方法来进行连接数据库的,下面是该方法的原型HRESULT Connection15:Open (_bstr_t ConnectionString, _bstr_t UserID, _bstr_t Password, long Options )ConnectionString 为连接字串,UserID 是用户名, Password 是登陆密码,Options 是连接选项,用于指定Connection对象对数据的更新许可权, Options可以是如下几个常量: adModeUnknown: 缺省。当前的许可权未设置 adModeRead: 只读 adModeWrite: 只写 adModeReadWrite: 可以读写 adModeShareDenyRead: 阻止其它Connection对象以读权限打开连接 adModeShareDenyWrite: 阻止其它Connection对象以写权限打开连接 adModeShareExclusive: 阻止其它Connection对象打开连接 adModeShareDenyNone: 允许其它程序或对象以任何权限建立连接常用的数据库连接方法:(1)通过JET数据库引擎对ACCESS2000数据库的连接m_pConnection-Open(Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:test.mdb,adModeUnknown);(2)通过DSN数据源对任何支持ODBC的数据库进行连接:m_pConnection-Open(Data Source=adotest;UID=sa;PWD=;,adModeUnknown);/m_pConnection-Open(DSN=test;,0); /连接叫作test的ODBC数据源 (3)不通过DSN对SQL SERVER数据库进行连接: m_pConnection-Open(driver=SQL Server;Server=;DATABASE=vckbase;UID=sa;PWD=139,adModeUnknown);其中Server是SQL服务器的名称,DATABASE是库的名称先介绍Connection对象中两个有用的属性ConnectionTimeOut与StateConnectionTimeOut用来设置连接的超时时间,需要在Open之前调用,例如: m_pConnection-ConnectionTimeout = 5; /设置超时时间为5秒 m_pConnection-Open(Data Source=adotest;,adModeUnknown);State属性指明当前Connection对象的状态,0表示关闭,1表示已经打开,我们可以通过读取这个属性来作相应的处理,例如:if(m_pConnection-State) m_pConnection-Close(); /如果已经打开了连接则关闭它 4】/*执行SQL命令并取得结果记录集*/为了取得结果记录集,我们定义一个指向Recordset对象的指针: _RecordsetPtr m_pRecordset;并为其创建Recordset对象的实例: m_pRecordset.CreateInstance(ADODB.Recordset);SQL命令的执行可以采用多种形式,下面我们一进行阐述。(1)利用Connection对象的Execute方法执行SQL命令Execute方法的原型如下所示:_RecordsetPtr Connection15:Execute (_bstr_t CommandText, VARIANT * RecordsAffected, long Options ) 其中 CommandText 是命令字串,通常是SQL命令。 RecordsAffected 是操作完成后所影响的行数, Options 表示CommandText中内容的类型,Options可以取如下值之一: adCmdText: 表明CommandText是文本命令 adCmdTable: 表明CommandText是一个表名 adCmdProc: 表明CommandText是一个存储过程 adCmdUnknown: 未知Execute执行完后返回一个指向记录集的指针,下面我们给出具体代码并作说明。 try _variant_t ra; m_pConnection-Execute(CREATE TABLE 学生信息(学号 INTEGER,姓名 TEXT,年龄 INTEGER,生日 DATETIME),&ra,adCmdText); m_pConnection-Execute(INSERT INTO 学生信息(学号,姓名,年龄,生日) VALUES (112105, 程红秀,22,1982-08-16),&ra,adCmdText);/往表格里面添加记录 m_pRecordset = m_pConnection-Execute(SELECT COUNT(*) FROM 学生信息,&ra,adCmdText); /执行SQL统计命令得到包含记录条数的记录集 _variant_t vCount = m_pRecordset-GetCollect(_variant_t)(long)(0); /取得第一个字段的值放入vCount变量 m_pRecordset-Close(); CString message; message.Format(共有%d条记录,vCount.lVal); AfxMessageBox(message); catch (_com_error e) . (2)利用 Command对象 来执行SQL命令 try _CommandPtr m_pCommand; m_pCommand.CreateInstance(ADODB.Command); m_pCommand-ActiveConnection = m_pConnection; /关键的一句,将建立的连接赋值给它 m_pCommand-CommandText=INSERT INTO 学生信息(学号,姓名,年龄,生日) VALUES (112105, 程红秀,22,1982-08-16); m_pCommand-Execute(NULL,NULL,adCmdText); m_pCommand-CommandText=SELECT COUNT(*) FROM 学生信息; m_pRecordset=m_pCommand-Execute(NULL,NULL,adCmdText); _variant_t vCount = m_pRecordset-GetCollect(_variant_t)(long)0); /取得第一个字段的值 CString str; str.Format(共有%d条记录,vCount.lVal); AfxMessageBox(str); m_pRecordset-Close(); catch (_com_error e) .在这段代码中我们只是用Command对象来执行了SELECT查询语句,Command对象在进行存储过程的调用中能真正体现它的作用。下次我们将详细介绍。 (3)直接用Recordset对象进行查询取得记录集 例如 m_pRecordset-Open(SELECT * FROM 学生信息,_variant_t(IDispatch *)m_pConnection,true),adOpenStatic,adLockOptimistic,adCmdText);Open方法的原型是这样的:HRESULT Recordset15:Open ( const _variant_t & Source, const _variant_t & ActiveConnection, enum CursorTypeEnum CursorType, enum LockTypeEnum LockType, long Options ) 其中: Source是数据查询字符串 ActiveConnection是已经建立好的连接(我们需要用Connection对象指针来构造一个_variant_t对象) CursorType光标类型,它可以是以下值之一,请看这个枚举结构: enum CursorTypeEnum adOpenUnspecified = -1, /不作特别指定 adOpenForwardOnly = 0, /前滚静态光标。这种光标只能向前浏览记录集,比如用MoveNext向前滚动,这种方式可以提高浏览速度。但诸如BookMark,RecordCount,AbsolutePosition,AbsolutePage都不能使用 adOpenKeyset = 1, /采用这种光标的记录集看不到其它用户的新增、删除操作,但对于更新原有记录的操作对你是可见的。 adOpenDynamic = 2, /动态光标。所有数据库的操作都会立即在各用户记录集上反应出来。 adOpenStatic = 3 /静态光标。它为你的记录集产生一个静态备份,但其它用户的新增、删除、更新操作对你的记录集来说是不可见的。 ; LockType锁定类型,它可以是以下值之一,请看如下枚举结构: enum LockTypeEnum adLockUnspecified = -1, /未指定 adLockReadOnly = 1, /只读记录集 adLockPessimistic = 2, /悲观锁定方式。数据在更新时锁定其它所有动作,这是最安全的锁定机制 adLockOptimistic = 3, /乐观锁定方式。只有在你调用Update方法时才锁定记录。在此之前仍然可以做数据的更新、插入、删除等动作 adLockBatchOptimistic = 4, /乐观分批更新。编辑时记录不会锁定,更改、插入及删除是在批处理模式下完成。 ; Options请参考本文中对Connection对象的Execute方法的介绍 /*【5】记录集的遍历、更新*/根据我们刚才通过执行SQL命令建立好的 学生信息 表,它包含四个字段:学号,姓名,年龄,生日以下的代码实现:打开记录集,遍历所有记录,删除第一条记录,添加三条记录,移动光标到第二条记录,更改其年龄,保存到数据库。 try _variant_t vUsername,vBirthday,vID,vOld; _RecordsetPtr m_pRecordset; m_pRecordset.CreateInstance(ADODB.Recordset); m_pRecordset-Open(SELECT * FROM 学生信息,_variant_t(IDispatch*)m_pConnection,true),adOpenStatic,adLockOptimistic,adCmdText); while(!m_pRecordset-adoEOF) vID = m_pRecordset-GetCollect(_variant_t(long)0); /取
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- GB/T 25340-2026铁路机车车辆自动识别设备技术条件
- 2025-2030中国少儿舞蹈培训行业经营规模及未来投资预测报告
- 《巧手剪头像》教学课件-2025-2026学年辽海版(新教材)小学美术三年级下册
- 洪涝灾害个人健康防护技术指南
- 中国质量协会注册质量经理试题二
- 传统中医推拿按摩基础技法科普
- 某汽车厂生产线作业流程规范
- AI在吉尔吉斯语中的应用
- 2024水电厂辅助设备控制系统基本技术条件
- 本校培训讲座深化 课程 改革
- 高校物业合同协议
- 在线网课学习课堂《人工智能(北理 )》单元测试考核答案
- 婚内离婚协议电子版(2025年版)
- 工商企业管理实践报告1500字
- GB/T 16895.3-2024低压电气装置第5-54部分:电气设备的选择和安装接地配置和保护导体
- 八年级国测数学试卷
- 2024年全国甲卷高考历史试卷(真题+答案)
- 2023年重庆理工大学应届生招聘科研助理考试真题
- 中医养生中的药膳食疗的课件
- 《山东饮食介绍》课件
- 文旅局消防安全培训课件
评论
0/150
提交评论