表中当字段值为空时,ADO对其访问会出错,如何解决?
if( FAILED(::CoInitialize(NULL)) )
{
AfxMessageBox("ADO Init failed");
return;
}
rs.CreateInstance(__uuidof(Recordset));
CString temp = "";
CString sContext = "";
try {
rs->Open("mytable",
"Provider=sqloledb;Data Source=MyServer;"
"Initial Catalog=mydatabase;Integrated Security=SSPI;",
adOpenStatic, adLockOptimistic, adCmdTable);
rs->MoveFirst();
while (!(rs->EndofFile)) {
long fieldcount = rs->Fields->Count;
for(long i=0; i<fieldcount; i++){
vtValue = rs->Fields->GetItem(i)->GetValue();//*****
stemp = (char*) ((_bstr_t) vtValue);
sContext= sContext+stemp+" ";
}
// ... other process
rs->MoveNext();
}
}
catch(_com_error &e)
{
CString err;
err.Format("%s", (char*)(e.Description()) );
AfxMessageBox(err);
}
catch(...)
{
AfxMessageBox("Unknown Error...");
}
mytable的第一条记录中的第二个字段类型为float,值为空,执行带//****语句会throw -com_error异常:error messageDescription='(NULL)',本意为如果表中的值勤为空,则转换为0,然后接着读下一字段值.但程序运行到此处抛出异常后并不继续执行了,另外如果进行空值转换,如何进行, 谢谢 :)
问题点数:20、回复次数:4Top
1 楼whale()回复于 2004-08-02 17:05:11 得分 0
在转换前先判断一下vtValue.vt是否等于VT_NULL,如果是NULL,表示字段的值为空,做特殊的处理。Top
2 楼heihong(鱼儿水中游)回复于 2004-08-02 17:46:13 得分 0
但是程序rs->Fields->GetItem(i)->GetValue时抛出异常,程序不继续了,如何让程序继续读下一条记录Top
3 楼laiyiling(陌生人[MVP])回复于 2004-08-02 21:28:02 得分 10
判断一下
CString str;
if(vFieldValue.vt != VT_NULL)
{
str = (char*)_bstr_t(vFieldValue);
}
Top
4 楼whale()回复于 2004-08-03 09:34:37 得分 10
是不是有的字段是Image,Text之类的BLOB,CLOB类型的字段,这种字段是不能通过Filed的Value来访问的,需要使用Field的GetChunk/AppendChunk方法。Top




