数据库中(Access)有一表,其中一列类型为:短日期.
如果表为空没有记录时插入第一条记录就会出错,但是查看数据库中发现记录又添加成功了的。然后再添加记录就不会有问题了,开始用MySQL时是这个问题,现在改用Access还是这个问题。我都要疯了,大虾们救急了!指点一下!非常感谢!

解决方案 »

  1.   

    我也遇到过类似的问题,我记得好像用AddNew函数时,不会自动移动指针,即原来是空表时,它的指针是指在数据集尾部的,用了AddNew后还是在尾部,可能是这样的问题,因为不知道你的数据库是如何操作的,所以没有办法做进一步的解答了,呵呵,当然这个也不一定对,你可以试一试
      

  2.   

    呵呵,是不是那个空纪录bug?(borland这么叫它)使用winxp,或者装过vs.net,officexp什么的,就有这个毛病了,那是因为ms把系统的存储组件改变了,不管你程序的事,我用bcb的时候,只好打了个补丁,vc,vb估计也要打,要不就使用sql语句去插入,那个没关系,不受什么影响,我在bcb下试过.
      

  3.   

    实际上简单的很,可以这么解决:
    在你映射的CRecordSet类中,VC会将该字段映射成一个CTime的变量,将该变量改为COleDateTime类型的即可,当然在给起赋值的时候也需要用COleDateTime。
    CTime类经常出一些莫名其妙的错误,不知为什么。如果将对话框中的时间控件映射成CTime的变量的话,在操作的过程中也容易出错。所以我一般使用COleDateTime
      

  4.   

    jnxulei(石头) 说的对,以后要特别注意这个问题。
      

  5.   

    就是jnxulei(石头)说的,建议直接用insert into table
      

  6.   

    我的做法是添加一个类CBillSet基类是CRecordSet。
    在程序中添加记录的做法是:
    CBillSet rst;
    if (!rst.Open())
         rst.Open();
    int num=0;
    while (!rst.IsEof())
    {
         num++;
         rst.MoveNext();
    }
    rst.AddNew();
    rst.m_Num=num;
    CTime time(2003,6,20,0,0,0);
    rst.m_NowDate=time;
    rst.Update();
    rst.Close();如果数据库中没有记录时就出错了,但是记录添加又成功了。
    如果是直接用SQL语句来插入,我该怎么写?
    谢谢大虾们指教了!再次感谢楼上热心的大虾们!Thanks!
      

  7.   

    你将BillSet.h中的CTime  m_NowDate;改为COleDateTime m_NowDate;然后将你上面这段程序中的CTime time(2003,6,20,0,0,0);也改成COleDateTime time(2003,6,20,0,0,0);就可以了。
    用SQL语句插入:
    CDatabase * pDatabase = new CDatabase; TRY
    {
    pDatabase->OpenEx(_T("DSN=ODBCName;UID=***;PWD=***"));
    }
    CATCH (CDBException, e)
    {
    delete pDatabase;
    return;
    }
    END_CATCH Sql.Format("insert into TableName(Num) values(123)"); pDatabase->ExecuteSQL(Sql); pDatabase->Close();
    delete pDatabase;
      

  8.   

    我以前在用CRecorderSet时也遇到过这个问题是因为CTime类型的变量没有在构造函数中初始化,你将初始化一下CTime变量就行了
      

  9.   

    //构造函数示例
    CExchangeDB::CExchangeDB(CDatabase* pdb)
    : CRecordset(pdb)
    {
    //{{AFX_FIELD_INIT(CExchange4DB)
    m_nID = 0;
    m_sReceiver = _T("");
    m_nAmount = 0;
    m_sEmployee = _T("");
    m_RecTime = (0,0,0,0,0,0); //m_RecTime为CTime型,需要手动添加初始化语句
    m_bConfirm = FALSE;
    m_ConTime = (0,0,0,0,0,0); //m_ConTime为CTime型,需要手动添加初始化语句
    m_nFields = 7;
    //}}AFX_FIELD_INIT
    m_nDefaultType = snapshot;
    }