【发布时间】:2012-05-24 15:35:04
【问题描述】:
我正在尝试使用 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
我可以使用本机参数化 ADO Command 对象。它正确保存了数据:
c̬:\ ȗŝḙȗŝḙ͇͇ͧt̶o̠p̩̩̥̔͑ẫ͑ẫ̠̥̒̒͋ɕă͈ấ̄ę̨̨̨̨̨̨̖̖̖̻̻̳̬̬̖͎̻̳̬̬̖̬̻̻̻̻̻̻̻̻̃ͬͮ̽̽ͬ̽ͥ̽̽̽̽̽̽̽̽̽̽̽̽̽̽̽̽ͥ̽̽ͥͥͥ̽̽ͥͥ̽ͥͥͥͥͥͥ̚̚̚̚̕̚̚̚̕̚̕͜͜͜͜͜͜͜͜͜͜͜00.xͤm̧l̝l
但它是very fragile and not suitable for production use。
如何在 Delphi 中将 unicode/WideStrings 与 TADOCommand 一起使用?
奖金聊天
在 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?cal¯\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(又名varOleStr)类型的变体,具有适当的值 -
ParameterObject是本机 ADO_Parameter对象,带有.Typeof 129 (adChar)
甚至试图强制参数类型:
cmd.Parameters.ParamByName('filename').DataType := ftWideString;
cmd.Parameters.ParamByName('filename').Value := s;
没用。
注意:这个问题是关于如何参数化
INSERT INTO foo (value) VALUES (%s)的系列的一部分
- https://stackoverflow.com/questions/10726212/using-wrong-type-with-parameterized-query-causes-error
- How big is an nvarchar(max) as far as ADO is concerned?
- How to parameterize widestrings using TADOCommand parameterized query?
- "Must declare the variable @myvariable" error with ADO parameterized query
【问题讨论】:
-
@RRUZ 从原始问题中删除了无关的
recordsAffected参数 -
我不认为你尝试过 UTF-8,是吗?
-
Uch Delphi5,请继续使用支持 unicode 的 IDE/编译器
-
@whosrdaddy 我可以借到 20,000 美元
标签: delphi ado delphi-5 parameterized-query