я пытаюсь использовать параметризованный запрос с Delphi TADOCommand:Как параметризовать расширения с помощью 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 эр s \ я ?? п? .A? V`A? Т? O? р? Я? А \? р? р?: D ?? т ?? \ л? о ??? л? \ А? v? на? ??р? S? О? Е? Т? Ш? Är? С? Г ?? т? Я ?? п? Ы? \ S? О ° F? Т? Ш? Г ?? Q? У ?? Ли? Т? У? M ?? т? Р? Я? CS? \ С ?? S? -s? Д? М? 00.x? М? Л
я может использовать нативный параметризованный ADO Command
объект. Это правильно сохраняет данные:
C: \ Ȗŝḙr͇s̶ \ i̜ẵn̥.ÀV̹AͧT̶O̠P̩I̿Ȁ \ AppData \ L̫o͋ɕălͭ \ аватаре Программное обеспечение Creations \ S̪ōf̒t͘w̚âr̿ɇ QUALITY M͘ȇt̨r̟i̻çš \ ЦМС-s̞q̕m͜00.xͤm̧l̝
но это very fragile and not suitable for production use.
Как использовать unicode/WideStrings с TADOCommand
в Delphi?
Bonus Болтовня
В SQL Server Profiler вы можете увидеть SQL выполняется:
Exec sp_executesql N'INSERT INTO Кв (Имя файла) 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? аТ? а \ л? о? Кэл \ А? v? в ?? г? Так что? Е? Т? Ш? Ар ?? C? R ?????????????????????????????? ??????????????????? ? \ C M ° S -s кв м 00. m¨'l¯ '
что указывает на проблему -???. он строит параметр WideString
в качестве значения char(300)
Сделать это не сломалось.
Последнее я вижу моего WideString, прежде чем он идет вниз отверстие параметра является:
ParameterObject.Value := NewValue;
где
NewValue
представляет собой вариант типаVT_BSTR
(он жеvarOleStr
) с соответствующим значениемParameterObject
является родным ADO_Parameter
объект, с.Type
of 129 (adChar
)
Даже пытается заставить тип параметра:
cmd.Parameters.ParamByName('filename').DataType := ftWideString;
cmd.Parameters.ParamByName('filename').Value := s;
не помогает.
Примечание: Этот вопрос является частью серии статей о том, как 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
@RRUZ Удален посторонний параметр 'recordsAffected' из исходного вопроса –
Я не предполагал, что вы пробовали UTF-8, не так ли? –
Uch Delphi5, пожалуйста, переходите и используйте совместимый с Unicode IDE/компилятор – whosrdaddy