ColdFusion 9.01 -> Lucee 5.3.3.62 和 <cfinsert> / <cfupdate>

ColdFusion 9.01 -> Lucee 5.3.3.62 and <cfinsert> / <cfupdate>

我继承了一个大型应用程序,它 运行正在 CF 9.01 上运行。
我正在将它移植到 Lucee 5.3.3.62,但是有一些问题 我知道我应该用 替换它,但是这个应用程序有大约 1000 个源文件 (!!),并且由于时间原因,替换所有这些标签目前并不明显。
Lucee 抛出如下错误:

“An object or column name is missing or empty. For SELECT INTO statements, verify each column has a name. For other statements, look for empty alias names. Aliases defined as “” or are not allowed. Change the alias to a valid name.”

起初,我以为日期字段有问题,因为 Lucee 处理它们的方式与 CF 9.01 不同,但事实并非如此。 因此,我创建了一个测试 table(在 MS-SQL Server 2008R2 上):

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

在 Lucee 中,我使用的数据源是:Microsoft SQL 服务器(Microsoft 供应商),称为“one”

这是我的测试应用程序:

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

当我运行这个时,我得到同样的错误。知道为什么吗? 此处完整跟踪:https://justpaste.it/6k0hw

谢谢!

编辑 1:
好奇的。我尝试使用“jTDS Type 4 JDBC Driver for MS SQL Server and Sybase”作为数据源驱动程序,现在错误是:

The database name component of the object qualifier must be the name of the current database.

这可以追溯到这个声明:

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

当我在 Microsoft SQL Server Management Studio 中尝试此操作时,我遇到了同样的错误。 但是,当我指定数据库名称('one' 作为第三个参数)时,MS SQL SMS.

中没有错误
EXEC sp_columns 'LuceeTest01', '', 'one', 'null', 3

Lucee 不应该从数据源配置中获取这个参数吗?

编辑2:

正如@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

我个人会将 CFINSERT 重构为 queryExecute 并编写一个普通的 InsertInto SQL 语句。我希望我们能完全取消对 cfinsert.

的支持

考虑使用

<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>

我有 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) 各一个 [=47] =],我无法在任何一个驱动程序上重现任何一个问题。即使有选择地取消各种数据库权限并更改 SQL 用户的默认数据库,我仍然只能强制执行不同的(预期的)错误,而不是你的错误。

我一点击管理员更新到 Lucee 5.3.3.62 并重新 运行 测试,boom 我就遇到了你的两个错误数据源,数据库权限、数据源配置或示例代码没有其他变化。

祝 Lucee 的家伙们相信这个轶事证据是一个错误的证据,但如果你需要额外的声音,请告诉我。虽然我不在我自己的代码中使用 cfinsert/cfupdate,但我最近一直在支持具有类似规模和性质的遗留 CF 应用程序,并理解围绕重构或现代化它的逻辑挑战!

编辑: 我在上面的评论中尝试了@Redtopia 的 tablequalifier 建议。对于任何一个数据库驱动程序,仅添加 tablequalifier 属性对我都不起作用。

同时使用 tablequalifier="dbname"tableowner="dbo" 仍然不适用于 MS SQL 服务器驱动程序,但似乎确实适用于 jTDS 驱动程序,所以这是可能的变通方法意味着更改标签的每一次出现,因此理想情况下,Lucee 人员将能够从他们的末端修复错误,或者如果 Lucee 本身没有,则确定哪个 Java 更新破坏了它。