Hallo hde,
danke erstmal, dass Du Dich für mein Problem interessierst! Zur Lösung hatte ich natürlich auch Query.SQL.Text:=... und Query.ExecQSL probiert, dabei kommt es zu dem gleichen SIGSEGV-Fehler.
Evtl. sollte ich etwas weiter ausholen (ich dachte das Minimalbsp würde besser für sich sprechen, als wenn ich einen langen Text verfasse). Ich habe eine unbekannte Zahl an Tabellen (ich rechne mit ca. 5000 zur Laufzeit), in jeder dieser Tabellen können vom Programm beliebig viele Spalten mit unterschiedlichen Datentypen eingefügt werden (ich rechne mit 1..50 Spalten, im Schnitt werden es wohl ca. 10 Spalten sein). In diesen Spalten werden die Datensätze jeweils einer ID-Nr zugeordnet (ich rechne mit im Schnitt 5000 Datensätzen). Das Programm läuft auch soweit, sofern ich nicht mehr als eine Spalte einer Tabelle zur Laufzeit erstelle.
Um den Fehler einzugrenzen habe ich den Fehler auf das Minimalbeispiel reduzieren können.
Folgendes funktioniert:
1. Frage ab, ob Spalte existiert
2. Falls nicht, Spalte anlegen
3. Connection.Disconnect
4. Connection.Connect
5. Frage ob ID existiert
6. Trage Daten in Spalte ein, Update/Insert je nach Existenz von ID (eine Function UpSert kann ich nicht verwenden, da ich, falls die ID schon Daten/abweichende Daten in der Spalte hat, diese auslesen will und prüfen lassen will)
zurück zu 1
Folgendes funktioniert nicht:
1. Frage ab, ob Spalte existiert
2. Falls nicht, Spalte anlegen
3. Frage ob ID existiert
4. Trage Daten in Spalte ein, Update/Insert je nach Existenz von ID
zurück zu 1
1. Frage ab, ob Spalte existiert
2. Falls nicht, Spalte anlegen
3. Frage ob ID existiert <- hier kommt es zu dem SIGSEGV
Folgende SQL-Befehle verwende ich:
Code: Alles auswählen
//1. Frage ab, ob Spalte existiert
Query.SQL.Text:='SELECT column_name FROM information_schema.COLUMNS WHERE table_name = ''tab1'';';
Query.Open;
//2. Falls nicht, Spalte anlegen
Connection.ExecuteDirect('ALTER TABLE tab1 ADD COLUMN '+Spalte+' INTEGER;');
//oder
Query.SQL.Text:='ALTER TABLE tab1 ADD COLUMN '+Spalte+' INTEGER;';
Query.ExecSQL;
//3. Frage ob ID existiert
Query.SQL.Text:='SELECT * FROM tab1 WHERE id = :id;';
Query.ParamByName('id').AsInteger:=aID;
Query.Open;
//4. Insert
Query.SQL.Text:='INSERT INTO tab1 (id, '+Spalte+') VALUES (:id, :wert);';
Query.ParamByName('id').AsInteger:=aID;
Query.ParamByName('wert').AsInteger:=aI;
Query.ExecSQL;
Also eigentlich nichts ungewöhnliches?!
[Edit]: Nun wurde mein Thread im Zeos-Forum doch noch eröffnet:
http://zeoslib.sourceforge.net/viewtopi ... 38&t=11384