Ist der Fehler, der Unicode in Delphi7 speichert?
Bei Verwendung von DelPhi7 zum Durchführen von Unicode -Programmen entdeckte ich kürzlich ein solches Problem, dh bei der Verwendung von TadoCommand -Komponenten zur Ausführung von SQL -Anweisungen, wenn Unicode -Zeichen in der SQL -Anweisung vorhanden sind Richtig für die Verwendung von ttntAdoquery (die Verwendung von Parametern ist nicht, dass es verstümmelte Code gibt, und hier werden wir nur die reine SQL -Methode diskutieren). Tadocommand selbst unterstützt jedoch Widestring, und die CommandText -Eigenschaft ist ebenfalls von Widestring -Typ. Warum tritt dieses Problem auf? Ich habe versucht, mehrere Attributwerte von Tadocommand zu ändern, und fand ein seltsames Phänomen. Warum passiert das? Diese Eigenschaft scheint nichts mit Unicode selbst zu tun zu haben. Durch das Studium der Datei adodb.pas, in der sich TadoCommand befindet, fand ich das Problem.
Prozedur TadoCommand.SignCommandText (const value: widestring; lading: boolean);
Verfahren initparameter;
var
I: Ganzzahl;
Liste: tParameters;
Nativecommand: String;
Beginnen
Liste: = tParameters.create (self, tParameter);
versuchen
Nativecommand: = list.parseSql (Wert, true);
{Vorhandene Werte erhalten}
List.SignValues (Parameter);
CommandObject.CommandText: = nativecommand;
wenn nicht laden und (zugewiesen (Verbindung) oder (ConnectionString <> '')) dann
Beginnen
versuchen
SetConnectionFlag (cfParameters, true);
versuchen
{Abrufen Sie zusätzliche Parameterinformationen vom Server ab, falls unterstützt}
Parameter.InternalRefresh;
{Verwenden Sie zusätzliche Parameterinformationen vom Server, um unsere Liste zu initialisieren}
Wenn parameter.count = list.count dann dann
für i: = 0 aufliste.count - 1 do
Beginnen
Liste [i] .Datatype: = Parameter [i] .Datatype;
Liste [i] .Size: = Parameter [i] .Size;
Liste [i] .NumericsCale: = Parameter [i] .NumericsCale;
Liste [i] .Precision: = Parameter [i] .Precision;
Liste [i] .Direktion: = Parameter [i] .Direktion;
Liste [i] .Attributes: = Parameter [i] .attributes;
Ende
Endlich
SetConnectionFlag (cfParameters, false);
Ende;
außer
{Ignorieren Sie Fehler, wenn der Server keine Parameterinformationen angeben kann}
Ende;
wenn list.count> 0 dann
Parameter.Sign (Liste);
Ende;
Endlich
List.free;
Ende;
Ende;
Beginnen
if (commandType = cmdText) und (Wert <> '') und ParamCheck dann
Initparameter
anders
Beginnen
CommandObject.CommandText: = Wert;
Wenn nicht laden, dann Parameter.Clear;
Ende;
Ende;
Schauen Sie sich diese Aussage an:
if (commandType = cmdText) und (Wert <> '') und ParamCheck dann
Initparameter
Das heißt, wenn ParamCheck wahr ist, wird der Initparameters -Prozess ausgeführt.
Zunächst definiert es eine Variable: Nativecommand: String;
Nativecommand: = list.parseSql (Wert, true);
{Vorhandene Werte erhalten}
List.SignValues (Parameter);
CommandObject.CommandText: = nativecommand;
Hier ist der Wert von Widestring -Typ und List.ParSeSQL gibt den String -Typ zurück, und Nativecommand ist ebenfalls eine Zeichenfolge. Dies bewirkt, dass commandObject.commandtext nicht den wachsendsten Wert erhalten, der ihm zugeordnet werden sollte, was letztendlich zum Auftreten von verstümmelter Code beim Speichern von Unicode führt.
Die Lösung ist auch sehr einfach (wenn Sie nicht bereit sind, das Delphi -Quellprogramm zu ändern) müssen Sie nur den ParamCheck auf false festlegen (Delphi -Standardeinstellungen für ParamCheck auf True).