Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi Query zu "gross"? (https://www.delphipraxis.net/72605-query-zu-gross.html)

xSkaschY 3. Jul 2006 19:21

Datenbank: MySQL • Version: 4.1 • Zugriff über: dbExpress

Query zu "gross"?
 
Hallo,

ich bin's mal wieder.

Habe zur Zeit ein Problem mit einem etwas grösseren Query den mein Delphi wohl nicht verarbeiten kann.

Der Query schaut folgendermasen aus:

SQL-Code:
SELECT `id`, `montuerid`, `montuer`, `auftragsnr`, `aki`, `onkz`, `asb`, `rufnr`, `strstandort`, `lsz`, `lszz`, `kuzeit`, `hvt`, `kvt`, `x12`, `x14`, `x16`, `x19`, `bemerkung`, `tea2x6`, `ntbaeinschub`, `montagebericht`, `courtesycall`, `rosikenner`, `erstehvtschaltung`, `erstekvtschaltung`, `fehlerimzugangsnetz`, `endleitungsnetz`, `anschlussbereitstellenamhvt`, `kundenfahrtbebeibae`, `anschlussbereitstellenbeimkunden`, `endleitungapl`, `antrittspauchalefuerexpressauftreage`, `stundenverrechnungssatz`, `zulagefuerweiterehvtschaltung`, `zulagefuerweiterekvtschaltung`, `installationskabel2da`, `installationskabel2dabis10da`, `verteileinrichtungen2da`, `schaltenmitgeschirmtenschaltdraht` FROM `table_03_07_06` WHERE `auftragsnr` = '056-0140642/06';
Als Fehlermeldung bekomme ich folgendes vor die Füße geworfen:

Access violation at adress 00538944 in module 'imex.exe'. Read of adress 00000000.

Ich bin am verzweifeln, selbst wenn ich diesen Query benutze:

SQL-Code:
SELECT * FROM `table_03_07_06` WHERE `auftragsnr` = '056-0140642/06';
Bekomm ich diese Fehlermeldung.

Den Query führe ich so aus:

Delphi-Quellcode:
// Ermittelt alle Auftragsdaten
statement := 'SELECT'+relevantfields+' FROM `' + main.Tabellenname + '` WHERE `auftragsnr` = '''+main.AuftragsNr+''';';
logForm.SQLAbfragen.Items.Add('Auftrags-Detail Query: ' + statement);
MySQLQuery.SQL.Text := statement;
MySQLQuery.Open;
Weiss jemand weiter?

Mit freundlichen Grüssen
Tobias Ehrig

SubData 3. Jul 2006 19:41

Re: Query zu "gross"?
 
´ und ` sind keine Zeichen die man für Quotes verwendet...

Ausserdem fehlen dir an manchen Stellen ein paar Leerzeichen, geh mal mit dem Debugger auf das Statement und schau dir mal an, wie das fertige Statement hinterher aussieht...

Edit: So ganz nebenbei, ist denn die Verbindung zur Datenbank überhaupt aufgebaut? Die Komponenten alle erstellt? Der SQL Server überhaupt aktiv? :)

xSkaschY 3. Jul 2006 19:48

Re: Query zu "gross"?
 
Hallo SubData,

das blöde ist, in phpMyAdmin funktioniert der Query!

Ja die Datenverbinung besteht da vorher ja mittels

SQL-Code:
SHOW COLUMNS FROM `table`
die Spaltennamen ausgelesen werden.

Zu den Quotes, doch sind Sie ;)

marabu 3. Jul 2006 21:14

Re: Query zu "gross"?
 
Hallo Tobias,

die Zugriffsadresse 0 deutet auf einen NIL Pointer hin. Halte doch das Programm an der Fehlerstelle einmal an und inspiziere die einzelnen Zeiger.

Grüße vom marabu

xSkaschY 3. Jul 2006 22:07

Re: Query zu "gross"?
 
Hallo Marabu,

wie kann ich das machen? Habe noch nicht so die Erfahrung mit dem Programm. :angel2:

mkinzler 4. Jul 2006 05:24

Re: Query zu "gross"?
 
Setzte einen Brekpoint an der Zeile, in der der Fehler ausgelöst wird und Starte dann das Programm in der IDE. Nun kannst du dir die aktuellen werte der einzelnen Variablen anzeigen lassen.

r_kerber 4. Jul 2006 05:56

Re: Query zu "gross"?
 
Zitat:

Zitat von SubData
´ und ` sind keine Zeichen die man für Quotes verwendet...

In MySQL aber schon ...
Zitat:

Zitat von xSkaschY
Access violation at adress 00538944 in module 'imex.exe'. Read of adress 00000000..
.
.
Delphi-Quellcode:
// Ermittelt alle Auftragsdaten
statement := 'SELECT'+relevantfields+' FROM `' + main.Tabellenname + '` WHERE `auftragsnr` = '''+main.AuftragsNr+''';';
logForm.SQLAbfragen.Items.Add('Auftrags-Detail Query: ' + statement);
MySQLQuery.SQL.Text := statement;
MySQLQuery.Open;

Ist das Objekt MySQLQuery an dieser Stelle schon erzeugt (mit Create)? Oder tritt der Fehler eventuell auch zwei Zeilen darüber auf (und logForm existiert noch nicht)?

xSkaschY 6. Jul 2006 08:23

Re: Query zu "gross"?
 
Hallo r_kerber,

Das Objekt MySQLQuery ist schon verfügbar, da ich ein Paar Zeilen vorher schon ein Query ausführe.

Hier mal die Prozedur:

Delphi-Quellcode:
procedure TformAuftragsedit.FrameResize(Sender: TObject);
var relevantfields: String;
begin
  mysql_connect();
  value_auftragsnummer.Caption := main.AuftragsNr;
  relevantfields := '';

  if MySQLConnection.Connected then begin
    MySQLQuery.SQL.Clear;
    MySQLQuery.SQLConnection := MySQLConnection;

    // Ermittelt alle verfügbaren Spaltennamen und speichert sie in 'relevantfields'.
    try
      statement := 'SHOW COLUMNS FROM `' + main.Tabellenname + '`';
      formLog.SQLAbfragen.Lines.Add('TformAuftragsedit.FrameResize (Line: 84):');
      formLog.SQLAbfragen.Lines.Add(statement);
      formLog.SQLAbfragen.Lines.Add('');
      MySQLQuery.SQL.Text := statement;
      MySQLQuery.Open;
      while not MySQLQuery.EOF do begin
        relevantfields := relevantfields + ', `' + MySQLQuery.FieldByName('Field').AsString + '`';
        MySQLQuery.Next;
      end;
      Delete(relevantfields, 1, 1);
      MySQLQuery.SQL.Clear;
    finally
      // Ermittelt alle Auftragsdaten
      statement := 'SELECT '+relevantfields+' FROM ' + main.Tabellenname + ' WHERE auftragsnr = '''+main.AuftragsNr+''';';
      showmessage(statement);
      formLog.SQLAbfragen.Lines.Add('TformAuftragsedit.FrameResize (Line: 100):');
      formLog.SQLAbfragen.Lines.Add(statement);
      formLog.SQLAbfragen.Lines.Add('');
      MySQLQuery.SQL.Text := statement;
      (*
       * Hier bekomme ich die AV!
       *)
      MySQLQuery.Open;

      //value_montuer.Text := MySQLQuery.FieldByName('montuer').AsString;
      MySQLQuery.Close;
    end;
  end;
end;

Im SQLAbfragen Fenster steht diese SQL-Statements drin:

SQL-Code:
// TformAuftragsedit.FrameResize (Line: 84):
SHOW COLUMNS FROM `table_03_07_06`

// TformAuftragsedit.FrameResize (Line: 100):
SELECT `id`, `montuerid`, `montuer`, `auftragsnr`, `aki`, `onkz`, `asb`, `rufnr`, `strstandort`, `lsz`, `lszz`, `kuzeit`, `hvt`, `kvt`, `x12`, `x14`, `x16`, `x19`, `bemerkung`, `tea2x6`, `ntbaeinschub`, `montagebericht`, `courtesycall`, `rosikenner`, `erstehvtschaltung`, `erstekvtschaltung`, `fehlerimzugangsnetz`, `endleitungsnetz`, `anschlussbereitstellenamhvt`, `kundenfahrtbebeibae`, `anschlussbereitstellenbeimkunden`, `endleitungapl`, `antrittspauchalefuerexpressauftreage`, `stundenverrechnungssatz`, `zulagefuerweiterehvtschaltung`, `zulagefuerweiterekvtschaltung`, `installationskabel2da`, `installationskabel2dabis10da`, `verteileinrichtungen2da`, `schaltenmitgeschirmtenschaltdraht` FROM table_03_07_06 WHERE auftragsnr = '056-0129101/06';

marabu 6. Jul 2006 09:02

Re: Query zu "gross"?
 
Hallo Tobias,

Zitat:

Zitat von xSkaschY
Das Objekt MySQLQuery ist schon verfügbar, da ich ein Paar Zeilen vorher schon ein Query ausführe.

das Objekt existiert, aber deine Beweisführung hinkt. Durch deinen unmotivierten Resourcen-Schutzblock würde der finally-Zweig durchlaufen, wenn das Objekt nicht existieren würde, aber vor dem try machst du schon einen Zugriff, der allem Anschein nach funktioniert.

Warum ermittelst du alle Feldnamen? In deinem Fall wäre ein SELECT * durchaus angemessen:

Delphi-Quellcode:
procedure TformAuftragsedit.FrameResize(Sender: TObject);
var
  relevantfields: String;
begin
  mysql_connect();
  value_auftragsnummer.Caption := main.AuftragsNr;

  if MySQLConnection.Connected then
  begin
    MySQLQuery.SQLConnection := MySQLConnection;

    // Ermittelt alle Auftragsdaten
    statement := Format('SELECT * FROM %s WHERE auftragsnr = :nr', [main.TabellenName]);
    MySQLQuery.SQL.Text := statement;
    MySQLQuery.Parameters.ParamByName('nr').AsString := main.AuftragsNr; // oder Params?
    MySQLQuery.Open;

    formLog.SQLAbfragen.Lines.Add('TformAuftragsedit.FrameResize (Line: 100):');
    formLog.SQLAbfragen.Lines.Add(statement);
    formLog.SQLAbfragen.Lines.Add('');

    value_montuer.Text := MySQLQuery.FieldByName('montuer').AsString; // Monteur ...
    // ...

    MySQLQuery.Close;
  end;
end;
Steht der Code im Ereignis OnResize() auch wirklich an der richtigen Stelle?

Grüße vom marabu

xSkaschY 6. Jul 2006 09:49

Re: Query zu "gross"?
 
Hallo Marabu,

Zitat:

Zitat von marabu
Warum ermittelst du alle Feldnamen? In deinem Fall wäre ein SELECT * durchaus angemessen:

Hab mir das so aus PHP angewöhnt, da es bei mehreren Abfragen deutlisch schneller ist als ein *-Statement. Zudem weiss ich welche Felder ich verwenden kann, und muss nicht immer nachschauen.

Zitat:

Zitat von marabu
Steht der Code im Ereignis OnResize() auch wirklich an der richtigen Stelle?


Will ich hoffen, er wird nämlich 2-mal ausgeführt. Warum weiss ich nicht!


BTW:
Es gibt auch eine AV mit deiner Variante. Ich verweifel langsam.

Habe testweise mal ein ExecSQL(); benutzt, der Query scheint OK zu sein, weil es keine Fehler gibt?
Nur hab ich ja dabei keine rückgabe.


Bis dahin, und weiter...


Alle Zeitangaben in WEZ +1. Es ist jetzt 08:50 Uhr.
Seite 1 von 2  1 2      

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