Datenbankzugriff (*.mdb) und Umlaute

Für Themen zu Datenbanken und Zugriff auf diese. Auch für Datenbankkomponenten.
Antworten
Flenser
Beiträge: 24
Registriert: Di 28. Okt 2014, 12:49

Datenbankzugriff (*.mdb) und Umlaute

Beitrag von Flenser »

Guten Morgen,

ich arbeite gerade an einem Programm als Datenbankoberfläche, dass die alte Datenbankoberfläche (Excel-VBA - nicht meine Erfindung) mit einer vorhandenen Access-Datebank
ablösen soll. Beide Programme sollen eine Zeit lang parallel laufen.

Blöderweise sind in dem Tabellennamen und in den Spaltennamen Umlaute und ß enthalten. Für die Programmierung habe ich die Datenbank kopiert und die Umlaute ersetzt.
Im Realbetrieb muss ich irgendwie die Umlaute abfangen, da ich sie nicht aus der Datenbank entfernen will/kann.

Code: Alles auswählen

ODBCConnection1.DatabaseName:='Pruefung2018';                      // Umlaut im Dateiname "Prüfung" durch System-DSN "umschifft"
  ODBCConnection1.UserName:='Admin';
  ODBCConnection1.Transaction:=SQLTransaction1;
   SQLTransaction1.Database:=ODBCConnection1;
  SQLQuery1.Database:=ODBCConnection1;
  SQLQuery1.Transaction:=SQLTransaction1;
  SQLQuery1.UsePrimaryKeyAsKey:=False;
  SQLQuery1.SQL.Text:='SELECT * FROM Pruefung where (Pruefnr like :Pruefnr) and (Bauvor like :Bauvorhaben)and (Bauort like :Bauort) and (Strasse like :Strasse)';
 //  FROM Prüfung   (Pruefnr like :Prüfnr)    und    (Strasse like :Straße)   führen zu Fehlermeldung
 


'Prüfnr' ist der Primärschlüssel.

Gibt es einen Weg, in der Zeile

Code: Alles auswählen

 
  SQLQuery1.SQL.Text:='SELECT * FROM Pruefung where (Pruefnr like :Pruefnr) and (Bauvor like :Bauvorhaben)and (Bauort like :Bauort) and (Strasse like :Strasse)';
 


auch auf die Spalten zuzugreifen, die Umlaute im Spaltennamen enthalten? Vielleicht über Spaltennummern statt Spaltennamen?

Vielen Dank im Voraus.....

wp_xyz
Beiträge: 4864
Registriert: Fr 8. Apr 2011, 09:01

Re: Datenbankzugriff (*.mdb) und Umlaute

Beitrag von wp_xyz »

Ungetestet: Ich denke, .mdb hat noch Ansi-codierte Strings. Das heißt, du musst die problematischen feldnamen per UTF8ToCP1252 (in Unit LConvEncoding) von UTF8 in die Codepage 1252 umwandeln. Und Access wollte immer die kritischen Feld- und Tabellennamen in eckigen Klammern. Die Query-Parameter ":PruefNr" etc werden in SQLQuery1 bearbeitet, nicht von den Access-DLLs, ich würde sie so lassen. Also:

Code: Alles auswählen

SQLQuery1.SQL.Text:=UTF8ToCP1252('SELECT * FROM [Prüfung] where ([PrüfNr] like :Pruefnr) and (Bauvor like :Bauvorhaben)and (Bauort like :Bauort) and ([Straße] like :Strasse)');

Flenser
Beiträge: 24
Registriert: Di 28. Okt 2014, 12:49

Re: Datenbankzugriff (*.mdb) und Umlaute

Beitrag von Flenser »

Vielen Dank! das hat mich schon viel weiter gebracht. Prinzipiell kann man so auf Feldnamen mit Umlauten zugreifen.

Code: Alles auswählen

 
...
SQLQuery1.SQL.Text:=UTF8ToCP1252('SELECT * FROM Prüfung');
...
 
if SQLQuery1.Locate(UTF8ToCP1252('Prüfnr'),Pruefnummer_Edit.Text+'/'+Pruefjahr_Edit.text,[loCaseInsensitive]) then begin ...end;

Der Code funktioniert...


Leider bekomme ich das an der ürsprünglichen Stelle nicht hin:

Hier will ich einfach nur in einem DBGrid die angezeigten Einträge in Abhängigkeit von den Angaben in den Edit-Feldern filtern.
So wie es unten steht, funktioniert es, wie es gedacht war.

