为这个冗长的问题道歉,我以为我会涵盖我尝试过的所有内容!
我有一个购物车应用程序,它存储在数组中选择的项目,然后这些项目被传递到OrderItems表以存储在数据库中。然后,orderItems表中的条目可以作为客户的逐项订单页面输出,如果他们想要查看过去的订单,例如。
我想遍历会话,并确定session.itemid属于哪个产品表,并根据该表,在OrderItems表中插入属于正确PK列名称的ID。
例如session.cart的CFDUMP:
上述每个项目都属于一个单独的表格。
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>
代码,会产生错误:
<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一起使用
答案 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>