难道大家没有试过用两个Table控件来实现关联吗?
----只有在桌面型简单应用中, 才可能用TTable控件.
因为它远不如直接操纵SQL来的自由.
还是再仔细看一下我第一个回答.
家在做这种主从表的时候,究竟是用程序
来控制(生成)ID值的情况多,还是利用数据库自己
生成ID的情况多,大家选择哪种,请把理由和各自的
优点告诉我。
----如果DBMS提供了自动生成序列的机制,
就用DBMS的.
如果没有,自己手工生成.
因为主表的ID是不能重复的,而且最好有规律,如:10000001-1000000X。
----为什么要有规律?
如果你是手工生成, 这种方式效率的确低下
我曾经这么做过:
建一个表,
字段只有ID, TableName
再看看下面代码, 体会一下.
function GetNextRecID(const ATableName: string): Integer;
var
strSql: string;
I: Integer;
ADOAAccessDB: TDOAAccessDB;
begin
Result := 0;
ADOAAccessDB := TDOAAccessDB.Create;
try
with ADOAAccessDB do
begin
strSql := 'SELECT * FROM PMIS.APP_RECID WHERE OBJ_RECID_TPNAME='''+ATableName+'''';
SqlOpenDOA(strSql);
if DataSet.State <> dsBrowse then
begin
DataSet.Close;
Exit;
end;
if DataSet.RecordCount<=0 then
begin
strSql := 'INSERT INTO PMIS.APP_RECID(OBJ_RECID_TPNAME, OBJ_RECID_RECID) VALUES(''' + ATableName + ''', 0)';
SqlExecDOA(strSql);
strSql := 'SELECT * FROM PMIS.APP_RECID WHERE OBJ_RECID_TPNAME = ''' + ATableName + '''';
SqlOpenDOA(strSql);
end;
if DataSet.RecordCount<=0 then
begin
DataSet.Close;
Exit;
end;
I := DataSet.FieldByName('OBJ_RECID_RECID').AsInteger;
I := I+1;
strSql := 'UPDATE PMIS.APP_RECID SET OBJ_RECID_RECID = '+IntToStr(I)+' WHERE OBJ_RECID_TPNAME = ''' + ATableName + '''';
SqlExecDOA(strSql);
strSql := 'SELECT * FROM PMIS.APP_RECID WHERE OBJ_RECID_TPNAME =''' + ATableName + '''';
SqlOpenDOA(strSql);
Result := DataSet.FieldByName('OBJ_RECID_RECID').AsInteger;
end;
finally
ADOAAccessDB.Free;
end;
end;