ODBC 数据库问题

时间:2021-07-24 04:36:39
         float WNumber; //⼀Ϛ
CStringA Name; //⼀Ϛ
CStringA Sex; //⼀Ϛ
CTime Date; //⼀Ϛ
CStringA SNumber; //⼀Ϛ
CStringA GNumber; //⼀Ϛ
CStringA WClass; //⼀Ϛ
CStringA PNumber; //⼀Ϛ


RFX_Single(pFX, _T("[员工号]"), WNumber);
RFX_Text(pFX, _T("[姓名]"), Name);
RFX_Text(pFX, _T("[性别]"), Sex);
RFX_Date(pFX, _T("[进厂时间]"), Date);
RFX_Text(pFX, _T("[车间编号]"), SNumber);
RFX_Text(pFX, _T("[小组编号]"), GNumber);
RFX_Text(pFX, _T("[工种]"), WClass);
RFX_Text(pFX, _T("[联系方式]"), PNumber);


          add.record.WNumber=30000;
         add.record.Name=_T("艾丝薇儿");
         add.record.Sex=_T("男");
CTime time(1992,5,20,0,0,0);
add.record.Date=time;
add.record.SNumber=_T("S001");
add.record.GNumber=_T("L001");
add.record.WClass=_T("收发");
add.record.PNumber=_T("15971363025");
add.record.Update();
add.record.Close();


数据插不进去 求解答 本例有用add.record.AddNew()

调试定位错误为:
BOOL CRecordset::Update()
{
ASSERT_VALID(this);
ASSERT(m_hstmt != SQL_NULL_HSTMT);//断点落在此处

if (m_dwOptions & useMultiRowFetch)
{
// Can't use update methods on multi-row rowset
ASSERT(FALSE);
return FALSE;
}

if (m_nEditMode != addnew && m_nEditMode != edit)
{
TRACE(traceDatabase, 0, _T("Error: must enter Edit or AddNew mode before updating.\n"));
ThrowDBException(AFX_SQL_ERROR_ILLEGAL_MODE);
}
return UpdateInsertDelete();
}

10 个解决方案

#1


只看到Close 没看到Open啊

#2


引用 1 楼 zgl7903 的回复:
只看到Close 没看到Open啊
有Open();

#3



  try
  {
    CRecordset rs;
    if(rs.Open())
    {
      if(rs.CanUpdate()) //非只读
      {
        //先查看记录是否存在
        rs.m_strFilter = _T("姓名 = '艾丝薇儿'");
        rs.Requery();
        if(rs.GetRecordCount() > 0)//存在记录编辑 否则添加
          rs.Edit();
        else
          rs.AddNew();

        //更新数据
        rs.Name=_T("艾丝薇儿");
        rs.Sex=_T("男");

        //更新到数据库
        rs.Update();
      }
      rs.Close();
    }
  }
  catch (CDBException* e)
  {
   e->ReportError();
    e->Delete();
  }

#4


不行咯 这个是插不进去 我的那一个帖子 你也回复了的 就是插的进去 但是 出现问题

#5


这个是我故意设的不与表中的主键重值 等记录可以插了再完善
   rs.m_strFilter = _T("姓名 = '艾丝薇儿'");
        rs.Requery();
        if(rs.GetRecordCount() > 0)//存在记录编辑 否则添加

#6


