Ошибка, которая хранит Unicode в Delphi7?
Недавно, когда я использовал Delphi7 для выполнения программ Unicode, я обнаружил такую проблему, то есть при использовании компонента TadoCommand для выполнения операторов SQL, если в базе данных появятся символы Unicode, появится искаженный код, и то же самое Верно для использования ttntadoquery (использование параметров не будет искаженного кода, и здесь мы обсудим только метод Pure SQL). Тем не менее, сама TadoCommand поддерживает ослабление, а свойство CommandText также имеет в виду тип. Я попытался изменить несколько значений атрибутов тадокоманды и нашел странное явление. Почему это происходит? Это свойство, кажется, не имеет ничего общего с самого Unicode. Изучая файл AdoDB.PAS, где находится TadoCommand, я нашел проблему.
Процедура tadoCommand.AssignCommandText (const value: wideString; загрузка: логическое);
процедура initParameters;
вар
Я: целое число;
Список: Tparameters;
NativeCommand: String;
Начинать
Список: = tparameters.create (self, tparameter);
пытаться
Nativecommand: = list.parsesql (значение, true);
{Сохранить существующие значения}
List.assignvalues (параметры);
CommandObject.comMandText: = nativeCommand;
Если не загружать и (назначено (соединение) или (ConnectionString <> ''))
Начинать
пытаться
SetConnectionFlag (cfparameters, true);
пытаться
{Получить дополнительную информацию о параметре с сервера, если поддерживается}
Параметры. Internalrefresh;
{Используйте дополнительную информацию о параметрах с сервера, чтобы инициализировать наш список}
Если параметры.count = list.count тогда
для i: = 0 к списку. Count - 1 do
Начинать
Список [i] .datatype: = параметры [i] .datatype;
Список [i] .size: = параметры [i] .size;
Список [i] .numericsCale: = параметры [i] .numericsCale;
Список [i] .precision: = параметры [i] .precision;
Список [i] .direction: = параметры [i] .direction;
Список [i] .atributes: = параметры [i] .attributes;
конец
Окончательно
SetConnectionFlag (cfparameters, false);
конец;
кроме
{Игнорировать ошибку, если сервер не может предоставить информацию о параметрах}
конец;
Если list.count> 0, тогда
Параметры. Assign (список);
конец;
Окончательно
List.free;
конец;
конец;
Начинать
if (commandType = cmdtext) и (value <> '') и paramCheck then
Initparameters
еще
Начинать
CommandObject.comMandText: = значение;
Если не загружать, то параметры.clear;
конец;
конец;
Взгляните на это утверждение:
if (commandType = cmdtext) и (value <> '') и paramCheck тогда
Initparameters
То есть, когда ParamCheck верен, процесс initParameters будет выполнен.
Во -первых, это определяет переменную: NativeCommand: String;
Nativecommand: = list.parsesql (значение, true);
{Сохранить существующие значения}
List.assignvalues (параметры);
CommandObject.comMandText: = nativeCommand;
Здесь значение имеет тип WealString, а List.parsesql возвращает тип строки, а NativeCommand также является типом строки. что заставляет CommandObject.commandext не получить наиболее широкое значение, которое должно быть назначено ему, что в конечном итоге приводит к возникновению искаженного кода при хранении Unicode.
Решение также очень простое (если вы не хотите изменять программу источника Delphi), вам просто нужно установить ParamCheck на false (Delphi Defaults по умолчанию в ParamCheck True).