0

ユーザーにこのエラーが発生しました

診断: データベース クエリの実行中にエラーが発生しました。[Macromedia][SQLServer JDBC Driver][SQLServer]INSERT ステートメントに、VALUES 句で指定された値よりも多くの列があります。VALUES 句の値の数は、INSERT ステートメントで指定された列の数と一致する必要があります。252 行目でエラーが発生しました。 メッセージ: データベース クエリの実行中にエラーが発生しました。根本的な原因: coldfusion.tagext.sql.QueryTag$DatabaseQueryException: データベース クエリの実行中にエラーが発生しました。サーバー: server2

約 60 の値/列があるはずです。考えられる解決策は、 and<CFIF isDefined("VARIABLES.xxx")>の各値に追加することですが、これには時間がかかります。より良い方法はありますか?ここにコードの一部がありますINSERTVALUES

 <CFQUERY name="addAgency" datasource="#REQUEST.dsn#">
    INSERT INTO agency (agency_name, code, address1, address2, city_id, postal, phone, alternativePhone, fax, provincialRegistration,
        <!--- contact, ---> firstname, lastname, username, password, relationship_id, editdate, adddate, email, URL_link,Airport_id,
        header, teaser, full_desc, <CFIF isDefined("VARIABLES.specialty")>specialty,</CFIF> hours_1, hours_2, hours_3, hours_4, 
        hours_5, hours_6, hours_7, merchant_ID,
        region_ID, fcApproved, agencyType_ID, agencystatus, crossview, insp_Approved, rbc_Approved,
        branch_number, gp_entity_ID,
        <CFIF VARIABLES.alias1 gt 100> alias1,</CFIF>
        <CFIF VARIABLES.alias2 gt 100> alias2,</CFIF>
        <CFIF Trim(VARIABLES.alias3) NEQ ""> alias3,</CFIF>
        default_agent_id,LOCAL_PASSWORD,LOCAL_USERNAME,NATIONAL_PASSWORD,NATIONAL_USERNAME,VACATIONCLUB_PASSWORD,VACATIONCLUB_USERNAME,toll_free_number,display_toll_free ,MARKETINGREGIONID, searchPreference, bookingOption,customer_can_choose
        <CFIF isDefined("variables.logo_filedata")>,logo_fileName,logo_fileData,logo_mimeType</CFIF>
        ,gds, pseudo_city, acv_affiliate_code, vip_ext,owner_manager_title_en,owner_manager_title_fr)

    VALUES (<CFQUERYPARAM value="#Trim(sanitize(VARIABLES.agency_name))#"  cfsqltype = "cf_sql_varchar" maxlength="150">, 
        <CFQUERYPARAM value="#Trim(sanitize(VARIABLES.code))#"  cfsqltype = "cf_sql_varchar" maxlength="50">, 
        <CFQUERYPARAM value="#Trim(sanitize(VARIABLES.address1))#"  cfsqltype = "cf_sql_varchar" maxlength="255">,
            <CFQUERYPARAM value="#Trim(sanitize(VARIABLES.address2))#"  cfsqltype = "cf_sql_varchar" maxlength="255">,
            <CFQUERYPARAM value="#sanitize(VARIABLES.city_id,true,true,false,true,false)#"  cfsqltype = "cf_sql_integer">,
            <CFQUERYPARAM value="#Trim(sanitize(VARIABLES.postal))#"  cfsqltype = "cf_sql_varchar" maxlength="10">,
            <CFQUERYPARAM value="#Trim(sanitize(VARIABLES.phone))#"  cfsqltype = "cf_sql_varchar" maxlength="20">,
            <CFQUERYPARAM value="#Trim(sanitize(VARIABLES.fax))#"  cfsqltype = "cf_sql_varchar" maxlength="20">,    
        <!--- <CFIF IsDefined("VARIABLES.contact")>#Trim(VARIABLES.contact)#, <CFELSE> ' ', </CFIF> --->
            <CFQUERYPARAM value="#Trim(sanitize(VARIABLES.firstname))#"  cfsqltype = "cf_sql_varchar" maxlength="40">,
            <CFQUERYPARAM value="#Trim(sanitize(VARIABLES.lastname))#"  cfsqltype = "cf_sql_varchar" maxlength="40">,
            '-', '-',   
        <!--- Dummy un/pw --->
            <CFQUERYPARAM value="#sanitize(VARIABLES.relationship_ID,true,true,false,true,false)#"  cfsqltype = "cf_sql_integer">,
            #CreateODBCDateTime(Now())#,
        #CreateODBCDateTime(Now())#,
            <CFQUERYPARAM value="#Trim(sanitize(VARIABLES.email))#" cfsqltype = "cf_sql_varchar" maxlength="40">,
4

3 に答える 3

4

この方法で実行している限り、「列」領域の各 s は、「値」セクションの必然的な CFIF と一致する必要があります。他の方法もありますが、必ずしもそれほど面倒ではありません。たとえば、次のことができます。

  1. いくつかの cfparams を使用してすべての列のデフォルトを設定して、「cfif」を使用する必要がないようにします。
  2. 複数の「よりクリーンな」クエリを作成する
  3. 全体をストアドプロシージャに移動し、そこにあるものを渡します.SPはロジックを心配します.
  4. 値の小さなサブセットを保存してから、cfif ロジックに基づいて「更新」します (それは好きではありません!)。

ご覧のとおり、それらにはすべてマイナス面があります。


1)の詳細