引用 3 楼 zgl7903 的回复:
C/C++ code

  try
  {
    CRecordset rs;
    if(rs.Open())
    {
      if(rs.CanUpdate()) //非只读
      {
        //先查看记录是否存在
        rs.m_strFilter = _T("姓名 = '艾丝薇儿'");
        rs.Requery();
        ……

我的这个今天突然可以插值了 但是出现了
http://topic.csdn.net/u/20120225/12/ac3de8f1-bdbd-4015-a8bc-ea209f7bd845.html
和上面这个一样的错误啊 如果这个解决了 就成功了

#7


判断各记录的值是否正确,是不是有空值,语句应该没问题,有时候能插进去有时不能,可能是什么值有时符合要求有时不符合要求.这得用一步一步执行或在估计有问题的地方设断点执行

#8


引用 7 楼 hdg3707 的回复:
判断各记录的值是否正确,是不是有空值,语句应该没问题,有时候能插进去有时不能,可能是什么值有时符合要求有时不符合要求.这得用一步一步执行或在估计有问题的地方设断点执行

嗯 是这样的 但是插的进去了 现在  就是出现了我以前发的一个帖子中同样的错误:http://topic.csdn.net/u/20120225/12/ac3de8f1-bdbd-4015-a8bc-ea209f7bd845.html

#9


引用 8 楼 linghuazaii 的回复:
引用 7 楼 hdg3707 的回复:

判断各记录的值是否正确,是不是有空值,语句应该没问题,有时候能插进去有时不能,可能是什么值有时符合要求有时不符合要求.这得用一步一步执行或在估计有问题的地方设断点执行

嗯 是这样的 但是插的进去了 现在 就是出现了我以前发的一个帖子中同样的错误:http://topic.csdn.net/u/20120225/12/ac3de8f1-bdbd-4……

看数据库结构里的每一个字段属性,如果某个字段有限制,比如非空,长度等限制,先去掉再试试,另外,时间格式和计算机设置有关,是不是时间格式不对,我以前碰到这情况

#10


引用 9 楼 hdg3707 的回复:
引用 8 楼 linghuazaii 的回复:
引用 7 楼 hdg3707 的回复:

判断各记录的值是否正确,是不是有空值,语句应该没问题,有时候能插进去有时不能,可能是什么值有时符合要求有时不符合要求.这得用一步一步执行或在估计有问题的地方设断点执行

嗯 是这样的 但是插的进去了 现在 就是出现了我以前发的一个帖子中同样的错误:http://topic.csdn.net/u/2……

不会是时间格式的问题 你去看我的另一个帖子吧 那一个代码少很多 是测试用的
http://topic.csdn.net/u/20120225/12/ac3de8f1-bdbd-4015-a8bc-ea209f7bd845.html

#1


只看到Close 没看到Open啊

#2


引用 1 楼 zgl7903 的回复:
只看到Close 没看到Open啊
有Open();

#3



  try
  {
    CRecordset rs;
    if(rs.Open())
    {
      if(rs.CanUpdate()) //非只读
      {
        //先查看记录是否存在
        rs.m_strFilter = _T("姓名 = '艾丝薇儿'");
        rs.Requery();
        if(rs.GetRecordCount() > 0)//存在记录编辑 否则添加
          rs.Edit();
        else
          rs.AddNew();

        //更新数据
        rs.Name=_T("艾丝薇儿");
        rs.Sex=_T("男");

        //更新到数据库
        rs.Update();
      }
      rs.Close();
    }
  }
  catch (CDBException* e)
  {
   e->ReportError();
    e->Delete();
  }

#4


不行咯 这个是插不进去 我的那一个帖子 你也回复了的 就是插的进去 但是 出现问题

#5


这个是我故意设的不与表中的主键重值 等记录可以插了再完善
   rs.m_strFilter = _T("姓名 = '艾丝薇儿'");
        rs.Requery();
        if(rs.GetRecordCount() > 0)//存在记录编辑 否则添加

#6


引用 3 楼 zgl7903 的回复:
C/C++ code

  try
  {
    CRecordset rs;
    if(rs.Open())
    {
      if(rs.CanUpdate()) //非只读
      {
        //先查看记录是否存在
        rs.m_strFilter = _T("姓名 = '艾丝薇儿'");
        rs.Requery();
        ……

我的这个今天突然可以插值了 但是出现了
http://topic.csdn.net/u/20120225/12/ac3de8f1-bdbd-4015-a8bc-ea209f7bd845.html
和上面这个一样的错误啊 如果这个解决了 就成功了

#7


判断各记录的值是否正确,是不是有空值,语句应该没问题,有时候能插进去有时不能,可能是什么值有时符合要求有时不符合要求.这得用一步一步执行或在估计有问题的地方设断点执行

#8


引用 7 楼 hdg3707 的回复:
判断各记录的值是否正确,是不是有空值,语句应该没问题,有时候能插进去有时不能,可能是什么值有时符合要求有时不符合要求.这得用一步一步执行或在估计有问题的地方设断点执行

嗯 是这样的 但是插的进去了 现在  就是出现了我以前发的一个帖子中同样的错误:http://topic.csdn.net/u/20120225/12/ac3de8f1-bdbd-4015-a8bc-ea209f7bd845.html

#9


引用 8 楼 linghuazaii 的回复:
引用 7 楼 hdg3707 的回复:

判断各记录的值是否正确,是不是有空值,语句应该没问题,有时候能插进去有时不能,可能是什么值有时符合要求有时不符合要求.这得用一步一步执行或在估计有问题的地方设断点执行

嗯 是这样的 但是插的进去了 现在 就是出现了我以前发的一个帖子中同样的错误:http://topic.csdn.net/u/20120225/12/ac3de8f1-bdbd-4……

看数据库结构里的每一个字段属性,如果某个字段有限制,比如非空,长度等限制,先去掉再试试,另外,时间格式和计算机设置有关,是不是时间格式不对,我以前碰到这情况

#10


引用 9 楼 hdg3707 的回复:
引用 8 楼 linghuazaii 的回复:
引用 7 楼 hdg3707 的回复:

判断各记录的值是否正确,是不是有空值,语句应该没问题,有时候能插进去有时不能,可能是什么值有时符合要求有时不符合要求.这得用一步一步执行或在估计有问题的地方设断点执行

嗯 是这样的 但是插的进去了 现在 就是出现了我以前发的一个帖子中同样的错误:http://topic.csdn.net/u/2……

不会是时间格式的问题 你去看我的另一个帖子吧 那一个代码少很多 是测试用的
http://topic.csdn.net/u/20120225/12/ac3de8f1-bdbd-4015-a8bc-ea209f7bd845.html