SOL / ColdFusion:具有来自会话的多个外键的INSERTS

时间:2013-06-05 14:44:42

标签: sql sql-server coldfusion

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

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

我想遍历会话,并确定session.itemid属于哪个产品表,并根据该表,在OrderItems表中插入属于正确PK列名称的ID。

例如session.cart的CFDUMP:

enter image description here

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

OrderItems表

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>

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

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: 

尝试使用以下内容,如果有多个项目有效,但是它会使用相同的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>

enter image description here

代码,会产生错误:

  <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:VALUES('#insert.GENERATEDKEY#','#SESSION.cart [i] .itemid#','#SESSION.cart [i] .price#') 30: 31:


我的斗智尽头,不知道从哪里开始......

将Coldfusion 10与SQL 2008 R2一起使用

2 个答案:

答案 0 :(得分:3)

(扩展自评论)

老实说,我看到的最大问题是你的桌面结构。当您有多个列存储相同类型的对象时,它通常是normalize所需的符号。

例如,将每个订购的商品存储在单独的记录中。 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>

答案 1 :(得分:1)

看起来您的问题类似于此问题:How do I insert multiple rows WITHOUT repeating the "INSERT INTO dbo.Blah" part of the statement?

代码:

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>