Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Sql Timeout expired (https://www.delphipraxis.net/155638-sql-timeout-expired.html)

value is NULL 2. Nov 2010 07:38

Datenbank: MSDE2000 • Version: 1 • Zugriff über: local

Sql Timeout expired
 
Hi Leute

habe folgendes problem. Ich versuche mittels folgendem code Inserts abzuschießen (ca 2,5 Mio)
jedoch bekomme ich nach einer willkürlichen Zahl an erledigten Inserts ein "Timeout Expired"

denn connect mache ich wie folgt:

Delphi-Quellcode:
function connect(): string;
begin
try
  CoInitialize(nil);
  Conn := TADOConnection.Create(nil);
  Conn.ConnectionString := 'Provider=SQLOLEDB.1;Integrated Security=SSPI;Persist Security Info = False;Initial Catalog=mydb;Data Source=localhost';
  Conn.Connected := true;
except
  on e : exception do begin
    Writeln(e.message);
    halt(1);
  end;
end;
end;
anschließend mache ich den insert

Delphi-Quellcode:
function update(sQuerySQL : string) : string;

begin
oTmpQry := TADOQuery.Create(nil);
try
  try
    oTmpQry.Connection := Conn;
    oTmpQry.CommandTimeout := 5000;
    oTmpQry.SQL.Text := sQuerySQL;
    oTmpQry.ExecSQL;
  except
    on e : exception do begin
      Writeln(e.message);
      halt(1);
    end;
  end;
Finally
  oTmpQry.free;
end;
end;
und anschließend das connect close

Delphi-Quellcode:
function close(): string;
begin
try
  Conn.Close;
  conn.Free;

except
  on e : exception do begin
      Writeln(e.message);
      halt(1);
  end;
end;
end;
mein prozedere ist wie folgt, ich lese aus einer anderen db werte aus und bastel mir einen insert string,
und diesen schieße ich mit den obigen prozeduren in eine andere db ab....

irgenwelche Ideen warum ich immer ein Timeout bekomme nach zB 70.000 inserts?

LG

sx2008 2. Nov 2010 07:50

AW: Sql Timeout expired
 
Wieso erzeugst du denn ständig ein neues TADOQuery-Objekt und zerstörst es anschliesend wieder?
Aber es geht auch ohne TADOQuery:
Delphi-Quellcode:
function update(const SQL : string) : string;
                      ^^^  keine Query, sondern nur eine SQL-Anweisung
begin
  try
    Conn.Execute(SQL); // SQL-Anweisung direkt über die Connection abschicken
  except
    on e : exception do begin
      Writeln(e.message);
      halt(1);
    end;
  end;
end;

Bummi 2. Nov 2010 07:53

AW: Sql Timeout expired
 
mist, sx2008 war schneller...
Wenn Du mit einem SQL-Server arbeitest (SSPI) wäre auch zu überlegen ob DTS nicht die bessere Alternative wäre bei 2,5 Sätzen.
Oder gegf. einen Verbindungsserver aufmachen und den SQL über alle Daten auf einmal ausführen.

Bernhard Geyer 2. Nov 2010 08:21

AW: Sql Timeout expired
 
Iiii. SQL-Strings direkt ohne Parmeter.

Ich tipp mal darauf das die MSDE einfach vollkommen in die Knie geht um die Datensätze in einer einzigen Transaktion einzufügen und so schon ein einzelner Insert sehr lange dauert und den Timeout zuschlagen lässt. Wie schaut es mit dem Speicherverbrauch und HD-Aktivitäten aus? Ich denke hier wird die MSDE schon an die von MS künstlichen Grenzen schlagen.

Bei vielen gleichen Datensätzen sind parametrisierte Abfragen um welten schneller. Als Kür wäre ein Bulk-Insert mit Parametern :-)

value is NULL 2. Nov 2010 08:44

AW: Sql Timeout expired
 
vielen dank für die schnellen antworten,

werde das Objekt mal nicht immer zerstören und die inserts abschießen

mal sehen was passiert.

LG

value is NULL 3. Nov 2010 08:30

AW: Sql Timeout expired
 
hallo alle zusammen, es hat jetzt funktioniert...

ich habe bei jedem insert die connection zur DB geöffnet und dann wieder getrennt,
jetzt habe ich 1000er blöcke gemacht, dh 2 x connection open
daten holen und inserts schicken und nach dem 1000sten die 2 connections trennen und neu aufmachen...

hat jetzt ohne probleme funktioniert

danke danke!


Alle Zeitangaben in WEZ +1. Es ist jetzt 21:25 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz