无法重现此[ODBC Microsoft Access驱动程序]语法错误

无法重现此[ODBC Microsoft Access驱动程序]语法错误

问题描述:

这一个让我难住。我的三个客户都收到了这个错误,但我不能在我的最后重现它!无法重现此[ODBC Microsoft Access驱动程序]语法错误

[Macromedia][SequeLink JDBC Driver][ODBC Socket][Microsoft][ODBC Microsoft Access Driver] Syntax error in INSERT INTO statement.

一般,什么会导致谁收到这样的DB错误的不一致时,什么样的问题会阻止我能复制它在我结束?

这里的代码位,我相信是会导致错误:

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

感谢, 比斯科蒂

+2

另外,你应该使用'cfqueryparam'。在sql中直接使用原始客户端值绝不是一个好主意 - 即使使用MS Access。 – Leigh

+0

@Leigh大提示。为了可伸缩性的原因,Im实际上正在将网站迁移到mySQL。使用cfqueryparam编码有什么缺点,或者更好的方法来处理SQL中的SQL注入? – BiScotti

+1

没有什么是完全没有怪癖的,但对于基本的cfquery保护,cfqueryparam是最好的选择。另外它还有很多其他好处,例如类型检查,列表处理,促进查询计划重用(帮助性能)。这些是使用它的主要原因。基本的sql注入保护只是一个奖金。 – Leigh

我的第一个倾向是数字领域之一是空白和插入语句尝试,而不是一个值

+0

我认为你是正确的,它看起来像我设置数据库期待在该栏中的数字 – BiScotti

+0

您需要添加一些条件逻辑,以便如果该值不是一个数字,将null插入到该列中。 –

+0

“null”或默认编号(如果适用)。这两个逗号之间有一些*值。否则,它不是一个有效的sql语句。 – Leigh

您可以登录“插入”命令日志文件,然后让你的客户得到他们向您发送日志文件以查看有问题的插入命令是什么?

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

+0

你的观点很好。直到这个错误,我实现了cferror来通知我后面发生的错误种类! – BiScotti

裹插入,,在val()所有的数值,让你得到0,而不是空的串。