我能想到的一个笨方法是,一旦碰到Text类型列,query里写成 select id, cast(name as NTEXT) as name from t_clob; select里强制转一下,就正常了。
----------------------------------------------
-
别人可以做是因为他根据字段类型知道CodePage是GBK也就是936了. 转Unicode的时候可以直接用这个转. 所以根源上还是要setCodePage. 你现在首要的是怎么获取文本字段CodePage也就是name text COLLATE Chinese_PRC_CI_AS NULL设置的CodePage是多少. 可以看下SQL语法COLLATIONPROPERTY,可以查询一个字段的内置CodePage是什么. 然后SetCodePage,如果不愿意COLLATIONPROPERTY,因为你知道是GBK也可以直接SetCodePage(936)
给你段的数据库引擎的部分代码,获取MSSQLserver的CodePage部分 function DetermineMSServerCodePage(const Collation: String): Word; var Tmp: RawByteString; begin Result := High(Word); Tmp := 'SELECT COLLATIONPROPERTY('+ {$IFDEF WITH_UNITANSISTRINGS}AnsiStrings.{$ENDIF}AnsiQuotedStr( {$IFDEF UNICODE}UnicodeStringToASCII7{$ENDIF}(Collation), #39)+ ', ''Codepage'') as Codepage'; if (GetPlainDriver.dbcmd(FHandle, Pointer(Tmp)) <> DBSUCCEED) or (GetPlainDriver.dbsqlexec(FHandle) <> DBSUCCEED) or (GetPlainDriver.dbresults(FHandle) <> DBSUCCEED) or (GetPlainDriver.dbcmdrow(FHandle) <> DBSUCCEED) or (GetPlainDriver.dbnextrow(FHandle) <> REG_ROW) then CheckDBLibError(lcOther, Tmp) else begin ZSetString(PAnsiChar(GetPlainDriver.dbdata(FHandle, 1)), GetPlainDriver.dbDatLen(FHandle, 1), Tmp); Result := RawToInt(Tmp); end; GetPlainDriver.dbCancel(FHandle); end;
----------------------------------------------
武稀松http://www.raysoftware.cn