2009-05-08 43 views
1

フォームフィールドからColdFusionを使用してSQL Server MONEYフィールドに値を挿入しようとしています。金額が単価の場合、またはセントが12を超える場合は、インサートは正常に機能します。ColdFusion - フォームフィールドをSQL Serverに挿入する

しかし、発生したエラーに応じてセントの金額が12未満の場合、システムは金額を挿入前の日付形式に変換しているように見えます。そして、もちろん、私はMONEYフィールドに日付を挿入しようとしているので、間違っています。 (!)

CF_ERG_DECIMAL型のCFQUERYPARAMを使用しようとしましたが、動作しませんでした。どんな考えでも大変感謝しています。

はここでフォームのコードです:

<CFFORM ACTION="_execute_project_payment.cfm?action=Add" METHOD="post" NAME="FormX"> 
<CFOUTPUT> 
<INPUT TYPE="hidden" NAME="projectID" VALUE="#projectID#"> 
<TR> 
<TD CLASS="label" ALIGN="right" VALIGN="top">Payments:</TD> 

<TD> 

$<CFINPUT NAME="payment" TYPE="TEXT" VALIDATE="FLOAT" SIZE="15" REQUIRED="YES" MESSAGE="You must enter a payment amount.">&nbsp;&nbsp;&nbsp;Date: 


<CFINPUT TYPE="text" name="payment_date" id="payment_date" SIZE="12" VALIDATE="DATE" REQUIRED="YES" MESSAGE="You must enter a payment date."> 


<img src="cal_icon.gif" id="trigger_payment_date" 
style="cursor: pointer; border: 0px;" 
title="Date selector" 
onmouseover="this.style.background=’red’;" 
onmouseout="this.style.background=’’" /> 
<script type="text/javascript"> 
Calendar.setup({ 
inputField : "payment_date", 
ifFormat : "%m/%d/%Y", 
button : "trigger_payment_date", 
align : "Tl", 
singleClick : false 
}); 
</script> 


<INPUT TYPE="Submit" VALUE="Add"> 

<BR> 

</TD> 
</TR> 

</CFOUTPUT> 
</CFFORM> 

そして、ここで挿入です:

<CFSET paydateODBC = CreateODBCDate(FORM.payment_date)> 

<CFQUERY NAME="add_project_payment" DATASOURCE="#dsource#" USERNAME="#usern#" PASSWORD="#passw#"> 
INSERT INTO project_payments (
         projectID, 
         payment, 
         payment_date 
        ) 
      VALUES (
         #projectID#, 
         #FORM.Payment#, 
         #paydateODBC# 
        ) 
</CFQUERY> 

そして、ここでのお支払いと666.10を入力しようとすると、エラーになります。個人的に

[Macromedia][SQLServer JDBC Driver][SQLServer]Conversion failed when converting datetime from character string. 

The error occurred in C:\Websites\qrpqiy\toubltracker\_execute_project_payment.cfm: line 21 

19 :      #projectID#, 
20 :       #FORM.payment#, 
21 :       #paydateODBC# 
22 :     ) 
23 : </CFQUERY> 

SQLSTATE  22007 
SQL  INSERT INTO project_payments (projectID, payment, payment_date) VALUES (433, {d '0666-10-01'}, {d '2009-05-15'}) 
VENDORERRORCODE  241 
+0

私はあなたの問題が解決されるが、私はあなたがSQLインジェクション攻撃に自分自身を開放している他のすべてのクエリの入力とパラメータまたはのためでcfqueryparamを提案したいと思います参照してください。 – Jayson

答えて

2

、私は決してSQLでMoneyタイプを使用しません。 Decimalフィールドタイプを使用すると、より優れたコントロールが得られることがわかります。

+0

私は同じ挿入をDECIMALフィールドに入れようとしましたが、同じことが起こりました。私はCFがこの日付形式の変換を行っていると思います。私はそれを止める方法を知らないのです。 –

2
<cfqueryparam value="#theamount#" cfsqltype="cf_sql_money"> 

これは私が使用しているもので、問題は一度もありません。クエリとスタブデータを投稿することができれば、その原因をよりよく判断するのに役立ちます。

+0

私はそれを試みましたが、実際には事態を悪化させました。 666.10のように、エラーになる値を挿入しようとしたとき、CFQUERYPARAMは大量の負の数に変換しました。 CFは、挿入が試行される前に、日付形式にこの10進数の変換を行っているようです。 –

+0

あなたのフィールド名の問題を解決したので、コードを書くための最良の方法ですので、投票しています。 –

3

Adob​​eによれば、問題は自分のフィールド名でした。明らかにCFには、あなたが "payment_date"フィールドも含む日付として評価される "支払い"のようなフィールドを得ることができる、あいまいな古い関数があります。アー。私はフィールド名を変更し、今動作します。この上

Adob​​eのドキュメント: http://livedocs.adobe.com/coldfusion/8/htmldocs/help.html?content=validateData_10.html#1154690

+0

これは、逆です。 -1〜CF – DanSingerman

+0

これは奇妙なものです。それについてブログで確認してください。 –

+0

あなたはアドビによると、情報にリンクできますか? CF側かSQL Server側で問題がありますか? –