Entwickler-Ecke

Datenbanken - Fehler bei Zuweisung eines String-Wertes mit Delphi2009


giantdwarf - Mo 06.07.09 13:51
Titel: Fehler bei Zuweisung eines String-Wertes mit Delphi2009
Hallo zusammen!

Ich bin gerade dabei eine Delhpi 2006 Anwendung auf Delphi 2009 zu portieren. Hat soweit auch funktioniert. Aber bei folgender Anweisung:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
var
   oQry: TAdoQuery;
   sVal: String;
...
oQry.FieldByName(sColumn).AsString := sVal;
...


erhalte ich folgenden Fehler:
"Fehler bei einem aus mehreren Schritten bestehenden Vorgang. Prüfen Sie die einzelnen Statuswerte".
sVal hat z.B. als Wert:

'- Paket Professional'#$A'- Kabel Phone Basic 24'#$A'- Usage Tarif Basic 24'#$A'- Option Flat Telefon'#$A'- Discount Tarif'#$A'- 03419756550: Port=1; 0900-Sperre=Y; Rufnummernanzeige=N; Anrufsperre=N; Sperre Auslandsverb.=N'

Bei kürzeren Strings funktioniert es.
Ich vermute, dass es mit der neuen Strings in Delhpi 2009 zusammenhängt. Aber ich habe noch keine Lösung gefunden.

Vielen Dank für die Hilfe!


jaenicke - Mo 06.07.09 13:59

Ich kenne mich mit Ado nicht aus, aber kann es sein, dass die (halben) Zeilenumbrüche das Problem sind? :gruebel:


jasocul - Mo 06.07.09 14:02

Ich habe kein Delphi 2009. Aber da dort die Arbeit Unicode-Strings stark umgestellt wurde, tippe ich darauf, dass der Fehler dort liegt.
The default String type is equivalent to UnicodeString [http://www.drbob42.com/examines/examinA7.htm]


giantdwarf - Di 07.07.09 09:49

Die Zeilenumbrüche sind nicht das Problem. Die habe ich bei einem Test entfernt und der Fehler kam trotzdem.
Ich habe das ganze auch schon mit Widestrings versucht, aber das hat auch nicht funktioniert.
Ich vermute auch, das es mit der Unicode-Umstellung zusammenhängt. Die Frage ist halt, was erwartet die TADOQuery-Komponente für eine String?


tif - Di 07.07.09 11:40

Hallo,

was hängt denn für eine Datenbank 'dran und wie sind die Felder definiert (Varchar vs. nVarchar) ?
Werden vorher (D2007) gespeicherte Daten noch richtig angezeigt ?

In meinen (nativen) SQL - Server - Komponenten übermitteln z.B. die (Standard-) WideStrings auch 1:1 an die Datenbank.

In char() - Feldern wird damit der doppelte Speicherplatz benötigt. Die Bemerkung, das "kürzere Strings fehlerfrei funktionieren" deutet darauf hin.

Wie sehen solche gespeicherten Strings in anderen Anwendungen (Query Analyzer o.ä.) aus ? Wird da alles korrekt dargestellt?

Grüße
Tino


jasocul - Di 07.07.09 11:45

Ich gehe davon aus, dass du das alte String-Format verwenden musst.


Muck - Di 07.07.09 15:16

Hallo zusammen,

ich benutze Delphi 2009 zusammen mit ADO Komponenten und MSSQL2005 MSSQL2008 und MYSQL.
Habe etwa 8 grosse Projecte in dieser Konstellation erstellt.
Ich habe nie das Problem mit String Zuweisungen gehabt.

Ich tippe auf die Felddefinitionen oder die gesetzte Server Collation falls MS SQL im Einsatz.
Bei mir laeuft alles problemlos mit SQL_Latin1_General_CP1_CI_AS in den Server Optionen.

Ich kann TEXT Felder, VARCHAR(8000) NVARCHAR etc alles direct zuweisen.

cu

Markus


Muck - Di 07.07.09 15:20

Hallo,

es koennte helfen die einzelnen Fehlernachrichten auszulesen.
siehe Code:

Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
with ADOConnection1 do
for i:= 0 to Errors.Count - 1 do
begin
s := Format('Source: %s', [Errors[i].Source]);
MemoLog.Lines.Add(s);
s := Format('NativeError: %d', [Errors[i].NativeError]);
MemoLog.Lines.Add(s);
s := Format('%s; (SQLState: %s)',
[Errors[i].Description, Errors[i].SQLState]);
MemoLog.Lines.Add(s);
MemoLog.Lines.Add(' --- ');
end;


Markus


MSCH - Di 07.07.09 19:27

Vielleicht hilfts;
ich hatte das Problem - allerdings mit den ODAC Kompos - mal; xxx.asString erwartet einen Ansi-String(?) und man kippt einen Unicode-String rein.
Zweite Möglichkeit, wurde ja schon angesprochen; das Feld auf der Datenbank ist kein nvarchar,ntext, nclob oder äquivalent.

Nehme stattdessen Query.FieldByName('Name').Value := stringvariable oder ähliches.

Das hat dann funktioniert.

:_msch


giantdwarf - Mi 08.07.09 11:52

Auf das einfachste kommt man zuletzt! :? Die Länge des Datenbankfeldes war auf 30 beschränkt, daher funktionierte es auch mit kürzeren strings.

Danke für Eure Tipps und Hilfe!