請勿使用Locate()。如果你使用locate(),那麼Delphi在客戶端搜索行只是從你的查詢中掃描行集,它需要很多時間。
如果您有權訪問MSSQL來創建存儲過程,那麼創建以下過程,並在沒有任何條件的情況下(在Delphi中使用TAdoStoredProc.ExecProc)從TEXT文件中的每一行運行它。所以在這種情況下,你不需要先選擇和定位程序。如果找到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 [email protected],[email protected]
where [email protected] and [email protected];
IF(@@Rowcount=0)
BEGIN
insert into table1(Field1,Field2,Field3,Field4)
values (@Field1,@Field2,@Field3,@Field4);
END
GO
下面是Delphi代碼調用與ADO這個存儲過程:
......
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;
該解決方案將加載時間從4小時減少到4分鐘以內。我非常感謝你的幫助!謝謝! – horgh