关于数据库访问操作异常让人头大的几个地方 异常偶发 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 //打开查询记录_RecordsetPtr OPenRecordSet(_RecordsetPtr m_pRecordset,CString strsql){ bstr_t bstrSQL=strsql; m_pRecordset.CreateInstance(__uuidof(Recordset)); //打开记录集 m_pRecordset->CursorType = adOpenStatic; m_pRecordset->CursorLocation = adUseClient; if ( m_pRecordset->State )// 如果记录集打开的话,把它关了 m_pRecordset->Close(); m_pRecordset->Open(bstrSQL,m_pConnection.GetInterfacePtr(),adOpenStatic, adLockOptimistic,adCmdText); return m_pRecordset;}//获取想要的数据列int GetColectEx(_RecordsetPtr m_pRecordset,char * Retvar,int index){ if(index<0) return -1; _variant_t var; var= m_pRecordset->GetCollect(_variant_t((long)index)); ///在这里经常异常 if(var.vt != VT_NULL) strcpy(Retvar,(char*)(_bstr_t)var); else strcpy(Retvar, " "); return 1;}/////调用查询和获取数据 try { m_pRecordset=OPenRecordSet(m_pRecordset,strsql); char temp[50]={0}; GetColectEx( m_pRecordset,temp,0); iNum=atoi((char*)_bstr_t(temp)); CloseRecordSet(); } catch(_com_error e) { e.Description(); return false; } EnterCriticalSection(&m_crit_db_Exec_section); try { m_db.ExecuteSQL(strSql); } catch(CDBException* e) { char error[128] = {0}; e->GetErrorMessage(error,128,NULL); error[strlen(error)-2] = 0; TRACE("Insert GetErrorMessage: %s\n",error); return FALSE; } LeaveCriticalSection(&m_crit_db_Exec_section); 这个代码。出现异常,直接就死锁了 GetCollect 也用try catch捕获一下 //打开查询记录_RecordsetPtr OPenRecordSet(_RecordsetPtr m_pRecordset,CString strsql)//很诡异的定义方式,既然m_pRecordset既然是在函数体中创建,和调用者没有啥关系,虽然也没有什么错,干嘛要让调用者多传递一个参数?{ bstr_t bstrSQL=strsql; m_pRecordset.CreateInstance(__uuidof(Recordset)); //打开记录集 m_pRecordset->CursorType = adOpenStatic; m_pRecordset->CursorLocation = adUseClient; if ( m_pRecordset->State )// 如果记录集打开的话,把它关了 m_pRecordset->Close(); //既然是CreateInstance新建的,此if是多余的,肯定不会是open的 m_pRecordset->Open(bstrSQL,m_pConnection.GetInterfacePtr(),adOpenStatic, adLockOptimistic,adCmdText); return m_pRecordset;}//获取想要的数据列int GetColectEx(_RecordsetPtr m_pRecordset,char * Retvar,int index){ if(index<0) return -1; _variant_t var; var= m_pRecordset->GetCollect(_variant_t((long)index)); ///在这里经常异常 //此有异常,估计你的index值有问题 if(var.vt != VT_NULL) strcpy(Retvar,(char*)(_bstr_t)var);//此处应该有问题,不管什么值类型,都做字串拷贝?又是一个很怪异的取值方法 else strcpy(Retvar, " "); return 1;}/////调用查询和获取数据 try { m_pRecordset=OPenRecordSet(m_pRecordset,strsql); char temp[50]={0}; GetColectEx( m_pRecordset,temp,0); iNum=atoi((char*)_bstr_t(temp)); CloseRecordSet(); } catch(_com_error e)//此处应该有问题,反正我是&e 的,并且能很好的捕捉到错误 { e.Description();//这个要干嘛? return false; } GetCollect 也用try catch捕获一下 这里try也不能返回错误消息,也直接是崩溃了。 to worldy:var= m_pRecordset->GetCollect(_variant_t((long)index)); ///在这里经常异常 //此有异常,估计你的index值有问题这里我就直接填的0,1,2,4,我获取的数据不会超过4列,也会有错?strcpy(Retvar,(char*)(_bstr_t)var);//此处应该有问题,不管什么值类型,都做字串拷贝?又是一个很怪异的取值方法?因为我要获取的字段存的都是int型或者字符串的,没有别的数据类型。int型获取到再atoi转一次。 _variant_t var; var= m_pRecordset->GetCollect(_variant_t((long)index)); ==> _variant_t var(0L); var.lVal=index;//1,2,3,4 记录中必须有这么多字段 var= m_pRecordset->GetCollect(var); ///////////_variant_t var(0L);var.lVal=index;var= m_pRecordset->GetCollect(var)); ///在这里经常异常 //此有异常,估计你的index值有问题if(var.vt != VT_NULL) strcpy(Retvar,(char*)(_bstr_t)var);==>直接返回var类型,然后判断vt值,如果字串 cstring cs=var.bstrval;数值 int a=var.lval 谢谢楼上的回复,但是我改成字串 cstring cs=var.bstrVal;数值 int a=var.lval 直接就异常了。 我今天调试的时候发现还有另外一种异常 void CloseRecordSet(){ if(m_pRecordset!=NULL) m_pRecordset->Close(); }这样判断也有问题? 应该不是编译环境的问题,我在程序中多个地方多次访问了同一张表,有个地方还设置了timer,整个程序只在开始初始化的时候建立了连接,整个程序都使用的这个连接,每次查询之后关闭记录集而连接没有关闭,这样有问题吗? 求助,SDI切换视图时视图无法更新的问题。 C++一周年,散分庆祝 directshow 画面显示问题 想实现硬盘上文件夹及文件到USB的拷贝, 有没有简单些的方法啊? 怎样在更新EDIT control内容时,不影响其他的控键 如何在进度条中显示数字进度呢? 如何使一个对话框移动到最上层 请问如何在CListBox控件中显示图标选项 如何通过edit向list control中添加,删除,插入内容 关于CDateTimeCtrl的几个简单问题? WTL 消息反射 问题 谁帮我写一个模糊查询的代码?跪谢。
_RecordsetPtr OPenRecordSet(_RecordsetPtr m_pRecordset,CString strsql)
{
bstr_t bstrSQL=strsql;
m_pRecordset.CreateInstance(__uuidof(Recordset));
//打开记录集
m_pRecordset->CursorType = adOpenStatic;
m_pRecordset->CursorLocation = adUseClient;
if ( m_pRecordset->State )// 如果记录集打开的话,把它关了
m_pRecordset->Close();
m_pRecordset->Open(bstrSQL,m_pConnection.GetInterfacePtr(),adOpenStatic, adLockOptimistic,adCmdText); return m_pRecordset;
}//获取想要的数据列
int GetColectEx(_RecordsetPtr m_pRecordset,char * Retvar,int index)
{
if(index<0)
return -1; _variant_t var;
var= m_pRecordset->GetCollect(_variant_t((long)index)); ///在这里经常异常
if(var.vt != VT_NULL)
strcpy(Retvar,(char*)(_bstr_t)var);
else
strcpy(Retvar, " ");
return 1;
}/////调用查询和获取数据
try
{
m_pRecordset=OPenRecordSet(m_pRecordset,strsql); char temp[50]={0};
GetColectEx( m_pRecordset,temp,0);
iNum=atoi((char*)_bstr_t(temp));
CloseRecordSet();
}
catch(_com_error e)
{
e.Description();
return false;
}
EnterCriticalSection(&m_crit_db_Exec_section);
try { m_db.ExecuteSQL(strSql); }
catch(CDBException* e) { char error[128] = {0}; e->GetErrorMessage(error,128,NULL); error[strlen(error)-2] = 0; TRACE("Insert GetErrorMessage: %s\n",error); return FALSE; } LeaveCriticalSection(&m_crit_db_Exec_section);
这个代码。出现异常,直接就死锁了
_RecordsetPtr OPenRecordSet(_RecordsetPtr m_pRecordset,CString strsql)
//很诡异的定义方式,既然m_pRecordset既然是在函数体中创建,和调用者没有啥关系,虽然也没有什么错,干嘛要让调用者多传递一个参数?
{
bstr_t bstrSQL=strsql;
m_pRecordset.CreateInstance(__uuidof(Recordset)); //打开记录集
m_pRecordset->CursorType = adOpenStatic;
m_pRecordset->CursorLocation = adUseClient;
if ( m_pRecordset->State )// 如果记录集打开的话,把它关了
m_pRecordset->Close();
//既然是CreateInstance新建的,此if是多余的,肯定不会是open的 m_pRecordset->Open(bstrSQL,m_pConnection.GetInterfacePtr(),adOpenStatic, adLockOptimistic,adCmdText); return m_pRecordset;
}//获取想要的数据列
int GetColectEx(_RecordsetPtr m_pRecordset,char * Retvar,int index)
{
if(index<0)
return -1; _variant_t var;
var= m_pRecordset->GetCollect(_variant_t((long)index)); ///在这里经常异常 //此有异常,估计你的index值有问题 if(var.vt != VT_NULL)
strcpy(Retvar,(char*)(_bstr_t)var);
//此处应该有问题,不管什么值类型,都做字串拷贝?又是一个很怪异的取值方法
else
strcpy(Retvar, " ");
return 1;
}/////调用查询和获取数据
try
{
m_pRecordset=OPenRecordSet(m_pRecordset,strsql); char temp[50]={0};
GetColectEx( m_pRecordset,temp,0);
iNum=atoi((char*)_bstr_t(temp));
CloseRecordSet();
}
catch(_com_error e)//此处应该有问题,反正我是&e 的,并且能很好的捕捉到错误
{
e.Description();//这个要干嘛?
return false;
}
var= m_pRecordset->GetCollect(_variant_t((long)index)); ///在这里经常异常 //此有异常,估计你的index值有问题
这里我就直接填的0,1,2,4,我获取的数据不会超过4列,也会有错?strcpy(Retvar,(char*)(_bstr_t)var);
//此处应该有问题,不管什么值类型,都做字串拷贝?又是一个很怪异的取值方法?
因为我要获取的字段存的都是int型或者字符串的,没有别的数据类型。int型获取到再atoi转一次。
var= m_pRecordset->GetCollect(_variant_t((long)index));
==>
_variant_t var(0L);
var.lVal=index;//1,2,3,4 记录中必须有这么多字段
var= m_pRecordset->GetCollect(var);
///////////
_variant_t var(0L);
var.lVal=index;
var= m_pRecordset->GetCollect(var)); ///在这里经常异常 //此有异常,估计你的index值有问题
if(var.vt != VT_NULL)
strcpy(Retvar,(char*)(_bstr_t)var);
==>直接返回var类型,然后判断vt值,如果
字串 cstring cs=var.bstrval;
数值 int a=var.lval
数值 int a=var.lval
直接就异常了。
void CloseRecordSet()
{
if(m_pRecordset!=NULL)
m_pRecordset->Close();
}
这样判断也有问题?