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


ネイティブのパラメーター化された ADOオブジェクトを使用できます。Commandデータを正しく保存します。

C̬:\ȗŝḙR͇S̶\

ただし、非常に壊れやすく、本番環境での使用には適していません

TADOCommandDelphiで unicode/WideStrings を使用するにはどうすればよいですか?

ボーナスおしゃべり

SQL Server プロファイラーでは、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は129のネイティブ ADO_Parameterオブジェクトです ( ).TypeadChar

パラメータタイプを強制しようとしても:

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 では修正される可能性があります。しかし、それをテストする人がいなければ、わかりません。

Q. : TADOCommand パラメータ化クエリを使用してワイドストリングをパラメータ化する方法は?
A .: できません。ご不便をおかけして申し訳ありません。

于 2012-06-01T20:36:51.790 に答える