vc通过ADO方式访问mysql数据库奔溃,急求答案,如果想要钱的,请免开尊口

梨花带血 2015-06-23 01:31:33
ADO.CPP文件:
#include "stdafx.h"
#include "sql.h"
#include "ADO.h"

#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

CADO::CADO()
{
OnInitADOConn();
}

CADO::~CADO()
{
CloseConn();
}
void CADO::OnInitADOConn()
{


CoInitialize(NULL); //初始化Com组件

m_pConnection.CreateInstance("ADODB.Connection"); //Connection用于与数据库服务器的链接

_bstr_t conStr=_T("Driver={MySQL ODBC 5.1 Driver};SERVER=localhost;UID=root;PWD=123456;DATABASE=lszb;PORT=3306");

/******************连接数据库********************/

try

{
m_pConnection->ConnectionTimeout = 5;
m_pConnection->Open(conStr,_T(""),_T(""),adModeUnknown);
}

catch(_com_error e) //捕捉异常

{
AfxMessageBox(e.ErrorMessage());
}
CoUninitialize();
}


BOOL CADO::RunSQL(CString sql)//执行函数
{
if (m_pConnection==NULL)
{
OnInitADOConn();
}

try
{
m_pConnection->Execute((_bstr_t)sql,NULL,adCmdText);
}
catch(_com_error e)
{
MessageBox(NULL,e.ErrorMessage(),"执行非查询过程",MB_OK);
return FALSE;
}
return TRUE;
}




_RecordsetPtr& CADO::Search(CString sql)
{
HRESULT hr;
ASSERT(!sql.IsEmpty()); //SQL语句不能
if (m_pConnection==NULL)
{
OnInitADOConn();
}

try
{
hr=m_pRecordset.CreateInstance(__uuidof(Recordset));//创建记录集对象实例
if(SUCCEEDED(hr))
{
m_pRecordset->Open(_bstr_t (sql),m_pConnection.GetInterfacePtr(),adOpenDynamic,adLockOptimistic,adModeUnknown); //执行SQL得到记录集
}
}

catch(_com_error e) //捕获可能的异常
{
MessageBox(NULL,e.ErrorMessage(),"执行查询过程",MB_OK);
}
return m_pRecordset;
}


void CADO::CloseConn()
{

m_pConnection->Close();
CoUninitialize();
}


void CADO::CloseRecordset()
{
if(m_pRecordset->GetState() == adStateOpen) //判断当前的记录集状态
m_pRecordset->Close(); //关闭记录集
}


调用函数如下:
void CSqlDlg::OnButton2()
{
// TODO: Add your control notification handler code here
int n=0;
CString sql;
CString str="1021";
sql.Format("select * from huoweiinfo where huowei = '%s'",str);

m_Ado.Search(sql);
if (!(m_Ado.m_pRecordset->State & adStateOpen))
{
AfxMessageBox((_T("记录集未打开。")));

return;
}
while (!m_Ado.m_pRecordset->adoEOF)
{
_variant_t varValue;
CString strHuoWei = _T("");
CString HuoLiang = _T("");
CString WuLiaodaima = _T("");
CString RuKutime = _T("");

varValue = m_Ado.m_pRecordset->GetCollect(_variant_t(_T("huowei")));
if (varValue.vt != VT_NULL)
{
strHuoWei = varValue.bstrVal;
}
else
{
strHuoWei = _T("");
}

varValue = m_Ado.m_pRecordset->GetCollect(_variant_t(_T("full")));
if (varValue.vt != VT_NULL)
{
HuoLiang = varValue.bstrVal;
}
else
{
HuoLiang = _T("");
}
varValue = m_Ado.m_pRecordset->GetCollect(_variant_t(_T("matecode")));
if (varValue.vt != VT_NULL)
{
WuLiaodaima = varValue.bstrVal;
}
else
{
WuLiaodaima = _T("");
}
varValue = m_Ado.m_pRecordset->GetCollect(_variant_t(_T("intime")));
if (varValue.vt != VT_NULL)
{
RuKutime = varValue.bstrVal;
}
else
{
RuKutime = _T("");
}


//刷新ListCtrl
CString strText = _T("");
CListCtrl* pListCtrl = (CListCtrl*)GetDlgItem(IDC_LIST1);
strText.Format(_T("%d"), n + 1);
pListCtrl->InsertItem(n, strText);
strText.Format(_T("%s"), strHuoWei);
pListCtrl->SetItemText(n, 1, strText);
strText.Format(_T("%s"), HuoLiang);
pListCtrl->SetItemText(n, 2, strText);
strText.Format(_T("%s"), WuLiaodaima);
pListCtrl->SetItemText(n, 3, strText);
strText.Format(_T("%s"), RuKutime);
pListCtrl->SetItemText(n, 4, strText);
n++;
m_Ado.m_pRecordset->MoveNext();
}
}

