3

この長々とした質問をお詫びします。私が試したすべてをカバーすると思っていました!

選択したアイテムを配列に格納するカートアプリケーションがあり、これらのアイテムは OrderItems テーブルに渡されてデータベースに格納されます。たとえば、顧客が過去の注文を表示したい場合は、orderItems テーブルのエントリを顧客用の明細化された注文ページとして出力できます。

セッションをループして、session.itemid がどの製品テーブルに属しているかを判断し、それに基づいて、正しい PK 列名に属する ID を OrderItems テーブルに挿入したいと思います。

たとえば、session.cart の CFDUMP:

ここに画像の説明を入力

上記の各項目は、別のテーブルに属しています。

OrderItems テーブル

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

部分的に動作する現在のコードは、カートにアイテムが 1 つしかない場合でも正常に実行されますが、ID 列名と一致する列ではなく、3 つの列すべてに itemid が格納されます。さらに、異なる 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: 

複数のアイテムがある場合に機能する次の操作を試みましたが、3 つの ID 列すべてに同じ ID が入力され、数量ではなくアイテムの 1 つのエントリのみが格納されます。私は 2 つの数量を持っているので、2 つのアイテムを別々のレコードとして保存したいと思います。

<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 Driver][SQLServer]キーワード 'where' 付近の構文が正しくありません。

C:/ColdFusion10/cfusion/wwwroot/ce0932a/coursework/process2.cfm: 行 29 でエラーが発生しました

27 : where ticketperformanceID='#SESSION.cart[i].itemid#' and ticketparkingID='#SESSION.cart[i].itemid#' and acommCategoryID='#SESSION.cart[i].itemid#';) 28 :
29 : VALUES('#insert.GENERATEDKEY#', '#SESSION.cart[i].itemid#', '#SESSION.cart[i].price#') 30:31:


私はこれで頭がいっぱいで、ここからどこへ行くべきかわかりません...

SQL 2008 R2 での Coldfusion 10 の使用

4

2 に答える 2

3

(コメントから展開)

正直なところ、私が目にする最大の問題はテーブル構造です。複数の列に同じタイプのオブジェクトが格納されている場合は、通常、正規化が必要な兆候です。

たとえば、注文した各アイテムを個別のレコードに保存します。テーブル自体には、項目のitem「タイプ」(つまり、「駐車場」、「パフォーマンス」など) が含まれている必要があります。おそらく変更されないため、orderItemsテーブルに保存する必要はありません。 注: 必要に応じて他の列を追加できます (「数量」など)。

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

正規化されたテーブル構造を使用する方がはるかに簡単です。カート配列をループして、 ごとに 1 つのレコードを挿入するだけ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 に答える