![]() |
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:
Als Fehlermeldung bekomme ich folgendes vor die Füße geworfen:
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';
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:
Bekomm ich diese Fehlermeldung.
SELECT * FROM `table_03_07_06` WHERE `auftragsnr` = '056-0140642/06';
Den Query führe ich so aus:
Delphi-Quellcode:
Weiss jemand weiter?
// 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; Mit freundlichen Grüssen Tobias Ehrig |
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? :) |
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:
die Spaltennamen ausgelesen werden.
SHOW COLUMNS FROM `table`
Zu den Quotes, doch sind Sie ;) |
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 |
Re: Query zu "gross"?
Hallo Marabu,
wie kann ich das machen? Habe noch nicht so die Erfahrung mit dem Programm. :angel2: |
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.
|
Re: Query zu "gross"?
Zitat:
Zitat:
|
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'; |
Re: Query zu "gross"?
Hallo Tobias,
Zitat:
Warum ermittelst du alle Feldnamen? In deinem Fall wäre ein SELECT * durchaus angemessen:
Delphi-Quellcode:
Steht der Code im Ereignis OnResize() auch wirklich an der richtigen Stelle?
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; Grüße vom marabu |
Re: Query zu "gross"?
Hallo Marabu,
Zitat:
Zitat:
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... |
Re: Query zu "gross"?
Also ich bin wirklich am verzweifeln.
Ist es wirklich "zuviel" input für die MySQL kompo? (dbExpress) Zitat:
meintest du evtl. das hier?:
Code:
Source Breakpoint at $005342A3: C:\Dokumente und Einstellungen\Toby\Eigene Dateien\skyNetworx\TK-NL-West\units\auftragedit.pas line 174. Process imex.exe (3652)
First chance exception at $77D60096. Exception class EAccessViolation with message 'Access violation at address 0052E080 in module 'imex.exe'. Read of address 00000000'. Process imex.exe (3652) Source Breakpoint at $005342A3: C:\Dokumente und Einstellungen\Toby\Eigene Dateien\skyNetworx\TK-NL-West\units\auftragedit.pas line 174. Process imex.exe (3652) First chance exception at $77D60096. Exception class EAccessViolation with message 'Access violation at address 0052E080 in module 'imex.exe'. Read of address 00000000'. Process imex.exe (3652) First chance exception at $77D60096. Exception class EAccessViolation with message 'Access violation at address 69656162. Read of address 69656162'. Process imex.exe (3652) |
Re: Query zu "gross"?
Du hast jetzt den Breakpoint in Zeile 174 von Modul AuftragEdit.pas gesetzt - und dann das Programm einfach weiter laufen lassen? Wenn der Breakpoint erreicht ist, dann musst du in der IDE mal alle relevanten Objekte inspizieren. Wenn eine davon NIL ist, dann hast du einen Hinweis darauf, was schief läuft.
marabu |
Re: Query zu "gross"?
Ich kann dir irgendwie nicht folgen.
Aber warum - könnte - es sein das da was auf einen NIL-Pointer zeigt ? Vorher gings doch :wall: |
Re: Query zu "gross"?
Sooo ich möchte jetzt sagen das es 100% daran liegt, das es einfach zu viele (41) Spalten für die TMySQLQuery komponente von dbExress.
Habe die Query's mal gesplittet und siehe da, es funktioniert! Warum die Kompos das nicht verarbeiten können weiss ich nicht. Vllt hat ja jemand von euch eine logische erklärung. MFg Toby |
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:36 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz