Locate()を使用しないでください。Locate()を使用する場合、Delphiはクライアント側で行を検索し、クエリから行セットをスキャンするだけで、かなりの時間がかかります。
MSSQLにアクセスしてストアドプロシージャを作成できる場合は、次のプロシージャを作成し、条件なしでTEXTファイルの各行に対して実行します(DelphiではTAdoStoredProc.ExecProcを使用します)。したがって、この場合、最初に選択して検索する手順は必要ありません。Filed1とField2が見つかった場合はレコードを更新し、見つからなかった場合は挿入します。
CREATE PROCEDURE dbo.update_table1
@Field1 int, --key1
@Field2 int, --key2
@Field3 int, -- data fileds
@Field4 int
AS
SET NOCOUNT ON
update table1 set Field3=@Field3,Field4=@Field4
where Field1=@Field1 and Field2=@Field2;
IF(@@Rowcount=0)
BEGIN
insert into table1(Field1,Field2,Field3,Field4)
values (@Field1,@Field2,@Field3,@Field4);
END
GO
ADOでこのストアドプロシージャを呼び出すためのDelphiコードは次のとおりです。
......
var
ADOStoredP: TADOStoredProc;
......
begin
........
ADOStoredP:=TADOStoredProc.Create(nil);
try
ADOStoredP.Connection:=DataMod.SQL_ADOConnection; //Your ADO Connection instance here
ADOStoredP.ProcedureName:='Update_table1';
ADOStoredP.Parameters.CreateParameter('@Field1', ftInteger, pdInput, 0, 0);
ADOStoredP.Parameters.CreateParameter('@Field2', ftInteger, pdInput, 0, 0);
ADOStoredP.Parameters.CreateParameter('@Field3', ftInteger, pdInput, 0, 0);
ADOStoredP.Parameters.CreateParameter('@Field4', ftInteger, pdInput, 0, 0);
While () -- Your text file loop here
begin
ADOStoredP.Parameters.ParamByName('@Field1').Value:=Field1 value from text file here;
ADOStoredP.Parameters.ParamByName('@Field2').Value:=Field2 value from text file here;
ADOStoredP.Parameters.ParamByName('@Field3').Value:=Field3 value from text file here;
ADOStoredP.Parameters.ParamByName('@Field4').Value:=Field4 value from text file here;
ADOStoredP.ExecProc;
end
finally
if Assigned(ADOStoredP) then
begin
ADOStoredP.Free;
end;
end;
........
end;