MFC ADO 数据库连接.doc





《MFC ADO 数据库连接.doc》由会员分享,可在线阅读,更多相关《MFC ADO 数据库连接.doc(12页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、初始化COM库民邮电出版社 明日科技 出版的Visual C+ 管理信息系统完整项目实例剖析,该书只讲了一个系统,完整剖析了该管理信息系统。在工程的App类的InitInstance ( )函数里面加上AfxOleInit ( );/MFC用法C+的常规方法是-:CoInitialize(NULL);.:CoUninitialize();3)使用记录集对象得到一个纪录集的基本步骤 /生成一个Connection对象,并连结上数据库_ConnectionPtr m_pConnection; HRESULT hr;tryhr=m_pConnection.CreateInstance(_uuidof
2、(Connection);if(SUCCEEDED(hr)m_pConnection-Open(Provider=Microsoft.Jet.OLEDB.4.0;Data Source=小学.mdb,adModeUnknown);catch(_com_error e)CString errormessage;errormessage.Format(连接数据库失败!rn错误信息:%s,e.ErrorMessage();AfxMessageBox(errormessage);/生成RecordSet对象,并得到纪录集_RecordsetPtr m_pRecordset;m_pRecordset.C
3、reateInstance(ADODB.Recordset);CString temp=SELECT * FROM +tablename;/tablename假设是一个CString类型的表名_variant_t sql;sql.SetString(temp);m_pRecordset-Open(sql, m_pConnection.GetInterfacePtr( ), adOpenDynamic,adLockOptimistic,adCmdText );4)动态查询CString tablename;tablename=_T(学籍);CString temp=_T(SELECT * FRO
4、M )+tablename+_T( WHERE NAME=)+dlg.m_name+_T();_variant_t sql;sql.SetString(temp);m_pRecordset-Open(sql,m_pConnection.GetInterfacePtr(),adOpenDynamic,adLockOptimistic,adCmdText);5)遍历纪录集int line=0;while(!m_pRecordset-adoEOF)/遍历记录集,并将所有纪录显示在列表视图中。line+;m_pRecordset-MoveNext();其余操作都很简单,可以参见其他文章,最关键的是,不
5、要忘了关闭纪录集,因为这通常会造成异常6)使用ADO连接不同的数据库的方式:根据不同的数据提供者可以分为ODBC和OLEDB等若干种方式,ODBC兼容性更好,支持OLEDB的数据库相对少一点;连接SQL Server数据库:1) Microsoft OLE DB Provider for ODBCm_pConnection-Open(“Provider=SQLOLEDB.1;DRIVER=SQLServer;SERVER=lzhm;DATABASE=haitang”,sa,sa,adModeUnknown);2)未知方法,但是可行,注意Initial Catalog用空格分开m_pConnec
6、tion-Open(“Provider=SQLOLEDB.1;Data Source=lzhm;Initial Catalog=haitang”,sa,sa,adModeUnknown);m_pConnection-Open (Provider=SQLOLEDB;Data Source=172.20.2.97;Network Library=DBMSSOCN;Initial Catalog=haitang,”sa”,”sa”,adModeUnknown);m_pConnection-Open (Provider=SQLOLEDB;Network Address=172.20.2.97;Init
7、ial Catalog=haitang,”sa”,”sa”,adModeUnknown);m_pConnection-Open (Provider=SQLOLEDB;Network Address=172.20.2.97; Network Library=DBMSSOCN;Initial Catalog=haitang,”sa”,”sa”,adModeUnknown);3)Microsoft OLE DB Provider for SQL Serverm_pConnection-Open(“Provider=SQLOLEDB.1;Data Source=lzhm;Initial Catalog
8、=haitang”,sa,sa,adModeUnknown);4)不使用DSN进行连接m_pConnection-Open(driver=SQL Server;server=lzhm;database=haitang”,sa,sa,adModeUnknown);连接ACCESS 2000数据库的方式:m_pConnection-Open(Provider=Microsoft.Jet.OLEDB.4.0;Data Source=小学.mdb,adModeUnknown);连接ACCESS 97数据库的方式:m_pConnection-Open(Provider=Microsoft.Jet.OLE
9、DB.3.51;Data Source=小学.mdb,adModeUnknown);7)一个常用的函数,传递一句SQL语句,然后打开一个记录集,假设记录集对象m_pRecordset存在:BOOL CHaiTangView:GetRecordSet(CString sql)/如果生成的记录集不为空,就返回TRUEif(m_pRecordset-GetState()=1)/如果记录集对象已经打开,则先关闭m_pRecordset-Close();HRESULT hr;_variant_t v_sql;v_sql.SetString(sql);tryhr=m_pRecordset-Open(v_s
10、ql,m_pConnection.GetInterfacePtr(),adOpenDynamic,adLockOptimistic,adCmdText); if(SUCCEEDED(hr)catch(_com_error e)CString errormessage;errormessage.Format(查询数据表失败!rn错误信息:%s,e.ErrorMessage();AfxMessageBox(errormessage);return 0;m_pRecordset-MoveFirst();if(!m_pRecordset-adoEOF)/用SUCCEEDED(hr)无法判断记录集的生成
11、是否为空 /所以要用生成后的纪录集的最大纪录数是否为0来判别return TRUE; /SUCCEEDED(hr)应该是来判别异常的,纪录集为空不属于异常else MessageBox(对不起,找不到符合条件的纪录,请联系系统管理员);return FALSE;8)调用Recordset:PutCollect出现的问题:select 岸线属性表.序号,s1.NAME,岸线属性表.岸线性质,岸线属性表.起点桩号,岸线属性表.终点桩号,岸线属性表.岸线长度,岸线属性表.堤顶高程,岸线属性表.结构形式小类,岸线属性表.结构形式大类,岸线属性表.达标标准,岸线属性表.地域位置,岸线属性表.备注 fro
12、m 岸线属性表,数据字典表 AS s1 where s1.ID=岸线属性表.岸线名 ORDER BY 岸线属性表.序号select * from 海塘绿化表 ORDER BY 序号select 岸线属性表.序号,s1.NAME,s2.NAME from 岸线属性表,数据字典表 AS s1,数据字典表 AS s2 where s1.ID=岸线属性表.岸线名 AND s2.ID=岸线属性表.责任单位 ORDER BY 岸线属性表.序号在海塘开发的过程中,发现如果使用了RecordSet:Open的方法调用SQL语句打开记录集,如果SQL语句中使用了ORDER BY语句,在使用Recordset:P
13、utCollect方法将数据写入就会出错,至少这是使用VC、ADO和SQL Server7.0或者2000的情况。9)调用存储过程,在ATL里面的存储过程STDMETHODIMP CFBGET:GetDataByProc(BSTR bstrProcName, BSTR bstrParam, BSTR* plPower)/ TODO: Add your implementation code here*plPower = NULL;USES_CONVERSION;/建立和数据库的连接_ConnectionPtr m_pCon;m_pCon.CreateInstance(_uuidof(Conne
14、ction);char array200;GetWindowsDirectory(array,200);strcat(array,FB_DATA.INI);char servername100;GetPrivateProfileString(ServerName,NAME,servername,100,array);char str_con1024;wsprintf(str_con,Provider=SQLOLEDB.1;Data Source=%s;Initial Catalog=haitang;User ID=haitang;PWD=haitang,servername);m_pCon-O
15、pen(str_con,adModeUnknown);/建立命令对象_CommandPtr m_pCommand;m_pCommand.CreateInstance(ADODB.Command);m_pCommand-ActiveConnection = m_pCon;_variant_t name=proc_user;BSTR bname=SysAllocString(OLESTR(proc_user); m_pCommand-CommandText=bname;m_pCommand-CommandType=adCmdStoredProc;/将参数转换成char*类型,提取出两个char*参
16、数char *p=W2A(bstrParam);char* temp=p;char* p1=temp;while(*temp!=T)temp+;*temp=0;temp+;char* p2=temp;while(*temp!=T)temp+;*temp=0;/将两个参数转换成BSTR类型BSTR bstrP1=A2W(p1);BSTR bstrP2=A2W(p2);/建立参数对象1_ParameterPtr p_Param1;p_Param1.CreateInstance(ADODB.Parameter);p_Param1-Name=name;p_Param1-Type=adVarChar;p
17、_Param1-Size=50;p_Param1-Direction=adParamInput;p_Param1-Value=bstrP1;m_pCommand-Parameters-Append(p_Param1);/建立参数对象2_ParameterPtr p_Param2;p_Param2.CreateInstance(ADODB.Parameter);p_Param2-Name=key;p_Param2-Type=adVarChar;p_Param2-Size=50;p_Param2-Direction=adParamInput;p_Param2-Value=bstrP2;m_pCom
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- MFC ADO 数据库连接

限制150内