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

时间:2019-11-08 14:33:01

标签: sql-server coldfusion cfml lucee

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

  

“对象或列名称丢失或为空。对于SELECT INTO   语句,验证每个列都有一个名称。对于其他语句,请看   空的别名。别名定义为“”或不允许。   将别名更改为有效名称。”

起初,我认为日期字段存在问题,因为Lucee与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),称为“一个”

这是我的测试应用程序:

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

运行此命令时,出现相同的错误。知道为什么吗? 此处完整跟踪:https://justpaste.it/6k0hw

谢谢!

EDIT1:
好奇。我尝试使用“用于MS SQL Server和Sybase的jTDS Type 4 JDBC驱动程序”作为数据源驱动程序,现在错误是:

  

对象限定符的数据库名称部分必须是名称   当前数据库的数据。

这可以追溯到以下语句:

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

当我在Microsoft SQL Server Management Studio中尝试此操作时,出现相同的错误。 但是,当我指定数据库名称(“ one”作为第三个参数)时,MS SQL SMS中没有错误。

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

Lucee不应从数据源配置中获取此参数吗?

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

EDIT3:

此处提交的错误:https://luceeserver.atlassian.net/browse/LDEV-2566

3 个答案:

答案 0 :(得分:4)

我个人将CFINSERT重构为queryExecute并编写简单的InsertInto SQL语句。希望我们会完全删除对cfinsert的支持。

答案 1 :(得分:1)

考虑使用

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

答案 2 :(得分:0)

我有99%的把握这是Lucee / JDK / JDBC Driver错误,而不是配置错误。

来源

我最初怀疑有一些低调的成果,例如您在“ Field2”中领先的空格。然后,我看到您的注释显示,您在使用其他数据库驱动程序时尝试过修剪和Edit1,但出现了其他错误。因此,我着手尝试重现您的问题。

Lucee 5.2.4.37和MS SQL Server 2016上,配备了示例代码和两个新的数据源-每个用于jTDS (MSQL and Sybase)驱动程序,一个用于SQL上的Microsoft SQL Server (JDBC4 - Vendor Microsoft),我无法重现这两个问题在任一驱动程序上。即使选择性地取消各种数据库权限并为SQL用户更改默认数据库,我仍然只能强制执行不同的(预期的)错误,而不是您的错误。

在我将管理员更新发布到Lucee 5.3.3.62并重新运行测试后, boom 我在使用各自的数据源时都遇到了两个错误,而数据库权限没有其他更改,数据源配置或示例代码。

祝你好运,说服Lucee伙计,这些轶事证据证明是个错误,但是如果您需要其他声音,请给我喊一声。虽然我不在自己的代码中使用cfinsert / cfupdate,但最近我一直处于支持听起来和大小相似的传统CF应用程序的位置,并且对围绕其重构或现代化的后勤挑战表示同情! >

error with jTDS driver enter image description here

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

同时使用tablequalifier="dbname"tableowner="dbo"不适用于MS SQL Server驱动程序,但似乎确实适用于jTDS驱动程序,因此这是一种可能的解决方法,意味着更改每次出现的标签,因此理想情况下,如果Lucee本身不这样做,Lucee伙计们将能够从头开始修复该错误或确定哪个Java更新破坏了该错误。