如何设置异常处理 导入数据库问题
要从Excel向Access中导入,两类表,每一类表都是固定格式的(字段个数和字段格式);我想处理两类异常,一个是输入的Excel格式是否是正确的;另一类是处理获取的记录个数(GetUsedRange())比实际数据要多的情况。(当Excel有效记录的下面有制表符时,读出的记录个数就比较多)
还请大侠帮帮忙。。。
//获取行数与列数
range.AttachDispatch(sheet.GetUsedRange(),true);
range.AttachDispatch(range.GetRows(),true);
rowNum=range.GetCount();
range.AttachDispatch(range.GetColumns(),true);
columnNum=range.GetCount();
range.AttachDispatch(sheet.GetCells());
CString sql,sql1,piaohao,cdate,AAA;
_variant_t m;
_variant_t n[34];
switch(m_nCaseIndex)
{
case -1:
AfxMessageBox("m_nCaseIndex仍然是默认值");
break;
//第一类导表
case 0:
for(i=2;i<=rowNum;i++)
{
//选取Excel每一列的记录
for(j=1;j<=columnNum;j++)
n[j]=range.GetItem(COleVariant((long)i),COleVariant((long)j));
piaohao=(char*)(_bstr_t)n[5];
sql.Format("select * from daobiao where E='"+piaohao+"'");
m_pRecordset=theApp.m_pConnection->Execute((_bstr_t)sql,NULL,adCmdText);
if(!m_pRecordset->adoEOF)
{
// AfxMessageBox("这个票号已经导入过了:"+piaohao);
continue;
}
else
{
//讲一个买入记录添加到买入导表
sql.Format("insert into mairudaobiao(A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z,AA,AB,AC) values('%s','%s','%s','%s','%s','%s','%s','%s','%s','%s','%s','%s','%s','%s','%s','%s','%s','%s','%s','%s','%s','%s','%s','%s','%s','%s','%s','%s','%s')",
(char*)(_bstr_t)n[1],(char*)(_bstr_t)n[2],(char*)(_bstr_t)n[3],(char*)(_bstr_t)n[4],(char*)(_bstr_t)n[5],(char*)(_bstr_t)n[6],(char*)(_bstr_t)n[7],(char*)(_bstr_t)n[8],(char*)(_bstr_t)n[9],(char*)(_bstr_t)n[10],(char*)(_bstr_t)n[11],(char*)(_bstr_t)n[12],(char*)(_bstr_t)n[13],(char*)(_bstr_t)n[14],(char*)(_bstr_t)n[15],(char*)(_bstr_t)n[16],(char*)(_bstr_t)n[17],(char*)(_bstr_t)n[18],(char*)(_bstr_t)n[19],(char*)(_bstr_t)n[20],(char*)(_bstr_t)n[21],(char*)(_bstr_t)n[22],(char*)(_bstr_t)n[23],(char*)(_bstr_t)n[24],(char*)(_bstr_t)n[25],(char*)(_bstr_t)n[26],(char*)(_bstr_t)n[27],(char*)(_bstr_t)n[28],(char*)(_bstr_t)n[29]);
theApp.m_pConnection->Execute((_bstr_t)sql,NULL,adCmdText);
//将一个买入记录添加到daobiao相对应的位置
sql.Format("insert into daobiao(AAA,A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z,AA,AB,AC,AN,AO,AP) values('%s','%s','%s','%s','%s','%s','%s','%s','%s','%s','%s','%s','%s','%s','%s','%s','%s','%s','%s','%s','%s','%s','%s','%s','%s','%s','%s','%s','%s','%s','%s','%s','%s')",
"00",(char*)(_bstr_t)n[1],(char*)(_bstr_t)n[2],(char*)(_bstr_t)n[3],(char*)(_bstr_t)n[4],(char*)(_bstr_t)n[5],(char*)(_bstr_t)n[6],(char*)(_bstr_t)n[7],(char*)(_bstr_t)n[8],(char*)(_bstr_t)n[9],(char*)(_bstr_t)n[10],(char*)(_bstr_t)n[11],(char*)(_bstr_t)n[12],(char*)(_bstr_t)n[13],(char*)(_bstr_t)n[14],(char*)(_bstr_t)n[15],(char*)(_bstr_t)n[16],(char*)(_bstr_t)n[17],(char*)(_bstr_t)n[18],(char*)(_bstr_t)n[19],(char*)(_bstr_t)n[20],(char*)(_bstr_t)n[21],(char*)(_bstr_t)n[22],(char*)(_bstr_t)n[23],(char*)(_bstr_t)n[24],(char*)(_bstr_t)n[25],(char*)(_bstr_t)n[26],(char*)(_bstr_t)n[27],(char*)(_bstr_t)n[28],(char*)(_bstr_t)n[29],"人办","4.1951","-40");
theApp.m_pConnection->Execute((_bstr_t)sql,NULL,adCmdText);
}
}
break;
//第二类导表
case 1:
for(i=2;i<=rowNum;i++)
{
for(j=1;j<=columnNum;j++)
n[j]=range.GetItem(COleVariant((long)i),COleVariant((long)j));
piaohao=(char*)(_bstr_t)n[3];
sql.Format("select * from maichudaobiao where C='"+piaohao+"'");
m_pRecordset=theApp.m_pConnection->Execute((_bstr_t)sql,NULL,adCmdText);
if(!m_pRecordset->adoEOF)
{
// AfxMessageBox("这个票号已经有一个卖出记录:"+piaohao);
continue;
}
else
{
sql.Format("select * from daobiao where E='"+piaohao+"'");
m_pRecordset=theApp.m_pConnection->Execute((_bstr_t)sql,NULL,adCmdText);
if(m_pRecordset->adoEOF)
{
AfxMessageBox("这个票号在买入导表里面没有记录:"+piaohao);
continue;
}
else
{
//讲一个卖出记录添加到卖出导表
sql.Format("insert into maichudaobiao(A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T) values('%s','%s','%s','%s','%s','%s','%s','%s','%s','%s','%s','%s','%s','%s','%s','%s','%s','%s','%s','%s')",
(char*)(_bstr_t)n[1],(char*)(_bstr_t)n[2],(char*)(_bstr_t)n[3],(char*)(_bstr_t)n[4],(char*)(_bstr_t)n[5],(char*)(_bstr_t)n[6],(char*)(_bstr_t)n[7],(char*)(_bstr_t)n[8],(char*)(_bstr_t)n[9],(char*)(_bstr_t)n[10],(char*)(_bstr_t)n[11],(char*)(_bstr_t)n[12],(char*)(_bstr_t)n[13],(char*)(_bstr_t)n[14],(char*)(_bstr_t)n[15],(char*)(_bstr_t)n[16],(char*)(_bstr_t)n[17],(char*)(_bstr_t)n[18],(char*)(_bstr_t)n[19],(char*)(_bstr_t)n[20]);
theApp.m_pConnection->Execute((_bstr_t)sql,NULL,adCmdText);
if(strcmp((char*)(_bstr_t)m_pRecordset->GetCollect("AAA"),"00")==0)
{
//根据票号,将一个卖出记录添加到daobiao相应的位置,没有票号时,不添加
sql.Format("update daobiao set AAA='%s',AD='%s',AE='%s',AF='%s',AG='%s',AH='%s',AI='%s',AJ='%s',AK='%s',AL='%s',AM='%s' where E='%s'","10",(char*)(_bstr_t)n[2],(char*)(_bstr_t)n[5],(char*)(_bstr_t)n[8],(char*)(_bstr_t)n[9],(char*)(_bstr_t)n[10],(char*)(_bstr_t)n[11],(char*)(_bstr_t)n[12],(char*)(_bstr_t)n[13],(char*)(_bstr_t)n[16],(char*)(_bstr_t)n[18],(char*)(_bstr_t)n[3]);
theApp.m_pConnection->Execute((_bstr_t)sql,NULL,adCmdText);
}
else
{
//根据票号,将一个卖出记录添加到daobiao相应的位置,没有票号时,不添加
sql.Format("update daobiao set AAA='%s',AD='%s',AE='%s',AF='%s',AG='%s',AH='%s',AI='%s',AJ='%s',AK='%s',AL='%s',AM='%s' where E='%s'","11",(char*)(_bstr_t)n[2],(char*)(_bstr_t)n[5],(char*)(_bstr_t)n[8],(char*)(_bstr_t)n[9],(char*)(_bstr_t)n[10],(char*)(_bstr_t)n[11],(char*)(_bstr_t)n[12],(char*)(_bstr_t)n[13],(char*)(_bstr_t)n[16],(char*)(_bstr_t)n[18],(char*)(_bstr_t)n[3]);
theApp.m_pConnection->Execute((_bstr_t)sql,NULL,adCmdText);
}
}
}
}
}
代码有些乱,可能粘贴出去徽标叫好看、、、
[解决办法]
用这个软件试试你SQL
ADO异常捕获改成这样试试
try{//你的ADO代码}catch (_com_error& e){CString strMsg;strMsg.Format(_T("错误描述:%s\n错误消息%s", (LPCTSTR)e.Description(), (LPCTSTR)e.ErrorMessage());AfxMessageBox(strMsg);}