Delphi 如何使用TADOCommand参数化查询参数化宽字符串?

Delphi 如何使用TADOCommand参数化查询参数化宽字符串?,delphi,ado,delphi-5,parameterized-query,Delphi,Ado,Delphi 5,Parameterized Query,我正在尝试使用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

我正在尝试使用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


i可以使用本机参数化ADO
命令
对象。它正确地保存数据:

C.:\nȖḙr͇s̶i̜ẵn̥V̹AͧT̶OὉP̩I̶A͜P̥P̔D͑ẫt̒āL̫o͋LͭAͭv̼ẵt͈ấr̄S̫o̖f͎t̻w̵ạr͂ẽ C̾r̮ḛẵt͘iͩo̳n̬s̨s̪f̒t͘w̚rɇQͬẳlͮiͯtͯyͯMͬtͯrͯiͯCͯMͯSͯqͯM↡00.xͬMͯlͯ

但这是一个错误

在Delphi中如何将unicode/WideString与
TADOCommand
一起使用

奖金聊天

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

exec sp_executesql N'插入到Sqm(文件名)值(@P1'),N'@P1字符(300),@P2文本,'C:\Us?er?s?\iäN?.A?V?A?T?O?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进入参数孔之前,我看到的最后一个WideString是:

ParameterObject.Value := NewValue;
在哪里

  • NewValue
    是类型
    VT\u BSTR
    (又称
    varOleStr
    )的变体,具有正确的值
  • ParameterObject
    是本机ADO
    \u参数
    对象,具有

即使尝试强制参数类型:

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

注意:这个问题是关于如何将
插入foo(value)值(%s)的参数化系列的一部分。

使用如何

cmd.Parameters.ParamByName('filename').Value := WideStringToUCS4String(s);
顺便问一下,s被声明为widestring。有必要将s作为widestring吗?直接

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字符串吗?

答案是无法在Delphi(5)中完成

它可能在较新版本的Delphi中得到修复;但是如果没有人测试它,我们将无法知道

Q.:如何使用TADOCommand参数化查询参数化宽字符串?

A.:您不能。很抱歉出现这种情况。

string
AnsiString
的别名,它不能保存unicode数据。我的Delphi版本中也没有函数。当将
UCS4String
存储到变量中时,Delphi会将其转换为什么
VarType
,而ADO则不支持riants无法容纳它们。嗨,伊恩,我正在使用Delphi7,我可以找到UCS-4字符串或UTF-32(Delphi中的UCS4String)以及System.pas中的函数WideStringToUCS4String和UCS4StringToWidestring。@RRUZ从原始问题中删除了无关的
recordsAffected
参数。我想您没有尝试UTF-8,是吗?如Delphi5,请继续使用支持unicode的IDE/Compiler@whosrdaddy我有20000美元可以借