Autor Beitrag
anfaenger
Hält's aus hier
Beiträge: 1



BeitragVerfasst: Sa 12.02.11 01:24 
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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 648
Erhaltene Danke: 85

WIN 2000, WIN XP
D5 Prof
BeitragVerfasst: Sa 12.02.11 10: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:
ausblenden 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.

_________________
Toleranz ist eine Grundvoraussetzung für das Leben.


Zuletzt bearbeitet von Tranx am Sa 12.02.11 11:06, insgesamt 4-mal bearbeitet
Xion
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
EE-Maler
Beiträge: 1952
Erhaltene Danke: 128

Windows XP
Delphi (2005, SmartInspect), SQL, Lua, Java (Eclipse), C++ (Visual Studio 2010, Qt Creator), Python (Blender), Prolog (SWIProlog), Haskell (ghci)
BeitragVerfasst: Sa 12.02.11 11:01 
Also wenn deine ID "E02120012R->%Gh\" heißt, dann ist das wohl ein String.

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


Oder seh ich da jetzt was falsch?

_________________
a broken heart is like a broken window - it'll never heal
In einem gut regierten Land ist Armut eine Schande, in einem schlecht regierten Reichtum. (Konfuzius)
Tranx
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 648
Erhaltene Danke: 85

WIN 2000, WIN XP
D5 Prof
BeitragVerfasst: Sa 12.02.11 11:05 
Xion, Du hast Recht. Aber das Problem ist m.E., das "%" weil das in SQL als Platzhalter verwendet wird.

_________________
Toleranz ist eine Grundvoraussetzung für das Leben.
Xion
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
EE-Maler
Beiträge: 1952
Erhaltene Danke: 128

Windows XP
Delphi (2005, SmartInspect), SQL, Lua, Java (Eclipse), C++ (Visual Studio 2010, Qt Creator), Python (Blender), Prolog (SWIProlog), Haskell (ghci)
BeitragVerfasst: Sa 12.02.11 11: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?

_________________
a broken heart is like a broken window - it'll never heal
In einem gut regierten Land ist Armut eine Schande, in einem schlecht regierten Reichtum. (Konfuzius)
Tranx
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 648
Erhaltene Danke: 85

WIN 2000, WIN XP
D5 Prof
BeitragVerfasst: Sa 12.02.11 11: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.

_________________
Toleranz ist eine Grundvoraussetzung für das Leben.