vc6.0 ADO访问数据库
2013-12-05 20:09
417 查看
最近做一个蛋疼的项目会用到ACCESS数据并从中读取数据,由于之前没搞过VC的项目,经过几番磕磕碰碰总算搞好了,遂将解决流程记录下来:
首先吐槽下微软在版本兼容性方面的缺陷,搞得我是蛋疼得不得了啊,若非高人相助现在已可能经吐血身亡了
废话少说上代码:
以下代码环境:win7 32位+VC6.0
目标环境: XP 32位 无VC
添加头文件:
#import "C:\program files\common files\system\ado\msado15.dll" rename_namespace("ADONameSpace") rename("EOF","adoEOF")
实现代码:
BOOL CTest2::fnGetTestResult(E_FAILTYPE &eGetResultError)
{
CString csFilePath ;
CString csErrorInfo;
CString csInfo;
BOOL bIsFind = FALSE;
if (" "==m_csTestReortFile)
{
return FALSE;
}
ADONameSpace::_ConnectionPtr pConnection;
ADONameSpace::_CommandPtr pCommand;
ADONameSpace::_RecordsetPtr pRecordset;
::CoInitialize(NULL); //初始化COM环境
HRESULT hr;
try
{
//hr=pConnection.CreateInstance(__uuidof(ADONameSpace::Connection)); //这两句CreateInstance我试过都可以
hr=pConnection.CreateInstance("ADODB.Connection");
if(FAILED(hr))
{
_com_error e(hr);
AfxMessageBox(e.ErrorMessage()); //打印出错信息
return false;
}
csErrorInfo.Format("创建数据库连接实例成功\r\n");
OutputText(1,csErrorInfo,RGB(1,0,0));
//m_pConnection->ConnectionString="File Name=LinkDatabase.udl";
pConnection->ConnectionTimeout=5;//等待连接的时间为5s
hr=pConnection->Open((_bstr_t)("Provider=Microsoft.Jet.OLEDB.4.0;Data Source="+m_csTestReortFile),"","",ADONameSpace::adConnectUnspecified);//m_csTestReortFile是要打开的数据库文件绝对目录
if(FAILED(hr))
{
csErrorInfo.Format("打开文件 \"%s\" 失败\r\n",csFilePath);
OutputText(1,csErrorInfo,RGB(255,0,0));
return false;
}
}
hr = pRecordset.CreateInstance(__uuidof(ADONameSpace::Recordset));
pRecordset->Open("SELECT * FROM CaseTable",pConnection.GetInterfacePtr (),ADONameSpace::adOpenDynamic, \
ADONameSpace::adLockOptimistic,ADONameSpace::adCmdText);//CaseTable是ACCESS数据库中的一个表格
while(VARIANT_FALSE == pRecordset->adoEOF)
{
CString csResult;
CString csCaseName;
_variant_t vFieldValue;
vFieldValue = pRecordset->GetCollect("LastResult");//获取LastResult列对应的值
csResult = (char*)_bstr_t(vFieldValue);
vFieldValue = pRecordset->GetCollect("CaseName");
csCaseName = (char*)_bstr_t(vFieldValue);
if (csCaseName == m_csTestUnitText)
{
bIsFind = TRUE;
if ("RPT_BLOCK" == csResult)
{
eGetResultError = GET_RESULT_BLOCK;
break;
}
else if ("RPT_NG" == csResult )
{
eGetResultError = GET_RESULT_NG;
break;
}
else if ("RPT_OK" == csResult )
{
eGetResultError = GET_RESULT_OK;
break;
}
}
pRecordset->MoveNext(); //移到CaseTable中的下一行
}
if (FALSE == bIsFind)
{
eGetResultError = GET_RESULT_NOTFIND;
}
}
catch(_com_error e)
{
eGetResultError = GET_RESULT_OTHER;
return FALSE;
}
return TRUE;
}
代码在win7 32位+VC6.0中运行毫无问题,但是拿到XP上就出问题了
hr=pConnection.CreateInstance("ADODB.Connection");词句出错提示不支持此接口;
开始怀疑是xp上的msado15.dll文件损坏,在网上找了点方法验证了下:
1.在C:\Program Files\Common Files\System\ado下找到msado15.dll
在命令行输入命令: regsvr32 C:\Program Files\Common Files\System\ado\msado15.dll (注意命令行里面不支持空格,所以最好还是按下面方法进行)
回车后,注册该ado模块(如果注册失败,可以将当前路径先到
C:\Program Files\Common Files\System\ado目录再进行注册)
运用后能正常。
2.如果上述方式已然不行,那说本台电脑的这个文件可能有问题,
可以去找一台没有问题的电脑,把这个文件拷贝过来,
然后操作1的步骤即可解决!
经过上面步骤验证msado15.dll没有问题,后来又查看win7上的该文件大小比XP上的翻了倍,所以开始怀疑是版本不匹配,
用OLE View->Type Libraries 查看Microsoft ActiveX Data Objects *.* Library 版本从2.0到6.1的都有,
我头文件里恰好是引用的"C:\program files\common files\system\ado\msado15.dll" 这个文件,所以我引用的是6.1版本,同样的方法在xp上查看只有2.8版本,再到WIN7下查看2.8版本
再将我的头文件改为
#import "C:\program files\common files\system\ado\msado28.tlb" rename_namespace("ADONameSpace") rename("EOF","adoEOF")
再次编译到XP上运行,问题解决;
首先吐槽下微软在版本兼容性方面的缺陷,搞得我是蛋疼得不得了啊,若非高人相助现在已可能经吐血身亡了
废话少说上代码:
以下代码环境:win7 32位+VC6.0
目标环境: XP 32位 无VC
添加头文件:
#import "C:\program files\common files\system\ado\msado15.dll" rename_namespace("ADONameSpace") rename("EOF","adoEOF")
实现代码:
BOOL CTest2::fnGetTestResult(E_FAILTYPE &eGetResultError)
{
CString csFilePath ;
CString csErrorInfo;
CString csInfo;
BOOL bIsFind = FALSE;
if (" "==m_csTestReortFile)
{
return FALSE;
}
ADONameSpace::_ConnectionPtr pConnection;
ADONameSpace::_CommandPtr pCommand;
ADONameSpace::_RecordsetPtr pRecordset;
::CoInitialize(NULL); //初始化COM环境
HRESULT hr;
try
{
//hr=pConnection.CreateInstance(__uuidof(ADONameSpace::Connection)); //这两句CreateInstance我试过都可以
hr=pConnection.CreateInstance("ADODB.Connection");
if(FAILED(hr))
{
_com_error e(hr);
AfxMessageBox(e.ErrorMessage()); //打印出错信息
return false;
}
csErrorInfo.Format("创建数据库连接实例成功\r\n");
OutputText(1,csErrorInfo,RGB(1,0,0));
//m_pConnection->ConnectionString="File Name=LinkDatabase.udl";
pConnection->ConnectionTimeout=5;//等待连接的时间为5s
hr=pConnection->Open((_bstr_t)("Provider=Microsoft.Jet.OLEDB.4.0;Data Source="+m_csTestReortFile),"","",ADONameSpace::adConnectUnspecified);//m_csTestReortFile是要打开的数据库文件绝对目录
if(FAILED(hr))
{
csErrorInfo.Format("打开文件 \"%s\" 失败\r\n",csFilePath);
OutputText(1,csErrorInfo,RGB(255,0,0));
return false;
}
}
hr = pRecordset.CreateInstance(__uuidof(ADONameSpace::Recordset));
pRecordset->Open("SELECT * FROM CaseTable",pConnection.GetInterfacePtr (),ADONameSpace::adOpenDynamic, \
ADONameSpace::adLockOptimistic,ADONameSpace::adCmdText);//CaseTable是ACCESS数据库中的一个表格
while(VARIANT_FALSE == pRecordset->adoEOF)
{
CString csResult;
CString csCaseName;
_variant_t vFieldValue;
vFieldValue = pRecordset->GetCollect("LastResult");//获取LastResult列对应的值
csResult = (char*)_bstr_t(vFieldValue);
vFieldValue = pRecordset->GetCollect("CaseName");
csCaseName = (char*)_bstr_t(vFieldValue);
if (csCaseName == m_csTestUnitText)
{
bIsFind = TRUE;
if ("RPT_BLOCK" == csResult)
{
eGetResultError = GET_RESULT_BLOCK;
break;
}
else if ("RPT_NG" == csResult )
{
eGetResultError = GET_RESULT_NG;
break;
}
else if ("RPT_OK" == csResult )
{
eGetResultError = GET_RESULT_OK;
break;
}
}
pRecordset->MoveNext(); //移到CaseTable中的下一行
}
if (FALSE == bIsFind)
{
eGetResultError = GET_RESULT_NOTFIND;
}
}
catch(_com_error e)
{
eGetResultError = GET_RESULT_OTHER;
return FALSE;
}
return TRUE;
}
代码在win7 32位+VC6.0中运行毫无问题,但是拿到XP上就出问题了
hr=pConnection.CreateInstance("ADODB.Connection");词句出错提示不支持此接口;
开始怀疑是xp上的msado15.dll文件损坏,在网上找了点方法验证了下:
1.在C:\Program Files\Common Files\System\ado下找到msado15.dll
在命令行输入命令: regsvr32 C:\Program Files\Common Files\System\ado\msado15.dll (注意命令行里面不支持空格,所以最好还是按下面方法进行)
回车后,注册该ado模块(如果注册失败,可以将当前路径先到
C:\Program Files\Common Files\System\ado目录再进行注册)
运用后能正常。
2.如果上述方式已然不行,那说本台电脑的这个文件可能有问题,
可以去找一台没有问题的电脑,把这个文件拷贝过来,
然后操作1的步骤即可解决!
经过上面步骤验证msado15.dll没有问题,后来又查看win7上的该文件大小比XP上的翻了倍,所以开始怀疑是版本不匹配,
用OLE View->Type Libraries 查看Microsoft ActiveX Data Objects *.* Library 版本从2.0到6.1的都有,
我头文件里恰好是引用的"C:\program files\common files\system\ado\msado15.dll" 这个文件,所以我引用的是6.1版本,同样的方法在xp上查看只有2.8版本,再到WIN7下查看2.8版本
再将我的头文件改为
#import "C:\program files\common files\system\ado\msado28.tlb" rename_namespace("ADONameSpace") rename("EOF","adoEOF")
再次编译到XP上运行,问题解决;
相关文章推荐
- SQLServer函数 left()、charindex()、stuff()的使用
- oracle 12c 访问数据库
- oracle 12c创建用户
- mysql命令行下将数据导出成excel文件(.xls格式)
- 使用django从数据库中随机取N条记录的不同方法及其性能实测
- CodeIgniter底层数据库类继承关系
- oracle表空间大小测试
- 为数据库添加远程用户
- Oracle的数据表压缩
- oracle创建临时表空间大小问题
- memcache学习笔记
- oracle创建和删除表空间
- MySQLのIbdata1异常及恢复
- oracle表空间配额(quota)
- mongo与mysql操作对比
- 转:ORA-01126: 数据库必须已装载到此实例并且不在任何实例中打开
- 转:Oracle物理文件
- oracle创建用户时报错
- regexp_substr在oracle9i的替换方案
- mongodb数据导入导出