一个关于GetBuffer的问题
我的RefreshData函数如下
但在运行中,我发现,如果把MDB数据库当中的某字段置为空,则程序运行不起来.
请问应该如何解决
我大概猜想是:GetBuffer的返回值为空 或者指向了NULL引起的
void CClientView::RefreshData()
{
//首先确保数据库打开
if(!m_database.IsOpen())
{
m_database.Open(_T("Client"));
}
//对列表控件的内容更新,清空原来的内容
m_client.DeleteAllItems();
//创建记录集
CPersonSet m_personset(&m_database);
m_personset.Open(AFX_DB_USE_DEFAULT_TYPE,m_query);
CDBVariant varValue;
char buf[20];
//用来记录当前记录的序号
int i=0;
//如果表中有记录,打开后将游标定在第一位,使记录集中的第一条记录成为当前记录
if(m_personset.GetRecordCount()!=0)
m_personset.MoveFirst();
//m_personset.Update();
// m_personset.Close();
while(!m_personset.IsEOF())
{
int temp=0;
//对整型数字的处理
m_personset.GetFieldValue(temp,varValue);
sprintf(buf,"%d",varValue.m_lVal);
m_client.InsertItem(i,buf);
//对字符串显示处理
// m_personset.GetFieldValue(temp,varValue);
// m_client.SetItemText(i,0,varValue.m_pstring->GetBuffer(1));

m_personset.GetFieldValue(1,varValue);
m_client.SetItemText(i,1,varValue.m_pstring->GetBuffer(1));

m_personset.GetFieldValue(2,varValue);
m_client.SetItemText(i,2,varValue.m_pstring->GetBuffer(1));

m_personset.GetFieldValue(3,varValue);
m_client.SetItemText(i,3,varValue.m_pstring->GetBuffer(1));

m_personset.GetFieldValue(4,varValue);
m_client.SetItemText(i,4,varValue.m_pstring->GetBuffer(1)); m_personset.GetFieldValue(5,varValue);
m_client.SetItemText(i,5,varValue.m_pstring->GetBuffer(1));

m_personset.MoveNext();
i++; }

}

解决方案 »

  1.   

    //m_client.SetItemText(i,1,varValue.m_pstring->GetBuffer(1));
    //改成如下试试,先判断是否为空值
    if(varValue.m_dwType != DBVT_NULL)
    {
      m_client.SetItemText(i,1,varValue.m_pstring->GetBuffer(1));
    }
    else
    {
      m_client.SetItemText(i,1,"");
      

  2.   

    几个问题:
    1. 这里你为什么要GetBuffer?
    2. GetBuffer到底是干吗得?你知道参数未1表示什么意思么?
    3. GetBuffer之后用完需要干吗?知道ReleaseBuffer是干吗得么?
    你这段代码在我看来是在完全不需要GetBuffer时使用了它,更严重得是,你既不知道GetBuffer是干什么得,也不知道使用完之后怎么处理它。
      

  3.   

    楼主去看看MSDN,讲的很清楚的
      

  4.   


    我用到GetBuffer是为了获取字段里的信息
    ReleaseBuffer就是GetBuffer的一个析构机制 
    那你说这个应该怎么用啊 我是想为了得到字体里的信息
      

  5.   

    1楼的方法不行?那么设断点调试
    看看varValue的各成员特别是m_dwType究竟是什么
      

  6.   


    说是没有找到m_dwType
    CXX0033:Error:error in OMF type information这是怎么回事啊?
      

  7.   

    试试这样
    应该没问题的了
         m_personset.GetFieldValue(1,varValue);
    if(varValue.m_dwType != DBVT_NULL)
    {
    m_client.SetItemText(i,1,varValue.m_pstring->GetBuffer(1));
    }
    else
    {
    m_client.SetItemText(i,1,"");
    }

    m_personset.GetFieldValue(2,varValue);
    if(varValue.m_dwType != DBVT_NULL)
    {
    m_client.SetItemText(i,2,varValue.m_pstring->GetBuffer(1));
    }
    else
    {
    m_client.SetItemText(i,2,"");
    }

    m_personset.GetFieldValue(3,varValue);
    if(varValue.m_dwType != DBVT_NULL)
    {
    m_client.SetItemText(i,3,varValue.m_pstring->GetBuffer(1));
    }
    else
    {
    m_client.SetItemText(i,3,"");
    }

    m_personset.GetFieldValue(4,varValue);
    if(varValue.m_dwType != DBVT_NULL)
    {
    m_client.SetItemText(i,4,varValue.m_pstring->GetBuffer(1));
    }
    else
    {
    m_client.SetItemText(i,4,"");
    } m_personset.GetFieldValue(5,varValue);
    if(varValue.m_dwType != DBVT_NULL)
    {
    m_client.SetItemText(i,5,varValue.m_pstring->GetBuffer(1));
    }
    else
    {
    m_client.SetItemText(i,5,"");
    }
     
      

  8.   

    字符串本身就是字符串,你还要getbuffer干吗?
      

  9.   

    请问有没有人知道 数据库里的BOOL型的变量显示怎么弄啊?