我用ODBC接Access数据库(内有两个表,其中一个表有两个主键)为什么总是无法写入数据?我试着不对那个有两个主键的表进行操作,可是同样无法运行。
可是如果删除那个有两个主键的表及其相关连接后立即恢复正常,这是为什么,应该怎样做?

解决方案 »

  1.   

    是不是其中有外键的
    table1
    AIDtable2
    BID
    AID//和table1的ID关联如果B表中AID在B表中找不到的话,就无法插入
      

  2.   

    我的两个表:
    一个有一个主键,
    另一个有两个主键。Access的表可以设定外键么?怎么设。
      

  3.   

    你的怀疑正确
    有一位前辈指教,她给我的码作了如下改正:

    void CTView::OnDraw(CDC* pDC) 
    {
    try
    {
    sDB.AddNew();
    sDB.m_shipID = 999911;
    sDB.m_v  = 12;
    sDB.Update();
    }
    catch(CDBException* e)
    {
    MessageBox(e->m_strError); }
    }
    改为
    void CTView::OnLButtonDown(UINT nFlags, CPoint point) 
    { CShipDB *sDB;
    try
    { m_nID ++;
    sDB = new CShipDB();
    sDB->Open();
    sDB->AddNew(); sDB->m_shipID= m_nID;//
    sDB->m_v=12;

    sDB->Update();
    AfxMessageBox("ok!");
    }
    catch(CDBException* e)
    {
    MessageBox(e->m_strError);
    e->Delete();

    } if(sDB)
    {
    delete sDB;
    sDB = NULL;
    }

    CFormView::OnLButtonDown(nFlags, point);
    }
    我原来程序的结构是这样的
    首先我生成一个普通的程序框架(不支持数据库的)
    然后我给她
    1:添加一个CRecordSet的派生类:CMyDSet, (MyDSet.h, MyDSet.cpp);
    2:在stdAfx.h里面添加: include <afxdb.h>
    3: 在xxview.h里面:
         include "MyDSet.h"  
          ....................
         CMyDSet m_Dset;
    4: 在xxview.cpp里面通过 m_Dset 对数据库进行存取调用操作。
    我看到的现象是:有时候是好用的有时候根本不灵,不论你删除CMyDSet类,再重新生成还是不灵,我刚开始怀疑是数据库的问题可是我新做成一个支持数据源操作(CRecordView)的程序一试,完全正常该库可以正常读写。
    可是改正过的码有如下问题
    这里面的数据对象sDB在敲击动作的同时产生,敲击结束就被取消了,我实际的程序中需要多处用到该数据对象,可否比放在oninitialupdate之类的函数中生成并且打开她,在程序结束后比方析构函数里delete她呢?我这样试了可是出现了一个没有有效句柄的错误提示,可能实现这样的构造么?
    应该怎样做?
      

  4.   

    sDB.m_shipID = 999911;//主键??主键不能有重复的
      

  5.   

    错误信息是:现在RECORDSET处于只读模式
      

  6.   

    那么,是不是你在执行应用程序时,用Accsee正处于表的设计状态呢?
    这样要关闭accsee
      

  7.   

    我在执行程序的时候并没有打开表。
    想要对含有两个表的recordset添加数据(实现addnew)是不是必须用以下的ChangeTable()函数每次只open一个表?或者可以在open函数里面用m_pSet->Open(AFX_DB_USE_DEFAULT_TYPE,”SELECT * FROM  SLOT0, SLOT1”)同时打开两个表来进行addnew操作呢?
        void CDB::ChangeTable()
        {
         if(m_pSet->IsOpen()) m_pSet->Close();
        switch(m_id)
        {
        case 0:
        m_pSet->Open(AFX_DB_USE_DEFAULT_TYPE,”SELECT * FROM  SLOT0”);//连接表SLOT0
        m_id=1;
        break;
        case 1:
        m_pSet->Open(AFX_DB_USE_DEFAULT_TYPE,”SELECT * FROM SLOT1”);//连接表SLOT1
        m_id=0;
        break;
        }
        }
      

  8.   

    那你就把你的两个表做一个视图,让recordset和视图建立连接吧.
      

  9.   

    我也曾用一个CRecordSet对两个表进行过操作,在操作中确实会有问题.我理解,在使用某一表前,应先用CRecordSet对象打开,操作结束后要注意关闭对象,这样一般可以避免问题的出现.
      

  10.   

    wddodo(wd) :我照您说的作了,可是没有改善,您是怎样做的能够给点码,或者给个步骤么?
      

  11.   

    你肯定有一个键是foreign KEY