2013-06-05 27 views
3

對於這個漫長的問題抱歉,我想我會涵蓋我嘗試過的一切!SOL/ColdFusion:插入來自會話的多個外鍵

我有一個購物車應用程序,用於存儲在數組中選擇的項目,然後將這些項目傳遞給OrderItems表以存儲在數據庫中。然後,orderItems表中的條目可以作爲客戶的分項訂單頁面輸出,例如,如果他們想查看過去的訂單。

我想循環瀏覽會話,並確定session.itemid屬於哪個產品表,並在此基礎上向OrderItems表中插入屬於正確PK列名稱的ID。

例如CFDUMP session.cart的:

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列,並且它只存儲一個項目的一個條目而不是數量,即。我有兩個量,所以我想這兩個項目存儲爲單獨的記錄:

<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]。價格#') 30: 31:


我在我無計可施這樣結束了,不知道從哪裏何去何從......

使用ColdFusion 10 SQL 2008 R2

+2

老實說,我看到的最大的問題是你的表結構。當您有多個存儲相同類型對象的列時,它通常是您需要[標準化]的標誌(http://msdn.microsoft.com/zh-cn/library/ms191178%28v=SQL.105%29)。 ASPX)。例如,將每個項目存儲在單獨的記錄中,即'orderID,itemID,itemCost'。 「item」表本身應該包含項目的「類型」(停車,表演等)。 – Leigh

+0

謝謝Leigh,我應該在問題中提到這一點。我有兩個表,一個是Orders表,它存儲了(OrderID,CustomerID,Date,ValueofOrder)。好吧,我會放棄這一點。 –

+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

它看起來像你的問題是與此類似: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> 
+0

非常感謝詹姆斯。我會放棄這一點。另外,正如Leigh所建議的,我需要考慮正常化。 :-) –