如何使用TADOCommand参数化查询参数化宽字符串? [英] How to parameterize widestrings using TADOCommand parameterized query?

查看:104
本文介绍了如何使用TADOCommand参数化查询参数化宽字符串?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我试图在Delphi TADOCommand中使用参数化查询:

i am trying to use a parameterized query with 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();

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

The resulting data in the database is complete mangled:


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

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 Command 对象。它可以正确保存数据:


i can use a native parameterized ADO Command object. It saves the data correctly:


C̬:\Ȗŝḙ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͂ẽ \S̪ōf̒t͘w̚âr̿ɇQͬüẳlͮi̫tͥy̽M͘ȇt̨r̟i̻çš\C͍MͥS̚-s̞q̕m͜00.xͤm̧l̝

C̬:\Ȗŝḙ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̚-s̞q̕m͜00.xͤm̧l̝

但这是非常脆弱,不适合用于生产用途

我在Delphi中将unicode / WideStrings与 TADOCommand 一起使用?

How can i use unicode/WideStrings with TADOCommand in Delphi?

奖励聊天

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

In SQL Server Profiler you can see the SQL being executed:


exec sp_executesql N'插入Sqm(文件名)VALUES(@ P1)',N'@ P1 char(300),@ P2文本','C?:\Us?er?s?\i?än?.A?V? A?T?O?P?I?ÀA?p?p?D?a?L?o?çaléA?v?at?r?那么?f?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'

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? So?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)的值。请确保它不会损坏。

Which points out the problem - it's building the WideString parameter as a char(300) value. Make it not broke.

在我的WideString降到参数孔之前的最后一次看到的是:

The last i see of my WideString before it goes down the parameter hole is:

ParameterObject.Value := NewValue;

其中


  • NewValue VT_BSTR 类型的变体(又名<$ c具有适当值的$ c> varOleStr )

  • ParameterObject 是本机ADO _Parameter 对象,并带有 。类型的129( adChar

  • NewValue is a variant of type VT_BSTR (aka varOleStr) with the proper value
  • ParameterObject is a native ADO _Parameter object, with a .Type of 129 (adChar)

甚至试图强制参数类型:

Even trying to force the parameter type:

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

没有帮助。


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

Note: This question is part of a series on how to paramaterize 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


推荐答案

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

The answer is that it cannot be done in Delphi (5).

在更新的Delphi版本中可能已解决;但是如果没有任何人进行测试,我们将不会知道。

It might be fixed in newer versions of Delphi; but without anyone to test it we won't know.

问。:如何使用TADOCommand参数化查询对宽字符串进行参数化?

A。 :你不能。很抱歉给您带来不便。

Q.: How to parameterize widestrings using TADOCommand parameterized query?
A.: You can't. Sorry for the inconvience.

这篇关于如何使用TADOCommand参数化查询参数化宽字符串?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