Delphi 如何使用TADOCommand参数化查询参数化宽字符串?
我正在尝试使用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
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
是本机ADOParameterObject
对象,具有\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美元可以借