dbexpress mysql i wiszące połączenia

0

Witam,

próbuję załadować ok 120 rekordów do bazy. Mam na DataModule SqlConnection. Mam SqlQuery z ustawionym tym SqlConnection. Wstawiam w pętli SqlQuery.CommandText:='INSERT INTO tabela (pole1, pole2) VALUES (wart1, wart2)' i wykonuję SqlQuery.ExecSql(). Wszystko działa pięknie, ale każde wykonanie zapytania powoduje dodatkowe połączenie do bazy, które zamiast po wykonaniu zamknąć się, wisi ze stanem sleep. Po ustanowieniu liczby połączeń na poziomie maksymalnym serwera (u mnie 100) wywala mi błąd "Too many connections". Qrde 120 rekordów to chyba nie za wiele? Próbowałem ustawiać SqlConnection.AutoClone na false, ale to powoduje, że program wywala się już na pierwszym wykonaniu działania na bazie.
Ma ktoś pomysł? A może ktoś już zwalczył podobny problem?

Cieniu

0

Z moich dawnych czasów, gdy miałem jeszcze MySQL-a - jak przez mgłę pamiętam że w podobnej sytuacji pomogło zakończenie polecenia średnikiem.
Tyle że sytuacja była trochę inna, Delphi < 7, do tego jakieś ZEOS-y, więc wrzucam jako ciekawostkę.

Swoją drogą - wrzucanie w pętli jest koszmarnie wolne, nie lepiej skonstruować query złożone ze 120 insertów i wrzucić wszystko od razu?
(w innych, bardziej "cywilizowanych" bibliotekach są TxxScript, TxxBatch i podobne)

0

Też tak myślałem - "nie zamykam średnikiem, więc wisi" - ale niestety nie pomaga. No widzisz, jestem kompletnym nowicjuszem. Moje ostatnie programowanie odbywało się na Turbo Pascalu 6 z biblioteką Turbo Vision (jakieś 20 lat temu). Może ktoś podpowie jak wrzucić na dbexpress paczkę rekordów jednym ruchem?

0
Cieniu napisał(a):

Też tak myślałem - "nie zamykam średnikiem, więc wisi" - ale niestety nie pomaga. No widzisz, jestem kompletnym nowicjuszem. Moje ostatnie programowanie odbywało się na Turbo Pascalu 6 z biblioteką Turbo Vision (jakieś 20 lat temu). Może ktoś podpowie jak wrzucić na dbexpress paczkę rekordów jednym ruchem?

Nie mam pod ręką środowiska, więc nie wiem, czy dbExpress przyjmuje taką składnię. Chodziło mi o skonstruowanie wielolinijkowego query "w locie":

const
   FmtQuery = 'INSERT INTO mydb (pole1, pole2) VALUES (%d, %d);';

...
for i := 1 to 120 do
   Query.SQL.Add(Format(FmtQuery, [i, i*10]));

Query.ExecSQL;

Czy coś w tym stylu :)

0

Dzięki zaraz. Jutro poćwiczę czy pomoże. Kolega polecił mi jeszcze zapisanie komend do pliku tekstowego i potem SqlQuery.SQL.LoadFromFile, a następnie ExecSQL. Mam nadzieję, że będzie działać. Na pewno odpowiem na forum.

0
Cieniu napisał(a):

Na pewno odpowiem na forum.

Podaj mi na maila [email protected] jakieś namiary na siebie, to może pomogę więcej :)

0

Witam

Powróciłem do Delphi, a raczej Lazarusa, po 8 latach i nie mogąc poradzić sobie z problemem postanowiłem nieco odświerzyć ten wątek.

Mam bazę SQLite obsługiwaną spod aplikacji.
Potrzebuję zaimportować do niej około 5500 rekordów z pliku płaskiego (txt).
Dane są mniej więcej w takim formacie:

AA3BBB; 58
CC4DDD; 34

Import poprzez odczyt każdej lini i budowy insertu

SQLQuery1.SQL.Text:= 'insert into ...';
SQLQuery1.ExecSQL;

w pętli jest koszmarnie długi :-(

Wiem, że można przebudować plik tekstowy na komendy sql i skorzystać z SQLQuery.SQL.LoadFromFile jednak nie wydaje się to być zbyt eleganckie...

Mozna je zaimportować w jakiś sposób bezpośrednio z tego pliku tekstowego do konkretnej tabeli w bazie?

1 użytkowników online, w tym zalogowanych: 0, gości: 1