2012-05-24 2 views
0

я пытаюсь использовать параметризованный запрос с 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)

+0

@RRUZ Удален посторонний параметр 'recordsAffected' из исходного вопроса –

+0

Я не предполагал, что вы пробовали UTF-8, не так ли? –

+0

Uch Delphi5, пожалуйста, переходите и используйте совместимый с Unicode IDE/компилятор – whosrdaddy

ответ

0

Ответ заключается в том, что он не может быть выполнен в Delphi (5).

Возможно, это исправлено в новых версиях Delphi; но никто не сможет его проверить, мы не узнаем.

Q.: Как параметризовать широты с помощью TADOCommand с параметризованным запросом?
A.: Вы не можете. Извините за неудобство.

0

Как об использовании

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

Кстати, s объявлена ​​как WideString. необходимо ли иметь 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?

+0

'string' - это псевдоним' AnsiString', который не может хранить данные Unicode. У меня также нет функции ['WideStringToUCS4String'] (http://docs.embarcadero.com/products/rad_studio/delphiAndcpp2009/HelpUpdate2/EN/html/delphivclwin32/System_WideStringToUCS4String.html) в моей версии Delphi. –

+0

При хранении 'UCS4String' в варианте, который' VarType' делает Delphi, преобразует его в. COM и ADO, не имеют поддержки [UTF-32] (http://en.wikipedia.org/wiki/UTF-32), и варианты не могут их удерживать. –

+0

Привет, Ян, я использую Delphi 7, и я могу найти строку UCS-4 или UTF-32 (UCS4String в Delphi), а также функции WideStringToUCS4String и UCS4StringToWidestring в System.pas. – Hendra

 Смежные вопросы

  • Нет связанных вопросов^_^