在程序的开始,首先导入所需要的库:#import “c:\program files\common files\system\ado\msado15.dll” no_namespace rename(“EOF”, “adoEOF”) ,这里重命名EOF是必要的,因为典型的VC应用都已经定义了EOF作为常数-1。
参考:https://blog.csdn.net/flywithmj/article/details/7346764
#include <sql.h> //数据库头文件
#include <sqlext.h>
#include <odbcinst.h>
#include <iostream>
#import "c:\program files\common files\system\ado\msado15.dll" no_namespace rename ("EOF", "adoEOF")
BOOL bConn;
bConn=SQLConfigDataSource(NULL, ODBC_ADD_DSN, "Microsoft Access Driver (*.mdb)", ("CREATE_DB="+mdbName+" General\0").c_str()); //创建.mdb文件
if(!bConn)
std::cout<<"connect failed!!"<<std::endl;
Initialize(NULL); //初始化OLE/COM库环境
//在引入ado并初始化成功com库后,就可以使用智能指针了
_ConnectionPtr m_pConnection;
_RecordsetPtr m_pRecordset;
HRESULT hr;
try
{
hr = m_pConnection.CreateInstance("ADODB.Connection");///创建Connection对象
if(SUCCEEDED(hr))
{
hr = m_pConnection->Open(("Provider=Microsoft.Jet.OLEDB.4.0;Data Source="+"数据库文件路径如C:\\yyyy\\666.mdb").c_str(),"","",adModeUnknown); //access2003
// hr = m_pConnection->Open("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=test.accdb","","",adModeUnknown); //access2007
printf("成功连接数据库\n");
}
}
catch(_com_error e)///捕捉异常
{
printf("连接数据库失败!\n");
ogde::util::Log::getDefaultInstance()->addErrorInfo(mdbPath,"","连接数据库失败!");
return 0;
}
m_pRecordset.CreateInstance(__uuidof(Recordset)); //实例化结果集对象
try
{
_variant_t ra;
std::string sql="CREATE TABLE "+"表名"+"(";
for(int i=0,sum=vec.size();i<sum;++i)
{
if(i!=0)
sql=sql+",";
sql=sql+vec[i].mdbField+" TEXT";
}
sql=sql.append(")");
if(!m_pConnection->Execute(sql.c_str(),&ra,adCmdText))
{
std::cout<<"创建表失败";
ogde::util::Log::getDefaultInstance()->addErrorInfo(layerName,"","创建表失败");
return false;
}
}
catch(_com_error* e)
{
wprintf((const wchar_t *)(e->ErrorMessage()));
if(m_pConnection->State)
{
m_pConnection->Close();
m_pConnection= NULL;
}
CoUninitialize();
return 0;
}
Access数据库不支持事务操作,可以使用ADO类来实现类似事务操作,不过效率也不高。如果需要导入或者导出大量数据可以试试
std::string sql="INSERT INTO "+"表名"+" SELECT * FROM [Text;DATABASE="+"txt路径如 C:\\yyyy"+"].文件名如Test.txt";
m_pConnection->Execute(sql.c_str(),&ra,adCmdText);
可以将txt内容导入到数据库。 文本第一行是字段名,列之间用,分开。