Какова длина String, LongText и ShortText? Установка длинного текста в качестве параметра SQL приводит к ошибке 3001.

Когда я создаю запрос на добавление в ms-access 2013 с параметрами, и для любого из этих параметров задан тип LongText, запрос завершается с ошибкой с кодом 3001 Invalid Argument. Однако изменение типа на ShortText приводит к рабочему запросу. Обе версии можно запустить, дважды щелкнув запрос в самом доступе, но первая не работает при запуске с помощью следующего кода:

Dim db As DAO.Database
Set db = CurrentDb
Dim qdf As QueryDef
Set qdf = db.QueryDefs("NeuerFachlicherInhalt")
    qdf!Inhalt = inhalte("DefaultInhalt")
    qdf!Formular = inhalte("Formular")
qdf.Execute

Таблица, в которую я вставляю параметр, имеет тип поля LongText, и поэтому я ожидаю, что это сработает - в чем здесь основная причина проблемы? И как я могу передать длинный текст, если я не могу указать LongText в качестве параметра?

Я думаю, что это может быть связано с ограничениями длины строк в доступе. В чем именно заключаются эти ограничения? Google перенаправляет вас на конкатенацию и максимальную длину строки в VBA, доступ относительно вопроса о длине строк, но я не могу найти определенного ответа на вопрос (вопросы) о длине:

  • какой длины может быть текст для ShortText?
  • какой длины может быть текст для LongText?
  • какой длины может быть текст для vba String?

Мои запросы в двух случаях выглядят так

PARAMETERS Inhalt LongText, Formular Short;
INSERT INTO FachlicherInhalt ( Inhalt, Formular )
SELECT [Inhalt] AS Expr1, [Formular] AS Expr2;

PARAMETERS Inhalt Text ( 255 ), Formular Short;
INSERT INTO FachlicherInhalt ( Inhalt, Formular )
SELECT [Inhalt] AS Expr1, [Formular] AS Expr2;

person luk2302    schedule 19.05.2015    source источник
comment
Если inhalte является объектом Recordset, попробуйте явно указать свойство .Value, например, inhalte("DefaultInhalt").Value, и посмотрите, имеет ли это какое-то значение.   -  person Gord Thompson    schedule 19.05.2015
comment
Все то же невероятно полезное сообщение об ошибке.   -  person luk2302    schedule 19.05.2015


Ответы (2)


  • ShortText (просто Text до Access 2013) может иметь длину до 255 символов.
  • LongText (Memo до Access 2013) может иметь длину до 1 ГБ, но большинство элементов управления Access могут отображать только 64000 символов. (Текстовое поле в форме начнет вести себя странно при редактировании текста, если оно содержит намного меньше этих 64000 символов.)

См. Документацию по Access 2013 для получения дополнительной информации.

  • String переменной длины VBA может содержать до 2^31 символов.

Дополнительные сведения см. в Справочнике по языку Visual Basic для приложений.


Теперь о вашем вопросе относительно параметра LongText в объекте QueryDef. К сожалению, DAO не поддерживает LongText в качестве типа параметра для запроса, несмотря на то, что он позволяет вам создать параметр в дизайне запроса.

В качестве обходного пути у вас есть следующие варианты:

  • Откройте набор записей и добавьте/обновите запись там
  • Используйте ADO-Command-Object для этого запроса
  • Жестко закодируйте вашу функцию inhalte("DefaultInhalt") в SQL запроса
  • Или соедините свою собственную строку SQL, включая значения (общая длина SQL ограничена 64000 символов!)
person PhilS    schedule 19.05.2015
comment
В итоге я использовал просто старый sql внутри своего кода vba, не такой чистый, но это обходной путь с наименьшими временными затратами, и он работает без каких-либо проблем. - person luk2302; 19.05.2015

Пока я правильно читаю ваш вопрос, я почти уверен, что вы не можете использовать поле длинного текста/памятки в качестве параметра. Согласно информации, найденной здесь: Любой способ иметь параметры длинного текста (memo) в DAO и MS Access?

person Newd    schedule 19.05.2015