3

为这个冗长的问题道歉,我以为我会涵盖我尝试过的所有内容!

我有一个购物车应用程序,它将所选项目存储在一个数组中,然后将这些项目传递到 OrderItems 表以存储在数据库中。orderItems 表中的条目可以作为客户的分项订单页面输出,例如,如果他们想查看过去的订单。

我想遍历会话,并确定 session.itemid 属于哪个产品表,并在此基础上将属于正确 PK 列名称的 ID 插入 OrderItems 表。

例如 session.cart 的 CFDUMP:

在此处输入图像描述

上述每一项都属于一个单独的表。

订单项表

itemID  int 
orderID nvarchar(10)    
ticketperformanceID int 
ticketparkingID int 
accommCategoryID int    
itemCost decimal(6, 2)  

如果购物车中只有一件商品,当前部分工作的代码可以正常执行,但是它将 itemid 存储在所有 3 列中,而不是与 ID 列名称匹配的列。此外,如果我有多个不同 ID 的项目,则会返回错误。请在下面的代码后查看错误代码。

 <cfquery name="addOrder" datasource="sql1007539" result="insert">
    INSERT INTO orders 
           (customerID
          ,orderDate
          ,orderValue)

    values ('#cust.customerID#', '#DateFormat(Now())#','#variables.totalprice#')

    </cfquery>
    <cfquery name="orderItems" datasource="sql1007539">
    insert into orderItems (
          orderID,
          ticketperformanceID
          ,ticketparkingID
          ,accommCategoryID
          ,itemCost
    )

    values('#insert.GENERATEDKEY#', '<cfoutput><cfloop from="1" to="#arrayLen(session.cart)#" index="i"><cfif i eq arrayLen(session.cart)>#session.cart[i].itemid#<cfelse>#session.cart[i].itemid#, </cfif></cfloop></cfoutput>','<cfoutput><cfloop from="1" to="#arrayLen(session.cart)#" index="i"><cfif i eq arrayLen(session.cart)>#session.cart[i].itemid#<cfelse>#session.cart[i].itemid#, </cfif></cfloop></cfoutput>','<cfoutput><cfloop from="1" to="#arrayLen(session.cart)#" index="i"><cfif i eq arrayLen(session.cart)>#session.cart[i].itemid#<cfelse>#session.cart[i].itemid#, </cfif></cfloop></cfoutput>','<cfoutput><cfloop from="1" to="#arrayLen(session.cart)#" index="i"><cfif i eq arrayLen(session.cart)>#session.cart[i].price#<cfelse>#session.cart[i].price#, </cfif></cfloop></cfoutput>')</cfquery>
    </cftransaction>

    <cfoutput> Your order has been committed</cfoutput>

如果 session.cart 中有多个具有不同 ID 的项目,则会出错:

Error Executing Database Query.
[Macromedia][SQLServer JDBC Driver][SQLServer]Conversion failed when converting the varchar value '1, 2, 101' to data type int.

The error occurred in C:/ColdFusion10/cfusion/wwwroot/ce0932a/coursework/process.cfm: line 28

26 : )
27 : 
28 : values('#insert.GENERATEDKEY#', '<cfoutput><cfloop from="1" to="#arrayLen(session.cart)#" index="i"><cfif i eq arrayLen(session.cart)>#session.cart[i].itemid#<cfelse>#session.cart[i].itemid#, </cfif></cfloop></cfoutput>','<cfoutput><cfloop from="1" to="#arrayLen(session.cart)#" index="i"><cfif i eq arrayLen(session.cart)>#session.cart[i].itemid#<cfelse>#session.cart[i].itemid#, </cfif></cfloop></cfoutput>','<cfoutput><cfloop from="1" to="#arrayLen(session.cart)#" index="i"><cfif i eq arrayLen(session.cart)>#session.cart[i].itemid#<cfelse>#session.cart[i].itemid#, </cfif></cfloop></cfoutput>','<cfoutput><cfloop from="1" to="#arrayLen(session.cart)#" index="i"><cfif i eq arrayLen(session.cart)>#session.cart[i].price#<cfelse>#session.cart[i].price#, </cfif></cfloop></cfoutput>')</cfquery>
29 : </cftransaction>
30 : 

VENDORERRORCODE       245
SQLSTATE      22018
SQL        insert into orderItems ( orderID, ticketperformanceID ,ticketparkingID ,accommCategoryID ,itemCost ) values('81', '1, 2, 101','1, 2, 101','1, 2, 101','75.00, 20.00, 10.00')
DATASOURCE    sql1007539
Resources: 

尝试使用以下内容,如果有多个 item 则有效,但是它会填充具有相同 ID 的所有三个 ID 列,而且它只存储一个项目的 1 个条目而不是数量,即。我有两个,所以我想将这两个项目存储为单独的记录:

<cfloop from="1" to="#ArrayLen(SESSION.cart)#" index="i">

 <cfquery name="orderItems" datasource="sql1007539">