问题描述:执行到红色语句时,报错:First-chance exception in sql.exe (MYODBC5.DLL): 0xC0000005: Access Violation.
堆栈最后显示信息如下:
MYODBC5! 5c468346()
MYODBC5! 5c463953()
MYODBC5! 5c4cdf36()
MYODBC5! 5c4d0007()
MYODBC5! 5c4db5ae()
MYODBC5! 5c4652ab()
MYODBC5! 5c4656b2()
MYODBC5! 5c465946()
ODBC32! 6924bf84()
MSDASQL! 60b15f8e()
MSDASQL! 60b19f4a()
MSDASQL! 60af6648()
MSDASQL! 60afc80a()
MSADRH15! 639428ee()
MSADO15! 6348d200()
MSADO15! 6348621d()
MSADO15! 6348051a()
MSADO15! 6348041a()
MSADO15! 63486d69()
MSADO15! 63486cea()
Recordset15::GetadoEOF() line 634 + 18 bytes
CSqlDlg::OnButton2() line 210 + 18 bytes

请各位大师指点一下,实在搞不定了,想要钱的请免开尊口,在下承受不起,送你一句话:学海无涯,谁能说已登彼岸。把事情别整的那么下作
...全文
278 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
梨花带血 2015-06-24
  • 打赏
  • 举报
回复
这事自己搞定了:mysql版本不对,我原来装的是mysql-essential-6.0.11-alpha-win32.msi;换成mysql-5.5.37-win32.msi后问题解决,另外:我上面那些代码完全无误,后来人可以参考
梨花带血 2015-06-23
  • 打赏
  • 举报
回复
谁装了mysql帮我跑一下吧,这些代码在ACCESS中是没有问题的
ArthurKingYs 2015-06-23
  • 打赏
  • 举报
回复
数据连接字符串 有没有写错, 看看操作语句有没有 写错 现在数据库里面运行看看能不能用 标点符号的中英文是不是混了 返回的字符串 字头操作对应不对应
梨花带血 2015-06-23
  • 打赏
  • 举报
回复
引用 10 楼 worldy 的回复:
m_pConnection->ConnectionTimeout = 5; m_pConnection->CursorLocation=adUseClient;//加入 m_pConnection->Open(conStr,_T(""),_T(""),adModeUnknown); m_pRecordset->Open(_bstr_t (sql),m_pConnection.GetInterfacePtr(),adOpenDynamic,adLockOptimistic,adModeUnknown); 红色那个改成 adOpenStatic 蓝色改为:adLockBatchOptimistic 试试看
还是不行啊,我有点怀疑是我的mysql没配好
worldy 2015-06-23
  • 打赏
  • 举报
回复
m_pConnection->ConnectionTimeout = 5; m_pConnection->CursorLocation=adUseClient;//加入 m_pConnection->Open(conStr,_T(""),_T(""),adModeUnknown); m_pRecordset->Open(_bstr_t (sql),m_pConnection.GetInterfacePtr(),adOpenDynamic,adLockOptimistic,adModeUnknown); 红色那个改成 adOpenStatic 蓝色改为:adLockBatchOptimistic 试试看
梨花带血 2015-06-23
  • 打赏
  • 举报
