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̶\
ただし、非常に壊れやすく、本番環境での使用には適していません。
TADOCommand
Delphiで 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
オブジェクトです ( ).Type
adChar
パラメータタイプを強制しようとしても:
cmd.Parameters.ParamByName('filename').DataType := ftWideString;
cmd.Parameters.ParamByName('filename').Value := s;
役に立ちません。
注:この質問は、パラメータ化する方法に関するシリーズの一部です
INSERT INTO foo (value) VALUES (%s)