




已阅读5页,还剩7页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
VC与ADO数据库操作 学研部的同志们,大家好! 想开一次学习会,实习时间冲突了,只好把文档发给大家看了。重点推荐李振龙的BMP读图教程! 尤其是大三GIS班的同志,注意了,可能实习用得上的!一、 ADO简介ADO(ActiveX Data Object)是Microsoft数据库应用程序开发的新接口,是建立在OLE DB之上的高层数据库访问技术,请不必为此担心,即使你对OLE DB,COM不了解也能轻松对付ADO,因为它非常简单易用,甚至比你以往所接触的ODBC API、DAO都要容易使用,【1】为工程做准备建一个基于对话框的工程,名字叫PlaceName。加入一个ListControl控件,ID改成IDC_RESULT,顺便点一下Styles选项卡,把View改成Report,你可以看到对话框里的ListControl控件的样子已经变成带字段名的报表格式了。右击它,用ClassWizard添加成员变量,名字为m_LisCtrlResult。按照上面的程序界面,加入一个编辑框(输入SQL语句用的),同上面添加m_LisCtrlResult成员变量一样,加入一个CString变量,名字为m_SqlText,还有一个“查询”按钮,把它叫为Query,双击它一下,VC会自动为它加入消息和函数的,名字也叫OnQuery(),等一下我们就用着那个函数的。看到我们SpaceSoft的标志不?把你的照片换成BMP格式的,放上去吧!定义一下要用着的变量:class CPlaceNameDlg : public CDialog/ Constructionpublic:_RecordsetPtr m_pRecordset;/定义一个RecordsetPtr对象,用来储存读出来的表HRESULT hr;/查出后的表 Fields* fields;/储存查出后的字段BSTR bstrColName; /储存一下字段名 long nRstCol; /SQL语句一共查出了几个字段?nRstCol个!CString strColName100; /把查出的字段名转换成常见常用的CString类型,放在这个数组里边 /储存从数据库读出的数据,variant 变量能够存储所有系统定义类型的数据。【2】COM库的初始化我们可以使用AfxOleInit()来初始化COM库,这项工作通常在CWinApp:InitInstance()的重载函数中完成,请看如下代码:BOOL CPlaceNameApp:InitInstance() AfxOleInit();. 【3】用#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 【4】创建Connection对象并连接数据库首先我们需要添加一个指向Connection对象的指针,就是在PlaceName.h里加入下面一句,定义它:_ConnectionPtr m_pConnection; /前面带“_”的语句一般是VC本来没有的东西,是外来的下面的代码演示了如何创建Connection对象实例及如何连接数据库并进行异常捕捉。BOOL CPlaceNameApp:InitInstance()AfxEnableControlContainer();AfxOleInit(); /使用OLE对象时,须加这一句HRESULT hr;tryhr = m_pConnection.CreateInstance(ADODB.Connection); /创建Connection对象if(SUCCEEDED(hr)hr = m_pConnection-Open(Provider = Microsoft.Jet.OLEDB.4.0; Data Source = placename.mdb, , , adModeUnknown); /连接数据库 catch(_com_error e) /捕捉异常CString errormessage;errormessage.Format(Fail to connect the database! rn ErroeMessage:%s, e.ErrorMessage);AfxMessageBox(errormessage); /show the error messagereturn FALSE; 在这段代码中我们是通过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:允许其它程序或对象以任何权限建立连接对ACCESS2000数据库的连接(还有其他的连接方式,深入了解的话参看材料吧)【4】执行SQL命令并取得结果记录集为了取得结果记录集,我们在PlaceNameDlg.h里定义一个指向Recordset对象的指针,(刚才已经定义过了)下面为其创建Recordset对象的实例: m_pRecordset.CreateInstance(ADODB.Recordset);BOOL CPlaceNameDlg:OnInitDialog()CDialog:OnInitDialog();long i;int nItem; /暂时储存ListControl的行号trym_pRecordset.CreateInstance(ADODB.Recordset);m_pRecordset-Open(_bstr_t)m_SqlText,_variant_t(IDispatch*)theApp.m_pConnection, true),adOpenStatic,adLockOptimistic,adCmdText); /IDispatch 是关于OLE的东西,在此省略一点。我没查/hr = m_pRecordset-get_Fields (&fields);/得到记录集的字段集和/为了放下查出的数据,把ListControl原来的数据清除了先!/删除所有记录行m_LisCtrlResult.DeleteAllItems();/删除所有列表头while(m_LisCtrlResult.DeleteColumn(0);/更新窗口this-UpdateWindow();if(SUCCEEDED(hr)fields-get_Count(&nRstCol); /得到记录集的字段集合中的字段的总个数for(i = 0; i Itemi-get_Name(&bstrColName);/得到记录集中的字段名strColNamei = bstrColName;/为列表控件添加字段的名字/m_LisCtrlResult.InsertColumn(i, strColNamei, LVCFMT_LEFT, 70);/while(!m_pRecordset-adoEOF)nItem = m_LisCtrlResult.InsertItem(0, NULL); /插入新的一行。把行号放在/了nItem里边。for(i = 0; i GetCollect(_bstr_t)strColNamei),NULL, 0, 0, 0); /把读出来的数据项放入ListControl里边m_pRecordset-MoveNext(); /记得使记录指针移动哦catch(_com_error e)/捕捉异常AfxMessageBox(Fail to read the database!);/显示错误信息【4】使用SQL语句进行查询很简单,在OnQuery函数里加入两句代码就好了!void CPlaceNameDlg:OnQuery() / TODO: Add your control notification handler code here UpdateData();this-SendMessage(WM_INITDIALOG);【6】关闭记录集与连接 打开了记录集或连接,最好都关闭吧,用Close方法就可以。 m_pRecordset-Close();/关闭记录集 m_pConnection-Close();/关闭连接在我们的例程里,是在ExitInstance()函数里关掉的。怎么加呢,看看下图!下面是要加入的代码:int CPlaceNameApp:ExitInstance() / TODO: Add your specialized code here and/or call the base classif(m_pConnection-State) m_pConnection-Close(); /如果已经打开了连接则关闭它return CWinApp:ExitInstance();至此,我已经介绍完了ADO操作数据库的大致流程,同是初学ADO,这个教程中的例程已经和刚开始做的都不一样了,也没有测试,我再改的。最好把代码自己敲一遍啊,这样可以你敲出“.”“-”VC就会提醒你有什么东西能用的。文档里没说明白的就看原代码吧,不要钱的! 希望继续关注SpaceSoft!注意Connection对象的Open方法中的连接字符串参数必须是BSTR或_bstr_t类型。另外,本例是直接通过OLE DB Provider建立连接,所以无需建立数据源。From MSDN上面的代码是直接用Recordset对象进行查询取得记录集 例如m_pRecordset-Open(SELECT * FROM users,_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 CursorTypeEnumadOpenUnspecified = -1,/不作特别指定adOpenForwardOnly = 0,/前滚静态光标。这种光标只能向前浏览记录集,比如用MoveNext向前滚动,这种方式可以提高浏览速度。但诸如BookMark,RecordCount,AbsolutePosition,AbsolutePage都不能使用adOpenKeyset = 1,/采用这种光标的记录集看不到其它用户的新增、删除操作,但对于更新原有记录的操作对你是可见的。adOpenDynamic = 2,/动态光标。所有数据库的操作都会立即在各用户记录集上反应出来。adOpenStatic = 3/静态光标。它为你的记录集产生一个静态备份,但其它用户的新增、删除、更新操作对你的记录集来说是不可见的。;LockType锁定类型,它可以是以下值之一,请看如下枚举结构:enum LockTypeEnumadLockUnspecified = -1,/未指定adLockReadOnly = 1,/只读记录集adLockPessimistic = 2,悲观锁定方式。数据在更新时锁定其它所有动作,这是最安全的锁定机制adLockOptimistic = 3,乐观锁定方式。只有在你调用Update方法时才锁定记录。在此之前仍然可以做数据的更新、插入、删除等动作adLockBatchOptimistic = 4,乐观分批更新。编辑时记录不会锁定,更改、插入及删除是在批处理模式下完成。; /* VIRIANT是ACTIVEX AUTOMATION需要用到的一种变量类型, 可以称之为通用数据类型,其实它是一个结构。 Variant 变量能够存储所有系统定义类型的数据。 如果把它们赋予 Variant 变量,则不必在这些数据的类型间进行转换; VC 会自动完成任何必要的转换.程序中通过_variant_t和_bstr_t转换COM对象和C类型的数据, _variant_t类封装了OLE自治VARIANT数据类型。在C+中使用_variant_t类要比直接使用VARIANT数据类型容易得多。 _variant_t /Constructs a _variant_t object. (From MSDN) */_bstr_tMicrosoft Specific A _bstr_t object encapsulates the BSTR data type. The class manages resource allocation and deallocation, via function calls to SysAllocString and SysFreeString, and other BSTR APIs when appropriate. The _bstr_t class uses reference counting to avoid excessive overhead.BSTR是一个带长度前缀的字符串,主要由操作系统来管理的,所以要用api.主要用来和VB打交道的(VB里的string就是指它)要操作它的API函数有很多,具体可以去查一下msdn.比如SysAllocString,SysFreeString等等.vc里封装它的类如_bstr_t,及ATL中的CComBSTR等.一个 BSTR 由头部和字符串组成,头部包含了字符串的长度信息,字符串中可以包含嵌入的 null 值。BSTR 是以指针的形式进行传递的。(指针是一个变量,包含另外一个变量的内存地址,而不是数据。) BSTR 是 Unicode 的,即每个字符需要两个字节。BSTR 通常以两字节的 null 字符结束。wstr是宽字符,以双字节表示一个字符bstr是为了与原先的basic字符兼容,它的最前面的4个字节为其长度,以0结束char 1 signed char 128 to 127 The keyword char identifies a data item that has 8 bits. 嘿嘿,够全吧Visual C+开发数据库技术Visual C+提供了多种访问数据库的技术,如下所示:ODBC(Open DataBase Connectivity)MFC ODBC(Microsoft Foundation Classes ODBC) DAO (Data Access Object) OLE DB(Object Link and Embedding DataBase) ADO(ActiveX Data Object) 这些技术各有自己的特点,总结如下:ODBC ODBC是客户应用程序访问关系数据库时提供的一个统一的接口,对于不同的数据库,ODBC提供了一套统
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 高校学生考试诚信制度建设
- 幼儿语言发展评估量表及辅导策略
- 水利水电工程质量管理考试试题解析
- 家装瓷砖美缝施工标准工艺流程
- 物业公司督办事项三级响应机制方案
- 露天矿井爆破技术设计规范与案例
- 员工培训心得体会模板集
- 高中生物实验操作技能考核题
- 2025吉林长春市市直事业单位招聘高层次人才18人笔试备考试题及答案解析
- 2025陕西秦川格兰德机床有限公司招聘笔试参考题库附答案解析
- 2024外研版初中英语单词表汇总(七-九年级)中考复习必背
- 《大数据平台部署与运维》课程标准(含课程思政)
- CT检查设备十大品牌简介
- 英语中的时间表达(示范课例)
- 项目产品研发各阶段质量控制输出文件
- 2021苏教版科学(2017)五年级上册全册全单元知识点总结
- 脊柱外科进修汇报
- 《史记》上册注音版
- 苏州大学文学院语言学纲要课程笔记
- 危重症患者护理文书书写规范-课件
- 《学术英语(综合)》课后答案
评论
0/150
提交评论