回复
执行这个代码没问题: _variant_t varValue; CString sql ; sql.Format("select count(*) from huoweiinfo where full='%s'","1"); HRESULT hr; hr=m_Ado.Search(sql); varValue = m_Ado.m_pRecordset->GetCollect(0L); m_Ado.CloseRecordset(); m_store=varValue.intVal; UpdateData(FALSE);
梨花带血 2015-06-23
  • 打赏
  • 举报
回复
引用 7 楼 mayudong1 的回复:
起了个怪的,没看出哪有什么问题啊 m_pRecordset->Open(_bstr_t (sql),m_pConnection.GetInterfacePtr(),adOpenDynamic,adLockOptimistic,adModeUnknown); //执行SQL得到记录集 这一句执行成功了吗
这个catch没捕捉到错误,应该就成功了,我用过这么条指令:HRESULT hr=m_Ado.search(sql);hr的值等调用完是1.
mayudong1 2015-06-23
  • 打赏
  • 举报
回复
起了个怪的,没看出哪有什么问题啊 m_pRecordset->Open(_bstr_t (sql),m_pConnection.GetInterfacePtr(),adOpenDynamic,adLockOptimistic,adModeUnknown); //执行SQL得到记录集 这一句执行成功了吗
梨花带血 2015-06-23
  • 打赏
  • 举报
回复
引用 5 楼 worldy 的回复:
CoUninitialize();这个不能放在OnInitADOConn()里面,应该放在ADO的释构函数里
CADO::CADO() { CoInitialize(NULL); //初始化Com组件 OnInitADOConn(); } CADO::~CADO() { CloseConn(); CoUninitialize(); } 我改成这样,结果没有丝毫改变啊。实在是找不到哪里错了,能不能我把代码发给你们,你们运行一下,比较小,是我的测试程序,不是正式工程
worldy 2015-06-23
  • 打赏
  • 举报
回复
CoUninitialize();这个不能放在OnInitADOConn()里面,应该放在ADO的释构函数里
梨花带血 2015-06-23
  • 打赏
  • 举报
回复
[quote=引用 3 楼 mayudong1 的回复:]
那就理一下代码,看看那个m_Ado有没有初始化,在while之前加个断点,看看是不是在判断之前那个m_pRecordset变量的值是不是空,这里出这样的错应该就是它为空了,但为什么为空应该是在之前的问题了,比如那个search函数中[
m_Ado只是这么定义了一下:CADO m_Ado;
断点调试:
这个m_Ado.m_pRecordset说实话我看不太懂是不是合适
mayudong1 2015-06-23
  • 打赏
  • 举报
回复
那就理一下代码,看看那个m_Ado有没有初始化,在while之前加个断点,看看是不是在判断之前那个m_pRecordset变量的值是不是空,这里出这样的错应该就是它为空了,但为什么为空应该是在之前的问题了,比如那个search函数中
梨花带血 2015-06-23
  • 打赏
  • 举报
回复
引用 1 楼 mayudong1 的回复:
额,还能碰到要钱的。。 第一步 把while (!m_Ado.m_pRecordset->adoEOF==0) 改成while (!m_Ado.m_pRecordset->adoEOF)试一下 第二步 加个try catch的异常处理看看能不能抓到什么错,用法百度一下吧
谢谢,while (!m_Ado.m_pRecordset->adoEOF)本来就是,后面没办法了加了==0,结果还是不行,忘改回来了 try catch捕捉不到,碰到m_Ado.m_pRecordset直接就奔溃了,出来判断记录集是否为空不。
mayudong1 2015-06-23
  • 打赏
  • 举报
回复
额,还能碰到要钱的。。 第一步 把while (!m_Ado.m_pRecordset->adoEOF==0) 改成while (!m_Ado.m_pRecordset->adoEOF)试一下 第二步 加个try catch的异常处理看看能不能抓到什么错,用法百度一下吧

4,011

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 数据库
社区管理员
  • 数据库
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