论坛: 编程破解 标题: VC下用CRecordset的子类对数据库查询操作(太长了,内谈) 复制本贴地址    
作者: f [yifanernei]    论坛用户   登录
我有两张表,一张表记录状态的信息,状态号为主键
另一张表记录状态转换的信息,现在我要删除一个状态,有什么好办法呢?
我的做法是,在状态转换的表中找出需要删除的(因为它们有联系,是上下层的),把状态号
放在一个数组里,可是删状态信息表里的状态时有点问题,我有什么办法能一次读出数组里
的状态记录吗?总不能一个循环里一个一个的读,一个一个的删吧。

地主 发表时间: 04-12-25 17:53

回复: kert_t8 [kert_t8]   论坛用户   登录
ON DELETE CASCADE

建表的时候,使用create语句对吧,在foreign key 状态 references 状态号 on delete cascade

作用是状态号删掉以后,状态转换表当中出现过这个状态号的信息全部被删除

还有一个办法是状态号如果出现在状态转换表中就不允许被删除, on delete 后面是什么东西忘了,自己查一下吧

以上办法Oracle适用,别的不知道

B1层 发表时间: 04-12-25 21:31

回复: kert_t8 [kert_t8]   论坛用户   登录
上面的话怎么说得不清不楚地,我喝酒了吗?


这个问题不应该使用Host Language来解决,而应该使用所连接的数据库解决。在这里,我假设你的状态变换表(第二张表)里面的状态号是使用状态信息表(第一张表)里的状态号作为外键的,如果没有,把它加上,因为这样才是一个好的设计,而面对一个不好的设计,编程时候你就是感觉很无奈

要申明这个外键应该在建表时使用 foreign key <状态> reference <状态号>。那么,如果需要实现上面的功能,就在这一句后面加上 on delete cascade,这样,一旦第一张表中的状态号被删除,第二张表里面凡是含有这个状态号的所有信息都将被自动删除

//应该是第二张表里面凡是在<状态>这个字段中含有这个状态号的信息将被自动删除

........


[此贴被 月之御者(kert_t8) 在 12月25日21时51分 编辑过]

B2层 发表时间: 04-12-25 21:47

回复: f [yifanernei]   论坛用户   登录
听你这么一说好象问题都挺好解决了
可惜啊,为什么我不早点看看这方面的东西呢?
其实做这个东西的过程我也在学习,数据库的方面也什么都不懂呢,我到是想到外键的问题了
可是我用的Access,我找不到在什么地方加外键
不管了,反正已经这样了,我最后是这样做的
m_strFilter.Format("state = %d ", DelState[0]);
CString filter;
for (int n=1; n<j; n++)
{
    filter.Format("or state = %d", DelState[n]);
    m_strFilter += filter;
}
最后再Requery()也不知道到底效率怎么样。
谢谢阿月!!!
这么做有什么不好,还请大家提出来啊!

B3层 发表时间: 04-12-26 00:15

回复: kert_t8 [kert_t8]   论坛用户   登录
对Access认识不深,不过想来堂堂微软,不会开发出一个数据库软件,连外键都没法用吧?自己好好看看,我以前也用过一段时间,记得好像有

还有,没用过C++做数据库连接,你那个方法我也搞不懂,顶起来找个NB的人帮你看看吧

B4层 发表时间: 04-12-27 14:41

论坛: 编程破解

20CN网络安全小组版权所有
Copyright © 2000-2010 20CN Security Group. All Rights Reserved.
论坛程序编写:NetDemon

粤ICP备05087286号