次のような面倒なことをする代わりに:

<CFIF isDefined("VARIABLES.specialty")> Specialty,</cfif>

クエリを開始する前に、次のように cfparam を使用して、必要なすべての変数の値があることを確認してください。

<Cfparam name="Specialty" default=""/>

(もちろん、専門分野のデフォルトは 0 か何でもかまいません)。

cfparam タグは、変数が存在するかどうかを確認し、存在しない場合は、指定したデフォルトで作成します。これは、変数が実際に存在することを「保証」できることを意味します。つまり、クエリで CFIF ステートメントを削除できます。

1 つの問題は、データベース内の NULL に関係しています。null に依存している場合 (専門分野が存在せず、列を null のままにしたい場合)、次のように「null」属性を cfqueryparam に追加する必要があります。

<CFQUERYPARAM 
  value="#Trim(sanitize(VARIABLES.specialty))#" 
  cfsqltype = "cf_sql_varchar" 
  null="#mynullfunction(variables.specialty)#"/>,

「mynullfunction」に注意してください。通常、値が空白またはゼロ (または私が定義したもの) の場合は単に YES を返し、入力されている場合は「いいえ」を返すユーティリティ UDF を作成します。

于 2012-07-03T22:09:48.843 に答える
1

最善の解決策は、データベースでデフォルトが設定されていない列に対して cfqueryparam の null 属性を使用することです。これは、INSERT INTO に条件を追加することを避け、列ごとに 1 行に VALUE を保持できることを意味します。列にデフォルトが存在する場合は、長いワインド条件を使用する必要があります。これは、最も単純で目立たない変更です。

Alias1 にはデータベースのデフォルトがあり、専門分野にはありません。

`   <cfset Variables.IsValidAlias1 = Variables.alias1 gt 100> 
    <cfquery name="addAgency" datasource="#REQUEST.dsn#">
        INSERT INTO agency (agency_name, 
                            specialty
                            <cfif Variables.IsValidAlias1>
                            , Alias1
                            </cfif>)
        VALUES (<cfqueryparam value="#Variables.agency_name#" cfsqltype="cf_sql_varchar" maxlength="150">, 
                <cfqueryparam value="#Variables.specialty#" cfsqltype="cf_sql_varchar" null="#StructKeyExists(Variables,'Specialty') EQ false#" maxlength="199">
                <cfif Variables.IsValidAlias1>
                    ,<cfqueryparam value="#Variables.Alias1#" cfsqltype="cf_sql_varchar" maxlength="199">
                </cfif>)
     </cfquery>`

余談ですが、 IsDefined の代わりに StructKeyExists() を使用する必要があります。前者の方が高速で読みやすいためです。このコードを関数内に配置し、その関数をコンポーネント内に配置して、再利用できるようにする必要があります。これは、CF6 以降を使用していることを前提としています。

于 2012-07-04T14:50:56.763 に答える
0

各フィールドに空の文字列のデフォルトを設定したり、存在しないキーの値を NULL に設定したりすることは避けます。その理由は、データベースの列に現在 (または将来的に) デフォルト値を設定する可能性があるためです。結果の NULL 値は明示的であるため、データベースのデフォルトを上書きします。空の文字列を渡した場合、これは有効かもしれませんが、デフォルトではそうではない可能性があります。

私の主なアドバイスは、条件が一貫していることを簡単に確認できるように、各列を 1 行にまとめることです。マークが言ったように、クエリの「値」領域とまったく同じ条件を「列」領域に含めるように注意する必要があります。

余談ですが、私は DataMgr という無料のツールを持っています。これを使用すると、ほとんどの単純なクエリでこの種のすべてを管理できます。

http://www.bryantwebconsulting.com/docs/datamgr/replace-sql-inserts-and-updates.cfm http://www.bryantwebconsulting.com/docs/datamgr/getting-started.cfm

ただし、重要なことは、条件文に一貫性を持たせ、そうでない場合でも明確になるようにクエリをフォーマットすることです。

于 2012-07-04T16:18:47.887 に答える