K
kkkchenA
Unregistered / Unconfirmed
GUEST, unregistred user!
比较久没有上网。
SQL是设定了主建,但是DataSet在生成更新用的SQL的时候要用到主建作为更新的条件,虽然你是在数据库里面设定了主建,但是这些主建的信息没有保存在DataSet中,所以在生成更新的SQL的时候,如果你是设定更新模式为主建更新的话,它会提示找不到主建。所以我们需要重载它获取主建的方法。
这个方法就是ADO控件里面获取主建的方法。
function PSGetKeyFields: string;
override;
下面是我的该方法的实现代码。
function TKmADOQuery.PSGetKeyFields: string;
var
ATableName: string;
ASQLStr: string;
begin
Result := inherited PSGetKeyFields;
if Result = '' then
begin
try
ASQLStr := 'EXEC sp_pkeys @table_name=%S';
FADOQuery.SQL.Clear;
FADOQuery.Connection := self.Connection;
ATableName := GetTableNameFromSQL(CommandText);
if (POS(';', ATableName) <> 0) or (ATableName = '') then
Exit;
FADOQuery.SQL.Add(Format(ASQLStr, [ATableName]));
FADOQuery.Open;
if FADOQuery.RecordCount > 0 then
begin
Result := FADOQuery.FieldByName('COLUMN_NAME').AsString;
end;
FADOQuery.Close;
except
Result := '';
end;
end;
end;
SQL是设定了主建,但是DataSet在生成更新用的SQL的时候要用到主建作为更新的条件,虽然你是在数据库里面设定了主建,但是这些主建的信息没有保存在DataSet中,所以在生成更新的SQL的时候,如果你是设定更新模式为主建更新的话,它会提示找不到主建。所以我们需要重载它获取主建的方法。
这个方法就是ADO控件里面获取主建的方法。
function PSGetKeyFields: string;
override;
下面是我的该方法的实现代码。
function TKmADOQuery.PSGetKeyFields: string;
var
ATableName: string;
ASQLStr: string;
begin
Result := inherited PSGetKeyFields;
if Result = '' then
begin
try
ASQLStr := 'EXEC sp_pkeys @table_name=%S';
FADOQuery.SQL.Clear;
FADOQuery.Connection := self.Connection;
ATableName := GetTableNameFromSQL(CommandText);
if (POS(';', ATableName) <> 0) or (ATableName = '') then
Exit;
FADOQuery.SQL.Add(Format(ASQLStr, [ATableName]));
FADOQuery.Open;
if FADOQuery.RecordCount > 0 then
begin
Result := FADOQuery.FieldByName('COLUMN_NAME').AsString;
end;
FADOQuery.Close;
except
Result := '';
end;
end;
end;