使用ADO实现对象添加、修改、删除数据 在修改时总是出错

使用ADO实现对象添加、修改、删除数据 在修改时总是出错, 无法进行修改,有人知道原因吗?

img


```c++
    UpdateData(TRUE);//TRUE:控件值->变量,FALSE:变量->控件
    if (m_XuHao == "" || m_MingChen == "" || m_ShuZhi == "" )
    {
        AfxMessageBox(_T("信息不能为空!"));
        return;
    }

    // 在ADO操作中建议语句中要常用try...catch()来捕获错误信息,
    // 因为它有时会经常出现一些想不到的错误。
    try
    {
        // 写入各字段值
        m_pRecordset3->Move(n);//这里已经设置好默认n=1
        m_pRecordset3->PutCollect("XuHao", _variant_t(m_XuHao));
        m_pRecordset3->PutCollect("MingChen", _variant_t(m_MingChen));
        m_pRecordset3->PutCollect("ShuZhi", _variant_t(m_ShuZhi));
        m_pRecordset3->Update();

        AfxMessageBox(_T("修改成功!"));

        // 更新显示其库内容
        OnBnClickedReadaccess1();

        // 移动记录指针到新的位置
    }
    catch (_com_error& e)
    {
        AfxMessageBox(_T("修改失败"));
    }

```

报什么错了? Catch下面的MessageBox可以把Error的信息打印出来看看

你修改一下代码:

catch (_com_error& e)
{
    CString strErrorMsg;
    strErrorMsg.Format(_T("修改失败,错误信息:%s"), e.ErrorMessage());
    AfxMessageBox(strErrorMsg);
}

这样可以捕获更详细的错误信息。你先看看具体的错误是什么再进行下一步解决问题。

引用chatgpt的回答
根据代码,可能会出现以下一些错误:

  1. 如果在修改时出现错误,可能是由于某些列定义为“不可为空”,但在进行更新时,没有为这些列设置值。需要在更新之前检查是否已为所有列设置了值。
  2. 在执行Update之前,可能需要在Recordset上调用MoveNext方法将记录指针移动到要更新的记录。因为ADO默认在第一条记录上,如果没有调用MoveNext方法,会出现“权限不足”错误。
  3. 如果没有调用Open方法打开Recordset,可能无法更新。因为ADO需要打开Recordset才能进行更新操作。
  4. 如果使用ADO.NET来更新记录,则需要调用DataAdapter对象的Update方法来提交更改。

建议在Catch语句中添加详细的错误信息,以便更好地调试问题。

其他功能都正常是吗

以下内容部分参考ChatGPT模型:


根据提供的代码,似乎没有出现明显的错误。建议先检查一下数据库连接是否成功,以及表名、字段名是否正确。另外,可以加入更多的错误捕获和调试信息,例如输出 COM 错误信息、打印 SQL 语句等,以帮助定位问题所在。以下是一个修改数据的示例代码,供参考:

// 假设已经建立好数据库连接和 Recordset 对象 m_pRecordset
CString strSQL;
strSQL.Format("UPDATE MyTable SET Field1='%s', Field2='%s' WHERE ID=%d",
              m_strField1, m_strField2, m_nID);
try {
    m_pRecordset->Open(_variant_t(strSQL), m_pConnection.GetInterfacePtr(),
                       adOpenForwardOnly, adLockOptimistic, adCmdText);
    if (m_pRecordset->GetRecordCount() == 1) {
        AfxMessageBox(_T("修改成功!"));
    } else {
        AfxMessageBox(_T("未找到匹配的记录!"));
    }
} catch (_com_error& e) {
    AfxMessageBox(_T("修改失败:") + CString(e.ErrorMessage()));
}

如果我的建议对您有帮助、请点击采纳、祝您生活愉快