各位大虾,小弟最近学VC数据库编程,遇到一个问题,请帮忙解决;首先用VC的默认方式创建了一个简单的对话框程序,为了给它添加数据库功能,
用ClassWWizard创建了一个基于"CRecordset"类的新类"CMySet",
并在"CMyDlg.h"中申明了变量:
public:
    CDatabase m_base;
    CMySet   *pSet;
在"CMyDlg.cpp"文件中;
CMyDlg::CMyDlg(CWnd* pParent /*=NULL*/)
: CDialog(CWgServerDlg::IDD, pParent)
{
  CString str = T("ODBC;DSN= MyDB");
  m_base.Open(NULL, FALSE, FALSE, str );
  pSet = new CSet(&m_base);
}
增加记录
CMyDlg::OnAdd()
{
  if (!pSet->IsOpen())
     pSet->Open();
  pSet->AddNew();
  pSet->m_Name = "张三";
  pSet->m_Age  = 22;
  pSet->Update();
  pSet->Close();
}
可是问题出现了,在第一次添加数据的时候,程序报下面的错误"
 "0x5f477959指令引用的"0x00000014"内存,该内存不能为"read"
点确定关掉错误信息窗口,再检查数据库,却发现此记录已经添加成功了;
出现这次错误后,以后添加数据在不会报错误,
可把数据库清空后在添家,次错误又重新出现了,好郁闷,

解决方案 »

  1.   

    可能是数据库当前指针的问题。你试着在添加之前调用MoveFirst()函数,或者MoveNext()等移位函数
      

  2.   

    先手动在数据库表中添加一条MoveFirst试试
      

  3.   

    zhanghnll(男儿当学C++) 你的错误原因:
    当记录集(源数据库)被打开时pSet指针指向的数据库第一条记录的前一行,当然不能在这一行写入信息了。
    解决方法正如上面仁兄说的,在打开记录集后,添一句MoveFirst()函数,或者MoveNext(),这样pSet就指向数据库的第一条记录了。
      

  4.   

    如果在 CMySet 对应的数据库表中有时间类型的字段,请在CMySet的构造函数添加该字段的
    初始值: m_TimeValue = 0;
      

  5.   

    udbtuu2003说得很好,学习中……
      

  6.   

    非常感谢liuzhitie123,按你的操作就不会报错了,不知道这是不是MFC的BUG,
    结贴了,怎么给分啊!