关于数据库访问操作异常让人头大的几个地方

LOWGUN 2013-11-01 05:22:05
odbc方式
异常一:
项目用的是ODBC的模式,经常会在打开记录集是出错,执行100次可能有1,2次,出错之后程序就异常了。

// if(!m_pRecordset->Open(AFX_DB_USE_DEFAULT_TYPE, strSql))
m_pRecordset->Open(CRecordset::dynamic,strSql);
// if(!m_pRecordset->Open(CRecordset::dynaset ,strSql))
/// if(!m_pRecordset->Open(CRecordset::forwardOnly ,strSql))

这几种每种方式都试了,都会出错。

异常二:iCount=RS->GetRecordCount()调用获取记录数,不准确或者根本异常,现在放弃这种方式 改成select Count(*) as num的方式了。

异常三:

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);

有一定几率异常可能小于百分之一,不知何况,也捕捉不到原因;

后把数据库连接改成ADO的方式,但是在这获取数据内容时又有一定几率异常。

_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, " ");


脑袋都想大了,这些异常都不是每次必定触发的,都是比较低几率触发,一触发程序就崩溃了,哪位大哥行行好吧,帮我分析下什么原因啊。

...全文
474 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
LOWGUN 2013-11-07
  • 打赏
  • 举报
回复
应该不是编译环境的问题,我在程序中多个地方多次访问了同一张表,有个地方还设置了timer,整个程序只在开始初始化的时候建立了连接,整个程序都使用的这个连接,每次查询之后关闭记录集而连接没有关闭,这样有问题吗?
lovelyzuzu 2013-11-07
  • 打赏
  • 举报
回复
是不是 编译环境的问题,换个环境试下。
LOWGUN 2013-11-05
  • 打赏
  • 举报
回复
我今天调试的时候发现还有另外一种异常


void CloseRecordSet()
{
	if(m_pRecordset!=NULL)  
        m_pRecordset->Close();  
}
这样判断也有问题?
LOWGUN 2013-11-05
  • 打赏
  • 举报
回复
谢谢楼上的回复,但是我改成 字串 cstring cs=var.bstrVal; 数值 int a=var.lval 直接就异常了。
LOWGUN 2013-11-05
  • 打赏
  • 举报
回复
worldy 2013-11-04
  • 打赏
  • 举报
回复
_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
LOWGUN 2013-11-04
  • 打赏
  • 举报
回复
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转一次。
LOWGUN 2013-11-04
  • 打赏
  • 举报
回复
GetCollect 也用try catch捕获一下 这里try也不能返回错误消息,也直接是崩溃了。
worldy 2013-11-01
  • 打赏
  • 举报
回复
//打开查询记录 _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; }
oyljerry 2013-11-01
  • 打赏
  • 举报
回复
GetCollect 也用try catch捕获一下
版主大哥 2013-11-01
  • 打赏
  • 举报
回复
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); 这个代码。出现异常,直接就死锁了
LOWGUN 2013-11-01
  • 打赏
  • 举报
回复


//打开查询记录
_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;	
	}

4,011

社区成员

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

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