insert into orderItems (
orderID,
ticketperformanceID
      ,ticketparkingID
      ,accommCategoryID
      ,itemCost
)

values('#insert.GENERATEDKEY#','#session.cart[i].itemid#', '#session.cart[i].itemid#', '#session.cart[i].itemid#', '#session.cart[i].price#'
)
</cfquery>
</cfloop>

<cfoutput> Your order has been committed</cfoutput>

在此处输入图像描述

产生错误的代码:

  <cfloop from="1" to="#ArrayLen(SESSION.cart)#" index="i">
    <cfquery datasource="sql1007539">
      INSERT INTO orderItems(  
      orderID
      ,ticketperformanceID
         ,ticketparkingID
      ,accommCategoryID
      ,itemCost

      where ticketperformanceID='#SESSION.cart[i].itemid#' and ticketparkingID='#SESSION.cart[i].itemid#' and accommCategoryID='#SESSION.cart[i].itemid#';)

      VALUES('#insert.GENERATEDKEY#', '#SESSION.cart[i].itemid#', '#SESSION.cart[i].price#')
      </cfquery>
  </cfloop>

错误:

执行数据库查询时出错。[Macromedia][SQLServer JDBC 驱动程序][SQLServer]关键字“where”附近的语法不正确。

错误发生在 C:/ColdFusion10/cfusion/wwwroot/ce0932a/coursework/process2.cfm: 第 29 行

27:其中ticketperformanceID='#SESSION.cart[i].itemid#'和ticketparkingID='#SESSION.cart[i].itemid#'和accommCategoryID='#SESSION.cart[i].itemid#';)28 :
29:值('#insert.GENERATEDKEY#','#SESSION.cart[i].itemid#','#SESSION.cart[i].price#')30:31:


我对此束手无策,不知道从哪里开始......

将 Coldfusion 10 与 SQL 2008 R2 一起使用

4

2 回答 2

3

(从评论扩展)

老实说,我看到的最大问题是您的表结构。当您有多个列存储相同类型的对象时,这通常是您需要规范化的标志。

例如,将订购的每个项目存储在单独的记录中。表item本身应包含项目的“类型”(即“停车”、“性能”等)。由于它可能不会更改,因此无需将其存储在您的orderItems表中。 注意:您可以根据需要添加其他列(如“数量”)。

CREATE TABLE OrderItems (
   orderID ...
   , itemID ...
   , itemCost ....
)

使用规范化的表结构会容易得多。只需遍历购物车数组并在每个item. 请务必使用cfqueryparam所有值。(如果您还没有这样做,也可以将所有查询包装在事务中)。

<cfloop array="#SESSION.cart#" index="details">
   <cfquery ....>
      INSERT INTO orderItems ( 
         orderID
         , itemID
         , itemCost
      )
      VALUES (
         <cfqueryparam value="#insert.GENERATEDKEY#" cfsqltype="cf_sql_integer">
         , <cfqueryparam value="#details.itemid#" cfsqltype="cf_sql_integer">
         , <cfqueryparam value="#details.price#" cfsqltype="cf_sql_decimal">
      )
   </cfquery>
</cfloop>
于 2013-06-05T16:04:53.707 回答
1

看起来您的问题与此类似:如何插入多行而不重复语句的“INSERT INTO dbo.Blah”部分?

对于您的代码:

values('#insert.GENERATEDKEY#', '<cfoutput><cfloop from="1" to="#arrayLen(session.cart)#" index="i"><cfif i eq arrayLen(session.cart)>#session.cart[i].itemid#<cfelse>#session.cart[i].itemid#, </cfif></cfloop></cfoutput>',
'<cfoutput><cfloop from="1" to="#arrayLen(session.cart)#" index="i"><cfif i eq arrayLen(session.cart)>#session.cart[i].itemid#<cfelse>#session.cart[i].itemid#, </cfif></cfloop></cfoutput>',
'<cfoutput><cfloop from="1" to="#arrayLen(session.cart)#" index="i"><cfif i eq arrayLen(session.cart)>#session.cart[i].itemid#<cfelse>#session.cart[i].itemid#, </cfif></cfloop></cfoutput>',
'<cfoutput><cfloop from="1" to="#arrayLen(session.cart)#" index="i"><cfif i eq arrayLen(session.cart)>#session.cart[i].price#<cfelse>#session.cart[i].price#, </cfif></cfloop></cfoutput>')
</cfquery>

应该是这样的:

价值观

 <cfoutput>
    <cfloop from="1" to="#arrayLen(session.cart)#" index="i">
    ('#insert.GENERATEDKEY#', 
       #session.cart[i].itemid#,
       #session.cart[i].itemid#,
       #session.cart[i].price#
    )
    <cfif i NEQ arrayLen(session.cart)>,</cfif
    </cfloop>
 </cfoutput>
于 2013-06-05T15:34:04.170 回答