【问题标题】:ColdFusion: How to insert numbers( having a 'comma'(,)/ currently iserted as 0) from form fields into the databaseColdFusion:如何将表单字段中的数字(具有“逗号”(,)/当前插入为 0)插入数据库
【发布时间】:2010-01-30 02:54:01
【问题描述】:

45,234 这样的表单字段值将作为45234 插入到数据库中。当我尝试为45,234 插入时,它进入数据库的所有内容都是0。注意:- 我可以在SQL DB 中插入45.234as 45.234。

表单字段名为costOfShares,将插入到表ShareVales (SQL Server 2005) 中。我正在使用 CF8。

SQL

table:-ShareVales; field:-costOfShares; DataType:-float

ColdFusion(表单页面)

<li>
  <cfinput size="8" maxlength="20" name="costOfShares" 
    id="costOfShares" value="#share.GetcostOfShares()#">
</li>

Share.cfc:-

<cfcomponent> 
    <cfscript> Variables.CostOfShare </cfscript> 
<cffunction name="GetCostOfShare" returntype="numeric" access="public" output="false">         
   <cfscript> variables.CostOfShare; </cfscript>
</cffunction>

<cffunction name="SetCostOfShare" retuntype="void" access="public" output="false">    
   <cfargument name="costOfShare" type="string"  required="true">
      <cfscript> variables. costOfShare = arguments. costOfShare; </cfscript>
  </cffunction>
</cfcomponent> 

ColdFusion(查询页面)

  <cffunction>
    <cfargumnet>
    <cfquery …>
      INSERT INTO ShareVales(shareUnitId, costOfShares) 
      VALUES (
        <cfqueryparam cfsqltype="cf_sql_integer"
                      value="#arguments.share.GetshareUnitId()#">,
        <cfqueryparam cfsqltype="cf_sql_float"
                      value="#arguments.share.GetcostOfShares()#">);
    </cfquery>
</cffunction>

当我在查询编辑器中直接使用以下内容时:

INSERT into share(setCostOfShare)
values(Cast(replace('5,322,444',',','') as float))

成功了。在 ColdFusion 模板中使用 cfquery/cfqueryparam 时出错。

那么,当表单字段costOfShares包含逗号值时,如何插入45234

【问题讨论】:

    标签: sql coldfusion


    【解决方案1】:

    如果他们键入逗号,请先将其去掉,然后再尝试插入。

    【讨论】:

    • INSERT into share(setCostOfShare) values(Cast(replace('5,322,444',',','') as float)).........在数据库中是成功的-SQL-query editor....但错误是在coldfusion模板中使用cfquery/
    • 例如,在德国,逗号表示小数位的开始,因此您不能将其去掉。特别是因为 DB 字段是 float,这意味着小数位 很重要。将输入解析为 ColdFusion before INSERT 中的数字是唯一干净的方法。
    【解决方案2】:
    LSParseNumber("45,234", "French (standard)")
    

    或者如果“法语(标准)”已经是您的系统标准系统默认语言环境,只需使用:

    LSParseNumber("45,234")
    

    或者……

    <cfset setLocale("French (standard)")>
    <cfset value = LSParseNumber("45,234")>
    

    他们将返回 45.234(如果您想要 45234,请使用美国语言环境,请参阅文档!)

    我建议您将 costOfShares 存储为有效的 ColdFusion 数值(也就是使用 '.' 而不是 ','),并且只使用 LSNumberFormat() 或 LSLSCurrencyFormat() 在视图上显示值。这样,您甚至不必对数字进行 LSParse 分析,除非该数字是由用户创建的,并且他使用 ','。

    【讨论】:

    • 我可以使用......INSERT ....INTO....VALUES(...,);
    • 是的,当然...只要您的默认语言环境可以将逗号解码为十进制符号。如果没有,您必须先 setLocale(),或者将语言环境作为 LSParseNumber() 的第二个参数传入。
    • 问题是,45234从哪里来?我的意思是,如果您使用的是 Share.cfc 对象,当您调用 getCostOfShares() 时,它应该始终返回 45.234,原因是您可以有意义地使用该数值,或者在 CF 中进行额外计算,或者使用 保存该值.因此,如果您从表单中收到“45,234”,那么您应该在将其设置为 Share 对象之前或在 Share.setCostOfShare("45,234") 中使用 LSParseNumber()。如果要显示逗号,请在需要时在视图上使用 LSNumberFormat()。
    • ... 应该是 我以为你希望逗号原来是小数??? :S
    • 但更好的做法是使用 ,并确保 getCostOfShare() 方法返回有效的 CF 数值(也就是没有逗号)。
    【解决方案3】:

    大概数据类型是浮点数之类的。逗号不是浮点数中的有效字符(除非是欧洲语言环境)。您可能希望改为使用逗号从数据库中获取值(但不一定用逗号存储)。这可能意味着在 SELECT 期间使用 COVERT 函数:

    http://technet.microsoft.com/en-us/library/ms174450.aspx
    

    【讨论】:

    • 是的数据类型是浮点数。我想插入一个带逗号的数字。示例:- 当我以表格形式插入值 45,234(带逗号)时,SQL DB 中只填充了“0”。我可以在 INSERT 查询中使用 CAST()/CONVERT 吗?
    • 我认为部分困惑是您是否尝试提交欧式编号(如 3,5 或 1.003,14),或者您是否尝试使用逗号提交美国类型编号(即 1,000.00 或24,123.45)。如果你做后者,我认为这是不可能的。数据库以二进制格式存储数字,因此您无法存储逗号。相反,您的问题可能真的是“我如何将数字弄出来让它们看起来不错”,如果是这种情况,那么您需要在 SELECT 期间执行此操作以将浮点数转换为漂亮的字符串。
    • BTW 浮点数是可怕的数据类型,在进行计算时切勿使用它们。除非您喜欢舍入错误,否则请改用小数或数字。
    【解决方案4】:

    不确定这是否有帮助,但只需将替换放在 cfqueryparam 中。这样,它会将“已清理的版本”交给 SQL Server。

    CAST(<cfqueryparam cfsqltype="cf_sql_float"                                    
                       value="#REPLACE(arguments.share.GetcostOfShares()',',','')#"> AS FLOAT)
    

    或者,在您尝试查询之前让 CF 对变量运行替换并清理它。

    或者,让 CF 对变量运行替换并清理它,然后再将其作为参数传递。

    【讨论】:

    • 错误:- CFSQLTYPE CF_SQL_FLOAT 的无效数据 arguments.share.GetcostOfShares()。
    • "或者,让 CF 在你尝试查询之前对变量运行替换并清理它。或者,让 CF 在变量上运行替换并在你传递它之前清理它作为论据。”仅仅因为“复制和粘贴”不起作用并不意味着我的回答不好。
    • 我不会认为这是一个否决票(我假设亨利?) LSParsenumber 是为这种类型的操作设计的,是的,但是当无法转换值时它也会导致异常。替换因不替换任何东西而优雅地失败。我不建议在没有 try/catch 包装器的情况下使用 lsparsenumber。
    • 使用 Replace 传递的是“0”值而不是 4,123。尽管 4.123 的值会很好。
    猜你喜欢
    • 2016-06-22
    • 2023-03-11
    • 1970-01-01
    • 1970-01-01
    • 2011-02-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多