三层的数据库程序中主细表数据的插入和删除问题

fyje 2000-12-13 11:07:00
我刚用C++Builder编写三层的数据库程序,就遇到了难题:
使用巢状数据表实现Master/Detail的应用系统时,发现修改没问题,而主表和细表的插入、主表删除不能进行,主表插入错误提示“键强制”,细表插入提示“没有正确的主表记录”。主表删除提示“不能删除一个带有细表的主记录”,我先删除细表记录,再删主表记录也出错,请教各位大虾,帮助解决,谢谢。
...全文
98 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
comanche 2000-12-14
  • 打赏
  • 举报
回复
不知道你服务器用什么连接
Master/Detail是在服务器实现还是在客户机实现
.在服务器时最常出现的事就是 record changed by another user 但可以改 DataSetProvider的UpdateMode为KeyOnly,如果还不行就要放两个UpdateSQL在服务器上(针对BDE),响应DataSetProvider的OnUpdateRecord, 在这可以 if ( SourceDS == 主表 )就更新主表 else更新子表(master/detail时是子表先更新再主表), 对于服务器使用UpdateSQL要自已写一个SetParams函数(这个函数4.0不能用),我贴在下面
.在服务器还有一个问题,如果用BDE连接会使detail表始终打开,也就意味着一定要占用一个session. 就没法作session pooling, 所以只好响应DataSetProvider的AfterGetRecord关闭子表
.如果在客户机实现那就大大的不一样了,我不这么做
.不知道你想不想知道ADO连接是怎样做的, 想知道我下次贴给你
//---------------------------------------------------------------------------
void __fastcall SetParams( TUpdateSQL *UpdateSQL,
TClientDataSet *DeltaDS, TUpdateKind UpdateKind )
{
if ( UpdateSQL->DataSet == 0 )
return;

TQuery *UpdateQuery = UpdateSQL->Query[UpdateKind];

for ( int i = 0; i < UpdateQuery->Params->Count; i ++ )
{
TParam *Param = UpdateQuery->Params->Items[i];
AnsiString ParamName = Param->Name;

bool IsOld = ParamName.AnsiPos( "OLD_" ) == 1;
if ( IsOld == true )
ParamName = ParamName.Delete( 1, 4 );

TField *Field = DeltaDS->FindField( ParamName );

if ( Field == 0 )
continue;

if ( IsOld == true )
Param->AssignFieldValue( Field, Field->OldValue );
else
{
Variant Value = Field->NewValue;
if ( Value.IsEmpty( ) == true )
Value = Field->OldValue;

Param->AssignFieldValue( Field, Value );
}
}
}
//---------------------------------------------------------------------------
fyje 2000-12-14
  • 打赏
  • 举报
回复
看来你是高手了,我刚使用bcb编程序,还有很多问题弄不懂,希望能得到你更多的帮助
问题我已经搞清楚了,原因是主表中连接字段不唯一造成的,谢谢你的帮助
交个朋友好吗,我的oicq:3577335 ,email:fyje@sina.com

1,178

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder 数据库及相关技术
社区管理员
  • 数据库及相关技术社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