Entwickler-Ecke

Datenbanken - Backslash am Stringende maskiert das Hochkomma


anfaenger - Sa 12.02.11 02:24
Titel: Backslash am Stringende maskiert das Hochkomma
Hallo zusammen!
Ich hab ein kleines Problem!

Mein Programm verarbeitet automatisch erzeugte ID-s eines anderen Systems, die bedauerlicherweise oft mit einem Backslash enden z.B. E02120012R->%Gh\

Wenn solche IDs als Parameter übergeben werden, dann streikt Delphi.
Es geht um die folgenden Anweisungen:

accountID:= dsAccount.FieldByName('ACCOUNTID').AsString;
...
sqlUpdate:= sqlUpdate + ' where ACCOUNTID = :ACCOUNTID';

Kann es sein, dass Backslash in solchen Fällen, das Hochkomma maskiert?
Und wenn, wie kann ich Backslash maskieren, d.h. was mache ich mit meiner AccountID (E02120012R->%Gh\)?

Danke in Voraus
Anfaenger


Tranx - Sa 12.02.11 11:51

Eine Frage: Tritt dies Problem wirklich nur bei den IDs mit Backslash am Ende auf oder immer?. Diese Art von IDs sind wirklich sehr gewöhnungsbedürftig, von wegen der diversen Sonderzeichen "-", ">", "%" Gerade das "%" wird ja z.B. in SQL als Platzhalter für beliebige viele (auch null) verschiedene Zeichen benutzt. Wenn es z.B. das "%" ist, und das denke ich, dann hast Du sowieso ein Problem.

Es wäre nämlich folgendes dann ebenfalls selektiert:

ID selektiert
E02120012R->%Gh\ ja
E02120012R->Gh\ ja
E02120012R->asdfsdfGh\ ja
...



/Edit: Vielleicht - ich weiß ja nicht, inwieweit Du da Möglichkeiten hast, könntest Du die Datentabelle um ein Zählerfeld erweitern und eine zweite Tabelle anlegen, in der Du die AutoIDs mit Zählern verknüpfst:

dsAccount

Feld ACCOUNTID mit ID erweitern

dsIDTable

Felkd ACCOUNTID, ID

dann steht in dsIDTable:

ACCOUNTID ID
E02120012R->%Gh\ 1
E02120012R->%Gr\ 2
E02120012R->%Zh\ 3
E02120542R->%Gh\ 4
...

und in dsAccount: (aus der Tabelle dsIDTabelle geholt)

ACCOUNTID ID Feldx Feldy Feldz
E02120012R->%Gh\ 1 ...
E02120012R->%Gr\ 2 ...
E02120012R->%Zh\ 3 ...
E02120542R->%Gh\ 4 ...
...

Du musst dann 1. die Tabelle dsIDTabelle mit den AccountIDs füllen und entsprechend IDs generieren, oder diese als Autowert von der Anwendung generieren lassen
und dann in einem 2. Schritt die IDs in die Tabelle AccountID überführen. Dann ist Dein UpdateSQL einfacher und sicherer:

Delphi-Quelltext
1:
2:
3:
ID:= dsAccount.FieldByName('ID').AsInteger;
... 
sqlUpdate:= sqlUpdate + ' where ID = :ID';

Aber - wie gesagt, das hängt davon ab, ob Du die Tabelle dsAccount erweitern kannst, oder nicht.


Xion - Sa 12.02.11 12:01

Also wenn deine ID "E02120012R->%Gh\" heißt, dann ist das wohl ein String.


Delphi-Quelltext
1:
sqlUpdate:= sqlUpdate + ' where ACCOUNTID = "'+ACCOUNTID+'"';                    


Oder seh ich da jetzt was falsch?


Tranx - Sa 12.02.11 12:05

Xion, Du hast Recht. Aber das Problem ist m.E., das "%" weil das in SQL als Platzhalter verwendet wird.


Xion - Sa 12.02.11 12:11

Nicht wenn du "=" schreibst. Um Platzhalter zu "aktivieren" musst du LIKE schreiben. So kenne ich das zumindest.

Edit:
user profile iconanfaenger hat folgendes geschrieben Zum zitierten Posting springen:
Wenn solche IDs als Parameter übergeben werden, dann streikt Delphi.

Inweifern streikt dein Delphi? Absturz? Syntax-Fehler?


Tranx - Sa 12.02.11 12:30

Entschuldige, mein Fehler. Du hast Recht. Ich habe es geprüft. Das funktioniert mit den Einschluss des Strings in " und %. Aber vielleicht ist es doch sinnvoller, derartige Autoids in Zahlen zu konvertieren (in neu definierten Feldern), zumal ja der Vergleich von Zahlen eindeutig ist und nicht abhängig davon, ob ich das "G" groß oder klein schreibe oder was da sonst an Sonderzeichen (unter anderem das ") auftreten kann.