我用ODBC接Access数据库(内有两个表,其中一个表有两个主键)的时候为什么总是无法写入数据? 我用ODBC接Access数据库(内有两个表,其中一个表有两个主键)为什么总是无法写入数据?我试着不对那个有两个主键的表进行操作,可是同样无法运行。可是如果删除那个有两个主键的表及其相关连接后立即恢复正常,这是为什么,应该怎样做? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 是不是其中有外键的table1AIDtable2BIDAID//和table1的ID关联如果B表中AID在B表中找不到的话,就无法插入 我的两个表:一个有一个主键,另一个有两个主键。Access的表可以设定外键么?怎么设。 你的怀疑正确有一位前辈指教,她给我的码作了如下改正:从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她呢?我这样试了可是出现了一个没有有效句柄的错误提示,可能实现这样的构造么?应该怎样做? sDB.m_shipID = 999911;//主键??主键不能有重复的 错误信息是:现在RECORDSET处于只读模式 那么,是不是你在执行应用程序时,用Accsee正处于表的设计状态呢?这样要关闭accsee 我在执行程序的时候并没有打开表。想要对含有两个表的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; } } 那你就把你的两个表做一个视图,让recordset和视图建立连接吧. 我也曾用一个CRecordSet对两个表进行过操作,在操作中确实会有问题.我理解,在使用某一表前,应先用CRecordSet对象打开,操作结束后要注意关闭对象,这样一般可以避免问题的出现. wddodo(wd) :我照您说的作了,可是没有改善,您是怎样做的能够给点码,或者给个步骤么? 你肯定有一个键是foreign KEY 在dll里面如何使用exe里面的CEvent类成员变量 绘图后如何刷新?? 如何响应menu点击事件? 紧急求助:关于用VC做的ASP组件在运行时不经常的出现运行时错误的原因 散分。再来再来,还没拿到分的兄弟过来了 error C2857: 在源文件中没有找到用 /Ycstdafx.h 命令行选项指定的“#include”语句 关于EVC开发的超级菜鸟问题.---急!!! 总是报告端口已被绑定,怎么办? 关于硬盘空间的问题 OleLoadPicture返回失败 静态成员函数可以为虚函数吗?为什么? 关于CopyFile(...)的使用
table1
AIDtable2
BID
AID//和table1的ID关联如果B表中AID在B表中找不到的话,就无法插入
一个有一个主键,
另一个有两个主键。Access的表可以设定外键么?怎么设。
有一位前辈指教,她给我的码作了如下改正:
从
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她呢?我这样试了可是出现了一个没有有效句柄的错误提示,可能实现这样的构造么?
应该怎样做?
这样要关闭accsee
想要对含有两个表的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;
}
}