【问题标题】:Can not reproduce this [ODBC Microsoft Access Driver] Syntax error无法重现此 [ODBC Microsoft Access Driver] 语法错误
【发布时间】:2012-12-09 02:26:25
【问题描述】:

这个让我难过。我的三个客户收到了这个错误,但我无法重现它!

[Macromedia][SequeLink JDBC Driver][ODBC Socket][Microsoft][ODBC Microsoft Access Driver] INSERT INTO 语句中的语法错误。

一般而言,什么会导致接收此类数据库错误的人出现差异,哪些问题会阻止我最终复制它?

这是我认为导致错误的代码:

<cfquery 
name="rsAddSKUs" 
datasource="#request.dsn#" 
username="#request.dsnUsername#" 
password="#request.dsnPassword#">
    INSERT INTO 
    tbl_orderskus 
        ( orderSKU_OrderID
        , orderSKU_SKU
        , orderSKU_Quantity
        , orderSKU_UnitPrice
        , orderSKU_SKUTotal
        , orderSKU_Picked
        , orderSKU_TaxRate
        , orderSKU_DiscountID
        , orderSKU_DiscountAmount)
    VALUES 
        ('#var.ThisOrderID#'
        , #rsGetCart.SKU_ID#
        , #rsGetCart.Qty#
        , #rsGetCart.SKU_Price#
        , #SKUTotal#
        , 0
        , #var.thisProductTax#
        , #var.thisDiscountID#
        , #var.thisdiscountAmount#)
</cfquery>

谢谢, 比斯科蒂

【问题讨论】:

  • 顺便说一句,您应该使用cfqueryparam。直接在 sql 中使用原始客户端值绝不是一个好主意 - 即使使用 MS Access。
  • @Leigh 很棒的提示。出于可扩展性的原因,我实际上正在将站点迁移到 mySQL。使用 cfqueryparam 编码是否有任何缺点,或者在 mySQL 中处理 sql 注入的更好方法?
  • 没有什么是完全没有怪癖的,但是对于基本的 cfquery 保护,cfqueryparam 是最好的选择。此外,它还有许多其他好处,例如类型检查、列表处理、促进查询计划重用(有助于提高性能)。这些是使用它的主要原因。基本的 sql 注入保护只是一个奖励。

标签: sql ms-access coldfusion coldfusion-9


【解决方案1】:

我的第一个倾向是其中一个数字字段是空白的,并且插入语句试图插入一个 , 而不是一个值

【讨论】:

  • 我认为你是对的,看起来我正在设置 数据库期望该列中有一个数字
  • 您需要添加一些条件逻辑,以便如果值不是数字,则将 null 插入该列。
  • null 或默认号码(如果适用)。就这样在两个逗号之间有 some 值。否则,它不是一个有效的 sql 语句。
【解决方案2】:

您能否将“插入”命令记录到日志文件中,然后让您的客户让他们向您发送日志文件以查看有问题的插入命令是什么?

我在想如果插入命令依赖于用户输入,那么他们可能会输入一些奇怪的东西。

【讨论】:

  • 你的观点很好。直到出现这个错误,我才实现了 cferror 来通知我背后发生的各种错误!
【解决方案3】:

将所有数值包装在 val() 中,这样你就得到 0 而不是空字符串。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-05-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-14
    • 2011-10-04
    • 1970-01-01
    • 2013-04-14
    相关资源
    最近更新 更多