vc6.0 ADO访问数据库
来源:互联网 发布:python snmp 编辑:程序博客网 时间:2024/05/18 15:53
最近做一个蛋疼的项目会用到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上运行,问题解决;
- vc6.0 ADO访问数据库
- VC6.0数据库编程之ADO
- VC6.0 通过ado连接access数据库
- VC6.0中使用ADO操作Access数据库
- VC6.0中使用ADO操作Access数据库
- 在VC6.0中使用ADO开发数据库应用程序
- VC6.0中使用ADO操作Access数据库有感
- 在VC6.0中使用ADO开发数据库应用程序
- VC6.0控制台下ADO连接Oracle数据库问题。
- VC6.0中使用ADO操作Access数据库
- VC6.0利用ado组件 向oracle数据库插入图片
- VC6.0 利用ADO连接Sqlserver2005数据库方法
- VC6.0中使用ADO操作Access数据库
- VC6.0中访问sqlite数据库
- ADO访问数据库整理
- ADO访问数据库大全
- ADO访问数据库大全
- ADO访问数据库
- STL中list学习
- 传入动态数组
- VC助手使用技巧
- (转载) 驻足 思考 -- 提升 思维方式
- 15周项目二:杨辉三角。
- vc6.0 ADO访问数据库
- WebDriver 鼠标滑动操作
- 关于GridView的getView方法会多次重复调用的问题
- Android开发 之 view的几种布局方式及实践
- 【数组】15周项目三(1)。带姓名的成绩单 .
- JNI 数据类型转换
- 今天还是挺顺利的呢
- ural 1306 堆排序找中位数
- MFCC梅尔倒谱系数