0

我正在尝试将参数化查询与 Delphi TADOCommand 一起使用:

var 
   s: WideString;
   cmd: TADOCommand;  
   recordsAffected: OleVariant;
begin
   cmd := TADOCommand.Create(nil);
   cmd.Connection := Connection;
   cmd.CommandText := 'INSERT INTO Sqm(Filename) VALUES(:filename)';

   s := AFilename;
   cmd.Parameters.ParamByName('filename').Value := s;
   cmd.Execute();

数据库中的结果数据完全被破坏:

C?:\U?s?er?s?\i??n?.A?V`A?T?O?P?I?A?\A?p?p?D??t??\L ?o???l?\A?v?at??r? S?o?f?t?w?är¨? C?r??t?i??n?s?\S?o°f?t?w?r?? Q?u??li?t?y? M??t?r?i?cs?\C??S?-s?q?m?00.x?m?l


可以使用本机参数化 ADOCommand对象。它正确保存数据:

c̬:\ȗŝḙr͇s̶\i̜ẵn̥.àv̹aͧp̩i̿ȁp̩i̿ȁ\a͜p̥p̔d͑ẫ

但它非常脆弱,不适合生产使用

我如何TADOCommand在 Delphi 中使用 unicode/WideStrings?

奖金喋喋不休

在 SQL Server Profiler 中,您可以看到正在执行的 SQL:

exec sp_executesql N'INSERT INTO Sqm(Filename) VALUES(@P1)', N'@P1 char(300),@P2 text', 'C?:\Us?er?s?\i?än?.A? V?A?T?O?P?I?À\A?p?p?D?ât?a\L?o?çal¯\A?v?at??r? 所以?f?t?w?ar?? C?r??á?i?o?n?s?\So¸f"t?w?ar?? Q?u??l?i?ty? M??t?r?i¸?s` \C?M°S?-s?q?m?00.?m¨´l¯'

这指出了问题 - 它将WideString参数构建为一个char(300)值。让它不坏。

在它进入参数孔之前,我最后看到的 WideString 是:

ParameterObject.Value := NewValue;

在哪里

  • NewValue是类型VT_BSTR(aka varOleStr) 的变体,具有适当的值
  • ParameterObject是本机 ADO_Parameter对象,具有.Type129 ( adChar)

甚至试图强制参数类型:

cmd.Parameters.ParamByName('filename').DataType := ftWideString;
cmd.Parameters.ParamByName('filename').Value := s;

没有帮助。

注意:这个问题是关于如何参数化的系列的一部分INSERT INTO foo (value) VALUES (%s)

4

2 回答 2

0

怎么用

cmd.Parameters.ParamByName('filename').Value := WideStringToUCS4String(s);

顺便说一句,s 被声明为宽字符串。是否有必要将 s 作为宽字符串?刚刚怎么样

var
  s : String; 

在 System.pas 中,UCS4String(UCS-4 字节或 UTF-32 位)声明为:

...
...
UCS4Char = type LongWord;
...
UCS4String = array of UCS4Char;
...
function WideStringToUCS4String(const S: WideString): UCS4String;
...
function UCS4StringToWidestring(const S: UCS4String): WideString;

您将文件名列存储为什么数据类型?sql server 2000 可以处理 UTF-32 字符串吗?

于 2012-05-24T16:15:23.617 回答
0

答案是它不能在 Delphi (5) 中完成。

它可能会在较新版本的 Delphi 中修复;但是没有人来测试它,我们不会知道。

:如何使用 TADOCommand 参数化查询参数化宽字符串?
:你不能。很抱歉给您带来不便。

于 2012-06-01T20:36:51.790 回答