2009-05-08 5 views
1

J'essaie d'insérer une valeur d'un champ de formulaire dans un champ SQL Server MONEY à l'aide de ColdFusion. Si le montant est juste en dollars, ou si les cents sont plus de 12, l'insertion se passe bien.ColdFusion - Insertion d'un champ de formulaire dans SQL Server MONEY

Mais si le montant en cents est inférieur à 12, en fonction de l'erreur qui est lancée, le système semble convertir le montant en argent dans un format de date avant l'insertion, sans que je le demande. Et puis, bien sûr, il y a des erreurs, parce que j'essaie d'insérer une date dans un champ MONEY. (!)

J'ai essayé d'utiliser CFQUERYPARAM avec le type CF_SQL_DECIMAL, mais cela n'a pas fonctionné. Toutes les pensées seraient grandement appréciées.

est ici le code de formulaire:

<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> 

Et voici l'insert:

<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> 

Et voici l'erreur, en essayant d'entrer 666,10 comme le paiement:

[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

Je vois votre problème est résolu, mais je voudrais suggérer cfqueryparam pour toutes les entrées et paramètres de requête ou bien vous vous exposez à des attaques par injection SQL. – Jayson

Répondre

2

Personnellement, Je n'utilise jamais le type Money en SQL. Je trouve que j'ai un meilleur degré de contrôle si j'utilise le type de champ Decimal.

+0

J'ai essayé de faire le même insert dans un champ DECIMAL, et la même chose s'est produite. Je pense que CF fait cette conversion de format de date, et je ne sais pas comment l'arrêter. –

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

c'est ce que j'utilise et je n'ai jamais eu de problème. Si vous pouvez poster votre requête et quelques données de stub, cela aidera à mieux déterminer la cause.

+0

J'ai essayé ça, et ça a vraiment empiré les choses. Quand j'ai essayé d'insérer une valeur qui ferait une erreur - comme 666.10 - le CFQUERYPARAM l'a transformé en un nombre négatif massif. Il semble que CF effectue cette conversion de la décimale en un format de date avant même que l'insertion ne soit tentée. –

+0

Pour ce que ça vaut, maintenant que vous avez résolu votre problème de nom de domaine, c'est la meilleure façon d'écrire votre code, alors je suis en train de voter. –

3

Eh bien, selon Adobe, le problème était mes noms de domaine. Apparemment dans CF il y a une vieille fonction obscure que vous pouvez obtenir un champ comme "paiement" pour être évalué comme une date où vous incluez également un champ "payment_date". Argh. J'ai changé les noms des champs, et ça marche maintenant.

docs d'Adobe sur ce point: http://livedocs.adobe.com/coldfusion/8/htmldocs/help.html?content=validateData_10.html#1154690

+0

C'est pervers. -1 à CF – DanSingerman

+0

C'est étrange. Assurez-vous de bloguer à ce sujet. –

+0

vous dites selon adobe, pouvez-vous lier à l'information? Est-ce un problème du côté des FC ou du côté du serveur SQL? –