编程环境:VS2013,MFC
转载自:
https://blog.csdn.net/segen_jaa/article/details/7722143
https://blog.csdn.net/cyuyan112233/article/details/51475372
https://blog.csdn.net/MoreWindows/article/details/8266682
ADO (ActiveX Data Object)主要基于COM技术,它是Microsoft数据库应用程序开发的新接口,其主要的优点是易于使用、速度快、内存支出少。
_ConnectionPtr m_pConnection;//ConnectionPtr指针用于打开、关闭一个库连接或用它的Execute方法来执行一个不返回结果的命令语句
_RecordsetPtr m_pRecordset;//_RecordsetPtr智能指针,可以用来打开库内数据表,并可以对表内的记录、字段等进行各种操作
方法1:AfxOleInit()
#import "C:\Program Files\Common Files\System\ado\msado15.dll"no_namespace\
rename("EOF", "adoEOF")rename("BOF", "adoBOF")
这一条语句将为程序导入ADO库,在编译时会生成msado15.tlh,ado15.tli来定义ADO库。
**CoInitialize()函数来初始化COM环境,与之对应CoUninitialize()**来清空COM环境。
可以看出ADO方式连接数据库也是在导入ADO库后主要使用_ConnectionPtr、_CommandPtr和_RecordsetPtr来完成访问数据库的。
更多ADO方式连接数据库的例子可以参考下面的文章:
1.http://www.vckbase.com/index.php/wv/311
2.http://www.vckbase.com/index.php/wv/118
// VC++ ADO方式访问数据库
// By MoreWindows ( http://blog.csdn.net/MoreWindows )
#include
#include
//导入ADO库
#import "c:\\program files\\common files\\system\\ado\\msado15.dll" no_namespace rename("EOF", "adoEOF")
int main()
{
//初始化com环境
CoInitialize(NULL);
_ConnectionPtr pConnect(__uuidof(Connection));
_RecordsetPtr pRecord(__uuidof(Recordset));
_CommandPtr pCommand(__uuidof(Command));
//__uuidof表示取和某个标示符相关联的GUID
try
{
//连接Sql server数据库
//数据库IP地址为222.197.165.36
//数据库名为MyTestDB 用户名sa 密码4321
pConnect->ConnectionString = "Provider=SQLOLEDB; Server=222.197.165.36; Database=MyTestDB; uid=sa; pwd=4321;";
pConnect->Open("", "", "", adConnectUnspecified);
//执行sql命令,结果记录在_RecordsetPtr中
//数据表t_student中有id, name, age三列
pCommand->put_ActiveConnection(_variant_t((IDispatch *)pConnect));
pCommand->CommandText = "select id, name from t_student where age >= 18";
pRecord = pCommand->Execute(NULL, NULL, adCmdText);
_variant_t vNum;
_bstr_t bstr;
char szName[100];
while (!pRecord->adoEOF)
{
// id
vNum = pRecord->GetCollect("id");
printf("%d ", (int)vNum.intVal);
// name
vNum = pRecord->GetCollect("name"); //如果列名不对会引发错误
bstr = vNum;
strcpy(szName, (PCSTR)bstr);
printf("%s\n", szName);
// 取下一条记录
pRecord->MoveNext();
}
}
catch (_com_error err)
{
printf("Error! %s\n", err.ErrorMessage());
}
pRecord->Close();
pConnect->Close();
pCommand.Release();
pRecord.Release();
pConnect.Release();
//清空COM环境
CoUninitialize();
return 0;
}
m_pConnection->ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0; Data Source=D:\\Data.mdb;"; //红字代表mdb位置。
如果使用上面的方式,并且数据库的路径是正确的。还报错说 : 数据库连接失败,确认数据库Data.mdb是否在当前路径下! 那么很有可能是 <数据库引擎可再发行程序> 没有安装,下载 <链接 : 数据库引擎可再发行程序包 提取码 : pret > 安装即可,再运行连接access数据库即可连接成功。
下面我是将MFC连接office2013的access数据库的代码写到一个方法里面了,在获取表名的代码里面只需要调用该类的这个方法就行。
核心代码如下:
void datamdbbase()
{
if(!AfxOleInit())
{
AfxMessageBox(_T("ADO初始化失败。"));
return;
}
try
{
CoInitialize(NULL);
m_pConnection = _ConnectionPtr(__uuidof(Connection));
//m_pConnection->Open("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=Data.mdb","","",adModeUnknown); //左边这个是office2003以下低版本链接使用
m_pConnection->ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0; Data Source=D:\\Data.mdb;"; //office高版本使用,如果连接不成功可能是 数据库引擎可再发行程序 没有安装,安装 <<数据库引擎可再发行程序包>> 即可
m_pConnection->Open("", "", "", adConnectUnspecified);
//带密码的数据库连接字符串"uid=admin;pwd=168168;DRIVER={Microsoft Access Driver (*.mdb)};DBQ=C:\\iCCard\\iCCard.mdb;"
}
catch(_com_error e)
{
AfxMessageBox("数据库连接失败,确认数据库Data.mdb是否在当前路径下!");
return;
}
}
这篇文章主要写给那些以前没有用过VS的新手,同时也是自己学习经验的积累,高手就不用看了以免浪费您宝贵的时间。
在VS的工程中常常要设置头文件的包含路径,当然你可以使用绝对路径,但是如果你这样设置了你只能在你自己的机器上运行该工程;如果其他人拷贝你的工程到其他机器上就可能无法运行,这个是因为你在建工程时可能把工程放在了E:盘,但是其他人可能会把工程放在其他根目录下,这样会导致找不到头文件问题。
对于新手,在设置绝对路径时往往会犯浑,他们不清楚这里的“相当”究竟是以什么位置为起点。其实这里的相对路径就是相当于工程文件(XXXX.vcproj)为起点零计算出的能找到包含所需头文件(也就是找包含所需头文件的include目录)的路径。
例如你的工程文件(AmarylloLib.vcproj)所在目录路径为:
F:\game\Test\TraxAmaryllo\lib\wince5_vs2005_arm_d
该工程中包含的源文件要包含一个头文件,该头文件所在路径如下:
F:\game\Test\TraxAmaryllo\include
则我们可以从工程文件AmarylloLib.vcproj所在目录为起点向上回退到包含你所需要头文件的include文件夹所在的目录目录,你回退了几次就需要几个"…"符号。
这里的相对路径设置如下:
…\include
我们来回退一下:
在AmarylloLib.vcproj当前目录下,回退一次到了包含wince5_vs2005_arm_d的文件夹lib下,再回退一次就到达了包含lib文件夹的TraxAmaryllo目录下,而在该目录下就包含我们需要包含的头文件所在的目录include目录。所有要在工程文件当前目录下要向上回退两次才能看到include目录