请问在MFC中可以使用ADO链接数据库的方式嘛?
我先前的整个程序都是用的ODBC,如果中间穿插ADO可以嘛?
因为我也要把图片存入到数据库中,但是大部分资料都是ADO链接的,
可是当我在stafx.h中 import....之后
在程序中写入_RecordsetPtr pr它却告诉我_RecordsetPtr是不识别的,
请问这是什么原因。先谢谢了。
我先前的整个程序都是用的ODBC,如果中间穿插ADO可以嘛?
因为我也要把图片存入到数据库中,但是大部分资料都是ADO链接的,
可是当我在stafx.h中 import....之后
在程序中写入_RecordsetPtr pr它却告诉我_RecordsetPtr是不识别的,
请问这是什么原因。先谢谢了。
解决方案 »
- CRichEditCtrl如何在资源管理器中使用
- 00 B2 8A 43,这么一个十六进制数怎样转换成一个浮点数?
- 请教高手:MDI程序里文件保存,打开的问题,谢谢!
- 读JS变量问题
- 喂,那个显示“Press Any Key To Continue”的控制台函数是什么来着?快给我说!
- 怎样枚举wing2000系统所有进程?
- 想自己写个能在richedit中显示gif的控件 请问qq的ImageOle.dll 是那种com呢 就是我该怎样使用vc6的向导建这个com工程
- 程序调试
- 类成员问题
- 怎么在CSplitterWnd框架中添加CDialogBar?
- 在VC中,继承一个STATIC类,并捕获鼠标事件
- ARP包怎么填?
这句话应该是加在哪里的?:))
在stdafx.h中:
#import “c:\program files\common files\system\ado\msado15.dll” no_namespaces rename(“EOF”,”adoEOF”)二、初始化OLE/COM库环境
在App的InitInstance中:
AfxOleInit();
error C2011: 'LockTypeEnum' : 'enum' type redefinition
d:\meii\debug\msado15.tlh(214) : error C2011: 'DataTypeEnum' : 'enum' type redefinition
d:\meii\debug\msado15.tlh(258) : error C2011: 'FieldAttributeEnum' : 'enum' type redefinition
d:\meii\debug\msado15.tlh(279) : error C2011: 'EditModeEnum' : 'enum' type redefinition
d:\meii\debug\msado15.tlh(287) : error C2011: 'RecordStatusEnum' : 'enum' type redefinition
d:\meii\debug\msado15.tlh(407) : warning C4146: unary minus operator applied to unsigned type, result still unsigned
d:\meii\debug\msado15.tlh(530) : error C2011: 'ParameterDirectionEnum' : 'enum' type redefinition
Generating Code...
Error executing cl.exe.Meii.exe - 6 error(s), 1 warning(s)
/***********************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 files\common files\system\ado\msado15.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("错误编号: %08lx\n错误信息: %s\n错误源: %s\n错误描述: %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)
{....}
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=127.0.0.1;DATABASE=vckbase;UID=sa;PWD=139","","",adModeUnknown);
其中Server是SQL服务器的名称,DATABASE是库的名称◆先介绍Connection对象中两个有用的属性ConnectionTimeOut与State
ConnectionTimeOut用来设置连接的超时时间,需要在Open之前调用,例如:
m_pConnection->ConnectionTimeout = 5; //设置超时时间为5秒
m_pConnection->Open("Data Source=adotest;","","",adModeUnknown);State属性指明当前Connection对象的状态,0表示关闭,1表示已经打开,我们可以通过
读取这个属性来作相应的处理,例如:
if(m_pConnection->State)
m_pConnection->Close(); //如果已经打开了连接则关闭它
我是在在stdafx.h中:
加入的,
二:在App的InitInstance中:
AfxOleInit();
那InitInstance里面的原来的代码要删嘛?可是还是出现下面这些错误:\meii\debug\msado15.tlh(214) : error C2011: 'DataTypeEnum' : 'enum' type redefinition
d:\meii\debug\msado15.tlh(258) : error C2011: 'FieldAttributeEnum' : 'enum' type redefinition
d:\meii\debug\msado15.tlh(279) : error C2011: 'EditModeEnum' : 'enum' type redefinition
d:\meii\debug\msado15.tlh(287) : error C2011: 'RecordStatusEnum' : 'enum' type redefinition
d:\meii\debug\msado15.tlh(407) : warning C4146: unary minus operator applied to unsigned type, result still unsigned
d:\meii\debug\msado15.tlh(530) : error C2011: 'ParameterDirectionEnum' : 'enum' type redefinition
错误,是什么原因呢?
是不是在step 5 OF 6中
使用MFC lib
有两个选项: D当共享DLL
还有一个是s当statically链接库,
我选择的是D当共享DLL
initinstance()函数不需要删除任何代码,afxoleinit()加到前面一点就行了。上面几位的蛮详细的。