前提:
  数据库ACCESS 2000,数据表DOCUMENTITEM中的字段DC_CODE为Required
ADO问题: 
  m_pRecordset->AddNew();报错"由于其 Required 属性设置为真(True),字段 'DOCUMENTITEM.DC_CODE' 不能包含 Null 值。在此字段中输入一个数值。"奇怪之处:
         ::CoInitialize(NULL);
HRESULT hr=S_OK; _ConnectionPtr m_pConn = NULL;
try
{
m_pConn.CreateInstance(__uuidof(Connection));
m_pConn->ConnectionTimeout = 30;
m_pConn->CommandTimeout = 180;
m_pConn->CursorLocation = adUseClient;
m_pConn->Open(L"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=Simple.mdb;Persist Security Info=False","","",adOpenUnspecified); m_pConn->Execute(L"SELECT * FROM DOCUMENTITEM",&vtMissing,adCmdText); //若这一句给注释掉则成功保存数据.我在这里插入这么一句的目的是看看为什么AddNew会报错,结果发现,只要在AddNew之前的任何地方(包括其它函数中)有对数据库操作的语句,则AddNew就不会成功,不知何故? 期待大家给予指点. _RecordsetPtr pRs;
pRs.CreateInstance(__uuidof(Recordset)); pRs->Open("SELECT * FROM DOCUMENTITEM_2004100100000002 WHERE DI_CODE='test'",m_pConn.GetInterfacePtr(),adOpenDynamic,adLockOptimistic,adCmdText);
pRs->AddNew();
                   ....
                  pRs->Update(); pRs->Close();
pRs = NULL;

解决方案 »

  1.   

    不是提示你了吗?'DOCUMENTITEM.DC_CODE' 不能包含 Null 值。在此字段中输入一个数值
    是不是DC_CODE字段你设置了不能为空,但事实上你让他为空了如果不是上面得问题,用insert table() values看看
      

  2.   

    我的意思是说必须用
    pRs->AddNew();
       ....
    pRs->Update();这种方式插记录,而不直接用SQL语句,因为插入的是大二进制.怎么才避免上面的错误.
      

  3.   

    m_pRecordset->AddNew();报错"由于其 Required 属性设置为真(True),字段 'DOCUMENTITEM.DC_CODE' 不能包含 Null 值。在此字段中输入一个数值。"好好读读
      

  4.   

    to gooyan,你可能没有理解我的意思,pRs->AddNew()这个地方就出错.而不是执行到pRs->Update()哪里才出错.
      

  5.   

    既然是要增加一条记录又为什么用“where”?而不是直接写成SELECT * FROM DOCUMENTITEM_2004100100000002 呢?
    要是pRs为NULL怎么办?
      

  6.   

    为什么不用:
    m_pConn->Execute(L"Insert Into [DOCUMENTITEM_2004100100000002] Values('值1','值2',.....)",&vtMissing,adCmdText);这样效率比较高
      

  7.   

    已经说了是处理大二进制,SQL语句不能直接插大二进制的.