Code: Alles auswählen

 
  SQLQuery1.SQL.Text:=UTF8ToCP1252('SELECT * FROM Prüfung where (Pruefnr like :Pruefnr) and (Bauvor like :Bauvorhaben) and (Bauort like :Bauort) and (Name like :Name) and (Sachbearbeiter like :Sachbearbeiter) and (Auftraggeber like :Auftraggeber) and (Aktenzeichen like :Aktenzeichen)');
 
  SQLQuery1.params.ParamByName('Pruefnr').AsString:='%'+UTF8ToWinCP(edit1.text)+'%';
  SQLQuery1.params.ParamByName('Bauvorhaben').AsString:='%'+UTF8ToWinCP(edit2.text)+'%';
  SQLQuery1.params.ParamByName('Bauort').AsString:='%'+UTF8ToWinCP(edit3.text)+'%';
  SQLQuery1.params.ParamByName('Name').AsString:='%'+UTF8ToWinCP(edit4.text)+'%';
  SQLQuery1.params.ParamByName('Sachbearbeiter').AsString:='%'+UTF8ToWinCP(combobox1.text)+'%';
  SQLQuery1.params.ParamByName('Auftraggeber').AsString:='%'+UTF8ToWinCP(combobox2.text)+'%';
  SQLQuery1.params.ParamByName('Aktenzeichen').AsString:='%'+UTF8ToWinCP(edit5.text)+'%';
  Datasource1.dataset:=SQLQuery1;
 
  DatenbankDBGrid.DataSource:=DataSource1;
 
  ODBCConnection1.Open;
  If ODBCConnection1.Connected then SQLQuery1.open;   


Wenn ich jetzt den Code wie folgt ändere und in der Datenbank natürlich den Feldnamen auch in 'Prüfnr', gibt es eine Fehlermeldung:

Code: Alles auswählen

 
  SQLQuery1.SQL.Text:=UTF8ToCP1252('SELECT * FROM Prüfung where ([Prüfnr] like :Pruefnr) and (Bauvor like :Bauvorhaben)and (Bauort like :Bauort) and (Name like :Name) and (Sachbearbeiter like :Sachbearbeiter) and (Auftraggeber like :Auftraggeber) and (Aktenzeichen like :Aktenzeichen)');
 

Projekt Prüfung 2018 hat Exception-KIasse »EODBCException« ausgelöst mit der Meldung:
Could not execute statement. ODBC error details: LastReturnCode: SQL_ERROR; Record 1: SqlState: 07002; NativeError: -3010; Message: Microsoft Access Driver] 8 Parameter wurden erwartet, aber es wurden zu wenig Parameter übergeben.;


Es macht keinen Unterschied, ob die eckigen Klammern um Prüfnr stehen oder nicht. Die Fehlermeldung kommt trotzdem...

Hat jemand ne Idee?

wp_xyz
Beiträge: 4864
Registriert: Fr 8. Apr 2011, 09:01

Re: Datenbankzugriff (*.mdb) und Umlaute

Beitrag von wp_xyz »

Flenser hat geschrieben:Es macht keinen Unterschied, ob die eckigen Klammern um Prüfnr stehen oder nicht. Die Fehlermeldung kommt trotzdem...

Im beigefügten Projekt habe ich das Thema mal durchgespielt: Mit dem Button "Create DB" wird eine mdb-Datei erstellt und mit ein paar Dummy-Daten gefüllt, wobei in den Feld- und Tabellennamen, sowie in den Daten Umlaute vorkommen (nur beim 1. Aufruf nötig). "Open" öffnet die DB und zeigt alle Records im Grid an. "Filter" filtert alle Records heraus, die den Text im Edit enthalten. Es funktioniert.

Zu beachten ist:
  • Sobald irgendwo in den Feldnamen Umlaute vorkommen, muss die entsprechende Konvertierungsfunktion von/nach UTF8 verwendet werden. Ausgangspunkt ist bei uns die CodePage CP1252 oder allgemeiner WinCP, also: CP1252ToUTF8 bzw. UTF8ToCP1252, oder WinCPToUTF8 bzw. UTF8ToWinCP
  • Wenn der Name des Parameters vom Feldnamen abweicht (wie bei "PrüfNr LIKE : PruefNr"), muss der Parameter extra erzeugt werden (SQLQuery.Params.Add und Properties ausfüllen).
  • Die eckigen Klammern sind hier nicht erforderlich. Wahrscheinlich nur, wenn der Feldname Spaces enthält oder SQL-Schlüsselwörter.
Dateianhänge
Access_Query_Umlaute.zip
(3.71 KiB) 127-mal heruntergeladen

Flenser
Beiträge: 24
Registriert: Di 28. Okt 2014, 12:49

Re: Datenbankzugriff (*.mdb) und Umlaute

Beitrag von Flenser »

Danke, werde ich ausprobieren. Dazu komme ich aber erst im Laufe der nächsten Woche wieder. Melde mich dann nochmal...

Flenser
Beiträge: 24
Registriert: Di 28. Okt 2014, 12:49

Re: Datenbankzugriff (*.mdb) und Umlaute

Beitrag von Flenser »

Irgendwo ist der Wurm drin.

Ich habe ja die Datenbank, mit der gearbeitet wird und die Datenbank, die ich bei der Programmierung verwende. Beide enthalten eine Tabelle "Prüfung" und sollten identisch sein.

Auf die Programmierdatenbank kann ich jetzt problemlos mit Umlauten zugreifen, auf die Arbeitsdatenbank nicht...

Code: Alles auswählen

 
  ODBCConnection1.DatabaseName:='Pruefung_ide';         //Programierdatenbank
  //ODBCConnection1.DatabaseName:='Organisation3';    //Arbeitsdatenbank
 


Ich wechsel nur die Kommentarzeichen, sonst ändere ich nix am Code. Schätze mal, da ist doch irgendwo ein Unterschied in der Datenbank.

Das Lazarusproblem ist aber gelöst. Danke für die Hilfe

Antworten