【问题标题】:ColdFusion - Inserting form field into SQL Server MONEYColdFusion - 将表单字段插入 SQL Server MONEY
【发布时间】:2009-05-08 14:14:24
【问题描述】:

我正在尝试使用 ColdFusion 将表单字段中的值插入 SQL Server MONEY 字段。如果金额只是美元,或者美分超过 12,则插入没问题。

但是如果美分金额小于 12,根据引发的错误,系统似乎在插入之前将金额转换为日期格式,而我没有要求这样做。然后,当然,它出错了,因为我试图在 MONEY 字段中插入一个日期。 (!)

我尝试使用类型为 CF_SQL_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

【问题讨论】:

  • 我看到您的问题已解决,但我想建议所有查询输入和参数使用 cfqueryparam,否则您将面临 SQL 注入攻击。

标签: sql-server coldfusion


【解决方案1】:

好吧,根据 Adob​​e 的说法,问题在于我的字段名称。显然,在 CF 中有一个晦涩的旧函数,当您还包含“payment_date”字段时,您可以将“付款”之类的字段作为日期进行评估。啊。我更改了字段名称,现在可以使用。

Adobe 在这方面的文档: http://livedocs.adobe.com/coldfusion/8/htmldocs/help.html?content=validateData_10.html#1154690

【讨论】:

  • 这很奇怪。一定要写博客。
  • 你说根据adobe,可以链接到资料吗?是CF端的问题还是sql server端的问题?
  • 这是有关此“功能”的 Adob​​e 信息。在旧版本的 CF 中,这个想法是进行服务器端验证。 livedocs.adobe.com/coldfusion/8/htmldocs/…
  • @HermanD:这个功能今天仍然存在的原因是为了向后兼容。 Allaire、Macromedia 和现在的 Adob​​e 都竭尽全力保持向后兼容性。在大多数情况下,您可以使用针对 ColdFusion 1.0 编写的代码,它现在可以针对 8.0(或现在正在进行的 9.0 测试版)运行。我认为这里没有人可以声称他们从未在产品生命周期的早期做出错误的设计决定,然后不得不忍受它。让他无罪投下第一块石头。
  • @Adam J. Blust:您应该将评论中的链接编辑到您的答案中,并确保接受它作为正确答案。
【解决方案2】:

就个人而言,我从不在 SQL 中使用 Money 类型。如果我使用 Decimal 字段类型,我发现我有更好的控制程度。

【讨论】:

  • 我尝试在 DECIMAL 字段中执行相同的插入操作,但发生了同样的事情。我觉得CF在做这个日期格式转换,不知道怎么阻止。
【解决方案3】:
<cfqueryparam value="#theamount#" cfsqltype="cf_sql_money">

这就是我使用的,我从来没有遇到过问题。如果您可以发布您的查询和一些存根数据,这将有助于更好地确定原因。

【讨论】:

  • 我试过了,它实际上让事情变得更糟。当我试图插入一个会出错的值时——比如 666.10——CFQUERYPARAM 把它变成了一个巨大的负数。 CF 似乎在尝试插入之前就将小数转换为日期格式。
  • 不管怎样,既然您已经解决了字段名称问题,这是编写代码的最佳方式,所以我投票赞成。
猜你喜欢
  • 2011-10-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多