¿Es el error que almacena unicode en Delphi7?
Recientemente, cuando utilicé Delphi7 para hacer programas unicode, descubrí tal problema, es decir, cuando se usa el componente TadoCommand para ejecutar declaraciones SQL, si hay caracteres Unicode en la declaración SQL, el código confuso aparecerá en la base de datos, y lo mismo es el mismo Verdadero para usar TtnTadoQuery (el uso de parámetros no es que habrá código confuso, y aquí solo discutiremos el método SQL puro). Sin embargo, el propio TadoCommand admite Widestring, y la propiedad CommandText también es de tipo Widestring. Traté de cambiar varios valores de atributos de TadoCommand y encontré un fenómeno extraño. ¿Por qué sucede esto? Esta propiedad parece tener nada que ver con Unicode en sí. Al estudiar el archivo ADODB.pas donde se encuentra TadoCommand, encontré el problema.
Procedimiento tadoCommand.AssignCommandText (valor constante: widestring; carga: boolean);
Procedimiento Initparámetros;
varilla
I: entero;
Lista: tparameters;
Nativecommand: cadena;
Comenzar
Lista: = tParameters.create (self, tparameter);
intentar
Nativecommand: = list.parsesql (valor, true);
{Preserve los valores existentes}
List.AssignValues (parámetros);
CommandObject.commandText: = nateVecommand;
Si no se carga y (asignado (conexión) o (ConnectionString <> '')) entonces
Comenzar
intentar
SetConnectionFlag (cfParameters, true);
intentar
{Recuperar información de parámetros adicionales del servidor si se admite}
Parámetros.internalrefresh;
{Use información de parámetros adicionales del servidor para inicializar nuestra lista}
if parameters.count = list.count entonces
para i: = 0 to list.count - 1 do
Comenzar
List [i] .datatype: = parámetros [i] .datatype;
List [i] .size: = parámetros [i] .size;
List [i] .numericscale: = parámetros [i] .numericscale;
List [i] .precision: = parámetros [i] .precision;
List [i] .Direction: = parámetros [i] .direction;
List [i] .Attributes: = parámetros [i] .Attributes;
fin
Finalmente
SetConnectionFlag (cfParameters, falso);
fin;
excepto
{Ignorar error si el servidor no puede proporcionar información de parámetros}
fin;
if list.count> 0 entonces
Parámetros.assign (lista);
fin;
Finalmente
List.Free;
fin;
fin;
Comenzar
if (comandype = cmdText) y (valor <> '') y paramcheck entonces
Initcharameters
demás
Comenzar
CommandObject.CommandText: = Value;
Si no se carga, entonces parámetros.clear;
fin;
fin;
Eche un vistazo a esta declaración:
if (comandype = cmdText) y (valor <> '') y paramcheck entonces
Initcharameters
Es decir, cuando ParamCheck es verdadero, el proceso de InitParameters se ejecutará.
Primero, define una variable: Nativecommand: String;
Nativecommand: = list.parsesql (valor, true);
{Preserve los valores existentes}
List.AssignValues (parámetros);
CommandObject.commandText: = nateVecommand;
Aquí, el valor es de tipo Widestring, y list.Parsesql Devuelve el tipo de cadena, y Nativecommand también es tipo de cadena. lo que hace que CommandObject.CommandText no obtenga el valor más amplio que se le debe asignar, lo que finalmente conduce a la ocurrencia de código confuso al almacenar unicode.
La solución también es muy simple (si no está dispuesto a modificar el programa de origen de Delphi) solo necesita establecer ParamCheck en False (Delphi predeterminado es paramCheck a verdadero).