ColdFusion 9.01 -> Lucee 5.3.3.62 и <cfinsert>/ <cfupdate> - PullRequest
5 голосов
/ 08 ноября 2019

Я унаследовал большое приложение, работающее на CF 9.01.
Я в процессе переноса его на Lucee 5.3.3.62, но у меня есть некоторые проблемы, и я знаю, что должен заменить его на:но у этого приложения есть ~ 1000 исходных файлов (!!), и замена всех этих тегов в настоящее время не очевидна по временным причинам.
Lucee выдает такие ошибки, как:

«Имя объекта или столбцаотсутствует или пуст. Для операторов SELECT INTO убедитесь, что у каждого столбца есть имя. Для других операторов ищите пустые псевдонимы. Псевдонимы, определенные как «» или не допускаются. Измените псевдоним на допустимое имя. ”

Сначала я подумал, что были проблемы с полем даты, потому что Люси обрабатывает их иначе, чем CF 9.01, но это не так. Итак, я создал тестовую таблицу (на MS-SQL Server 2008R2):

CREATE TABLE [dbo].[LuceeTest01](   
  [Field1] [nvarchar](50) NULL,
  [Field2] [nvarchar](50) NULL ) ON [PRIMARY]

В Lucee я использую в качестве источника данных: Microsoft SQL Server (поставщик Microsoft), который называется «one»

Это мое тестовое приложение:

<cfset Form.Field1 = "Field1">
<cfset Form.Field2 = "Field2">
<cfoutput>
    <cfinsert datasource="one"
        tablename="LuceeTest01"
        formfields="Field1, Field2">
</cfoutput>

Когда я запускаю это, я получаю ту же ошибку. Есть идеи почему? Полный след здесь: https://justpaste.it/6k0hw

Спасибо!

EDIT1:
Любопытно. Я попытался использовать «драйвер JDBC типа 4 jTDS для MS SQL Server и Sybase» в качестве драйвера источника данных, и теперь ошибка:

Компонент имени базы данных квалификатора объекта должен быть именем текущегобаза данных.

Это восходит к этому утверждению:

{call []..sp_columns 'LuceeTest01', '', '', 'null', 3}

Когда я пытаюсь это сделать в Microsoft SQL Server Management Studio, я получаю ту же ошибку. Тем не менее, когда я указываю имя базы данных («один» в качестве третьего аргумента), в MS SQL SMS нет ошибок.

EXEC sp_columns 'LuceeTest01', '', 'one', 'null', 3

Разве Люси не должна использовать этот аргумент из конфигурации источника данных или чего-то еще?

EDIT2:

В соответствии с рекомендациями @Redtopia, когда указываются «tableowner» и «tablequalifier», он работает для драйвера jTDS. Будет использовать это как обходной путь. Обновленный пример кода:

<cfset Form.Field1 = "Field1">
<cfset Form.Field2 = "Field2">
<cfinsert datasource="onecfc"
    tableowner="dbo"
    tablename="LuceeTest01"
    tablequalifier="one"
    formfields="Field1,Field2">

РЕДАКТИРОВАТЬ3:

Ошибка подана здесь: https://luceeserver.atlassian.net/browse/LDEV-2566

Ответы [ 3 ]

4 голосов
/ 08 ноября 2019

Я лично реорганизовал бы CFINSERT в queryExecute и написал бы простой оператор InsertInto SQL. Я хотел бы, чтобы мы полностью удалили поддержку cfinsert.

1 голос
/ 08 ноября 2019

Рассмотрите возможность использования

<cfscript>
 Form.Field1 = "Field1";
 Form.Field2 = "Field2";

 // Don't forget to setup datasource in application.cfc
 QueryExecute("
    INSERT INTO LuceeTest01 (Field1, Field2)
    VALUES (?, ?)
    ",
    [form.field1, form.field2]
    );
</cfscript>
0 голосов
/ 11 ноября 2019

Я на 99% уверен, что это ошибка драйвера Lucee / JDK / JDBC, а не ошибка в вашей конфигурации.

Источник :

Я изначально подозревалнекоторые низко висящие фрукты, такие как ваш ведущий пробел в 'Field2'. Затем я увидел ваш комментарий, показывающий, что вы пытались с этим обрезанным и вашим Edit1 с другой ошибкой при использовании другого драйвера БД. Поэтому я принялся за работу, пытаясь воспроизвести вашу проблему.

На Lucee 5.2.4.37 и MS SQL Server 2016, вооруженный вашим примером кода и двумя новыми источниками данных - по одному для jTDS (MSQL and Sybase) драйвера и Microsoft SQL Server (JDBC4 - Vendor Microsoft) для SQLЯ не смог воспроизвести ни одну из проблем ни на одном из драйверов. Даже при выборочном отборе различных прав доступа к БД и изменении базы данных по умолчанию для пользователя SQL я все еще мог вызывать только другие (ожидаемые) ошибки, а не вашу ошибку.

Как только я установил обновление администратора до Lucee 5.3.3.62 и повторно запустил тесты, boom Я ударил обе ваши ошибки с соответствующими источниками данных, без каких-либо других изменений в разрешениях БД, конфигурации источника данных или образце кода.

Удачи убедительноребята Люси, что это неподтвержденное доказательство является доказательством ошибки, но дайте мне знать, если вам нужен дополнительный голос. Хотя я не использую cfinsert / cfupdate в своем собственном коде, в недавнем прошлом я занимался поддержкой устаревшего CF-приложения аналогичного размера и характера звучания и сочувствую логистическим проблемам, связанным с рефакторингом или его модернизацией!

error with jTDS driver enter image description here

Редактировать: Я попробовал предложение tablequalifier от @Redtopia в комментарии выше,Добавление только атрибута tablequalifier у меня не работало ни с одним из драйверов БД.

Использование tablequalifier="dbname" и tableowner="dbo" все еще не работало для меня с драйвером MS SQL Server, но, похоже, работает для драйвера jTDS, так что это возможный обходной путь, означающий изменение каждого вхождениятэг, так что в идеале ребята из Lucee смогут исправить ошибку с самого конца или определить, какое обновление Java ее сломало, если сама Lucee этого не сделала.

...