Передать длинные строки Unicode в параметр FireDac TADQuery

Я использовал AsWideString для передачи строки Unicode в параметр TADQuery.

ADQuery.Params.ParamByName('MyFld').AsWideString

Но когда строка становится слишком длинной, я получаю сообщение об ошибке:

[MyFld]. Max len = [8002], actual len = [10522]

Затем я решил использовать свойство AsMemo

ADQuery.Params.ParamByName('MyFld').AsMemo

В этом случае моя строка Unicode отображается неправильно.

Как решить обе проблемы?


person vico    schedule 28.01.2014    source источник
comment
@David, FireDAC реализует это, как вы ожидаете, но см., например. stackoverflow.com/a/16140053/960757. Общие поставщики наборов данных были (и кто знает, может быть) реализованы, поскольку геттер AsString используется для возврата строки ANSI из базовой базы данных. Даже в Юникоде Делфи. Это ловушка.   -  person TLama    schedule 28.01.2014


Ответы (2)


Тип TFDParam имеет .AsWideMemo в XE5, который должен правильно принимать символы Юникода и обходить ограничение по размеру, с которым вы столкнулись.

ADQuery.Params.ParamByName('MyFld').AsWideMemo := 'Some unicode string';
person Jason Southwell    schedule 04.03.2014

Фактическому полю базы данных назначено максимальное количество символов. Вы не можете установить значение, превышающее этот предел. Это либо урежет значение, либо, в вашем случае, вызовет ошибку. Вы не можете использовать AsMemo для установки непамятного поля. Продолжайте использовать AsWideString и обратите внимание на структуру вашей базы данных.

person Remy Lebeau    schedule 28.01.2014
comment
Я бы сказал, что на самом деле это не так. Если у вас есть поле NVARCHAR(MAX) и вы используете параметр AsString/AsWideString, длина которого превышает 8002 символа, вы получите именно эту ошибку. Рекомендуемое решение — использовать AsMemo, но в ситуации с OP это не работало с юникодом. - person Jason Southwell; 04.03.2014
comment
AsWideString изменяет тип параметра на ftWideString, который посредством предопределенного сопоставления типов данных приводит к типу данных с его ограничениями, например, например. на SQL Server до nvarchar[n], где n может быть не более 4 КБ. Таким образом, использование AsWideString фактически уменьшает ограничение длины хранимой строки, если за ним стоит столбец, подобный nvarchar[max] на SQL Server. @ Джейсон здесь прав. - person Victoria; 27.06.2017