我的数据库表有几个表中有时间类型,用ODBC绑定为CTime对象,我往表中添加记录的方法是这样的:
       CXXRecordset  recordset;
       recordset.AddNew();
       赋值;
       赋值;
       赋值; 
       赋值;
       赋值; 
       赋值;
      recordset.Update();
      我发现当我往数据库中添加第一条记录的时候,程序会崩溃,我用SQL语言查了下数据库数据也确实添加入库了,我跟踪了一下程序,发现崩溃的出错地点在RFX_Date处,程序要把数据库中的时间值读入内存中去,CTime的对象是个随即对象(它的数值是个负数因此崩溃)。我的疑问有,我明明要写库,它干嘛要从数据库中读取数据至内存,为什么我写除第一条记录外的记录就可以无问题以上述方法写入库。(仅仅写入表中的第一条记录需要读操作)后来我又进一步发现当时间类型在数据库表中是最后的一个属性的时候就没有任何问题,奇怪死我了。我目前的处理方法是在CXXRecordset构造函数中为CTime赋值为CTime::GetCurrentTime(),然后添加第一条记录就没有任何问题了。
请高人解答,谢谢!

解决方案 »

  1.   

    对应的CTime变量必须赋初值为0
      

  2.   

    呵呵,就是要在数据表类里的那个时间变量初始化为NULL
    IMPLEMENT_DYNAMIC(INOUT, CRecordset)INOUT::INOUT(CDatabase* pdb)
    : CRecordset(pdb)
    {
    //{{AFX_FIELD_INIT(INOUT)
    m_ID = 0;
    m_Cur_ID = _T("");
    m_Staff_ID = _T("");
    m_Name = _T("");
    m_IN_OUT = _T("");
    m_Mark = _T("");
    m_IOMA = _T("");
    m_nFields = 8;
    //}}AFX_FIELD_INIT
    m_nDefaultType = snapshot;
    m_Date=NULL;
    }
    CString INOUT::GetDefaultConnect()
    {
    return _T("ODBC;DSN=Star_KQ");
    }CString INOUT::GetDefaultSQL()
    {
    return _T("[IN_OUT]");
    }
      

  3.   

    写入时间信息的代码:
    COleDateTime oleDate = COleDateTime::GetCurrentTime();

    _variant_t vtFld;
    vtFld.vt = VT_DATE;
    vtFld.date = oleDate;

    try
    {
    pRs->AddNew();
    pRs->PutCollect("Date",vtFld);
    pRs->Update(); }
    catch (_com_error &e)
    {
    sprintf(errMsg,_T("Code meaning = %s\n"), (char*) e.ErrorMessage());
    AfxMessageBox(errMsg);
    return;
    }
      

  4.   

    对应的CTime变量必须赋初值为0是這樣的我在寫OLDEB時也是為其赋初值为0!
      

  5.   

    多谢sbqjhipr
    问题解决了
    可是原因是什么呢