Delphi7에 유니 코드를 저장하는 버그입니까?
최근에 delphi7을 사용하여 유니 코드 프로그램을 수행 할 때, 나는 그러한 문제를 발견했습니다. TTNTADOQUERY를 사용하는 경우가 사실입니다 (매개 변수의 사용은 차량 코드가 없으며 여기서는 순수한 SQL 방법에 대해서만 논의 할 것입니다). 그러나 Tadocommand 자체는 WideString을 지원하며 CommandText 속성은 왜이 문제가 발생합니까? 나는 Tadocommand의 몇 가지 속성 값을 변경하려고 시도했고, Paramcheck 속성이 False로 설정된 한 이상한 현상을 발견했으며, 유니 코드 문자는 정상적으로 저장 될 수 있으며, True로 설정되면 breadbled 코드가 나타납니다. 왜 이런 일이 발생합니까? 이 속성은 유니 코드 자체와 관련이없는 것 같습니다. TadoCommand가있는 ADODB.PAS 파일을 연구하면 문제가 발생했습니다.
절차 tadocommand.assigncommandText (const 값 : widestring; 로딩 : 부울);
절차 초기 파라미터;
var
I : 정수;
목록 : tparameters;
nativecommand : 문자열;
시작하다
목록 : = tparameters.create (self, tparameter);
노력하다
nativecommand : = list.parsesql (value, true);
{기존 값 보존}
List.AssignValues (매개 변수);
CommandObject.commandText : = nativeCommand;
로드하지 않고 (할당 된 (Connection) 또는 (ConnectionString <> '')
시작하다
노력하다
setConnectionFlag (cfparameters, true);
노력하다
{지원되는 경우 서버에서 추가 매개 변수 정보 검색}
매개 변수. Internalrefresh;
{서버에서 추가 매개 변수 정보를 사용하여 목록 초기화}
if parameters.count = list.count 그 다음에
i : = 0 to list.count -1 do
시작하다
목록 [i] .datatype : = 매개 변수 [i] .datatype;
List [i] .size : = 매개 변수 [i] .size;
List [i] .numericsCale : = 매개 변수 [i] .numericsCale;
목록 [i] .precision : = 매개 변수 [i] .precision;
목록 [i]. 방향 : = 매개 변수 [i]. 방향;
목록 [i] .attributes : = 매개 변수 [i] .attributes;
끝
마지막으로
setConnectionFlag (cfparameters, false);
끝;
제외하고
{서버가 매개 변수 정보를 제공 할 수없는 경우 오류를 무시합니다}
끝;
list.count> 0 인 경우
Parameters.Assign (목록);
끝;
마지막으로
list.free;
끝;
끝;
시작하다
if (commandType = cmdText) 및 (value <> '') 및 paramcheck
initparameters
또 다른
시작하다
CommandObject.commandText : = value;
로드하지 않으면 매개 변수.
끝;
끝;
이 진술을 살펴보십시오.
if (commandType = cmdText) 및 (value <> '') 및 ParamCheck
initparameters
즉, ParamCheck이 사실 일 때 InitParameters 프로세스가 실행됩니다.
먼저 변수를 정의합니다.
nativecommand : = list.parsesql (value, true);
{기존 값 보존}
List.AssignValues (매개 변수);
CommandObject.commandText : = nativeCommand;
여기에서는 값이 넓은 유형이며 list.parsesql은 문자열 유형을 반환하고 NativeCommand도 문자열 유형으로 문자열 유형 변수에 배치 된 다음 NativeCommand가 지정됩니다. CommandObject.commandText가 할당 해야하는 광범위한 값을 얻지 못하도록합니다. 이는 궁극적으로 유니 코드를 저장할 때 garrleding 코드의 발생으로 이어집니다.
솔루션은 또한 매우 간단합니다 (Delphi 소스 프로그램을 수정하지 않으려면) Paramcheck을 False로 설정하면됩니다 (Delphi 기본값은 Paramcheck to True).