3

複数を使用cfqueryすると、ColdFusion で次のエラーが発生します。cfqueryparamsただし、それらが使用されていないか、どちらか一方のみに限定されている場合、クエリは期待される結果を返します。

<cfquery name="getComponent"
 datasource="#Request.DSN#"
 username="#Request.username#"
 password="#Request.password#">
  SELECT *
  FROM tbComponent
    INNER JOIN tbPart ON tbPart.partNo = tbComponent.partNo
    INNER JOIN tbProduct on tbProduct.prodNo = tbComponent.prodNo
  WHERE tbComponent.prodNo = <cfqueryparam value="#URL.prodNo#"
                              cfsqltype="CF_SQL_CHAR"
                              maxlength="3" />
    AND tbComponent.compNo = <cfqueryparam value="#URL.compNo#"
                              cfsqltype="CF_SQL_CHAR"
                              maxlength="2" />
</cfquery>

データは、次のような URL を介して渡されます。

http://localhost/index.cfm?prodNo=100&compNo=1

クエリは有効なデータを使用して SQLPlus でテストされており、期待される結果も返されます。URLこの問題は、値がpost を介して渡され、正常に機能するため、値が渡された場合に限定されているように見えるFORMため、URL で何らかの方法で何かが壊れていると思われます。データとクエリがチェックcfdumpされ、SQLPlus でクエリを実行するために使用されるものに対してすべてが正しいように見えます。

データベースのバックエンドは Oracle 11g であり、私の知る限り、関連するドライバーはすべて最新です。明らかな問題がすでにチェックされているように見えるので、ここで何が起こっているのかについての考え。

4

1 に答える 1

0

URL に %20 がないため、1 つまたは 2 つの長さの文字を渡すと、それらの前に適切なスペースが配置されるように、Oracle の LPAD 関数を入れます。このようなもの:

<cfquery name="getComponent"
 datasource="#Request.DSN#"
 username="#Request.username#"
 password="#Request.password#">
  SELECT *
  FROM tbComponent
    INNER JOIN tbPart ON tbPart.partNo = tbComponent.partNo
    INNER JOIN tbProduct on tbProduct.prodNo = tbComponent.prodNo
  WHERE tbComponent.prodNo = LPAD(<cfqueryparam value="#URL.prodNo#"
                              cfsqltype="CF_SQL_CHAR"
                              maxlength="3" />, 3)
    AND tbComponent.compNo = LPAD(<cfqueryparam value="#URL.compNo#"
                              cfsqltype="CF_SQL_CHAR"
                              maxlength="2" />, 2)
</cfquery>

必要に応じて、列の最大文字長までパディングします。yes または no であることをチェックする null 属性が存在しないため、少なくとも何らかの値が存在すると仮定しているため、少なくとも 1 文字が常に両方に渡されるという前提で、それらを 2 と 1 に変更できます。各クエリ パラメータ。

于 2014-01-13T21:34:47.903 に答える