ColdFusion错误将数据类型十进制转换为十进制

Posted

技术标签:

【中文标题】ColdFusion错误将数据类型十进制转换为十进制【英文标题】:ColdFusion Error converting data type decimal to decimal 【发布时间】:2021-05-14 14:57:25 【问题描述】:

我在 CFStoredProc 中有一个错误,每当我尝试将十进制值发送到存储过程时,它都会导致崩溃。该过程只是将值插入到 SQL 表中的十进制 (4,2) 列中。如果我将一个十进制值硬编码为 cfprocparam 的值,则该过程有效。但是,如果从文件中读取该值,无论我如何确保数字格式正确,我总是会收到错误“将数据类型十进制转换为十进制时出错”。谁能看到我在这里做错了什么?

我的代码基本上做了以下事情:

    读取 CSV 文件并将其转换为查询 循环查询以将 CSV 数据读入变量 将这些变量作为 cfprocparams 发送到存储过程

我试过了:

    在将数字发送到存储过程之前使用 numberFormat() 格式化数字 在将数字发送到存储过程之前使用 decimalFormat() 格式化数字 使用自定义函数格式化数字,该函数在我们的应用程序的其他地方执行相同的操作 在 cfprocparam 的“值”部分使用上述函数格式化数字

我尝试过的代码示例:

<cfif structKeyExists(form, 'select_rHeight')>
     <cfset headerName = form['select_rHeight']>
     <cfset rHeight = csvQuery[headerName]>
     <cfset rHeight = numberFormat(rHeight, "__.00")>
</cfif>

<cfstoredproc procedure="name" datasource="name">
     <cfprocparam cfsqltype="CF_SQL_DECIMAL" dbvarname="@Height" scale="2" value=#rHeight# null="#NOT len(trim(rHeight))#" />
</cfstoredproc>

<cfif structKeyExists(form, 'select_rHeight')>
     <cfset headerName = form['select_rHeight']>
     <cfset rHeight = csvQuery[headerName]>
</cfif>

<cfstoredproc procedure="name" datasource="name">
     <cfprocparam cfsqltype="CF_SQL_DECIMAL" dbvarname="@Height" scale="2" value=#decimalFormat(rHeight)# null="#NOT len(trim(rHeight))#" />
</cfstoredproc>

在将变量发送到存储过程之前,我已经完成了变量的 cfdump 和输出,并且它的格式似乎总是正确的,但我总是收到以下错误消息: [Macromedia][SQLServer JDBC Driver][SQLServer]Error converting data type decimal to decimal.

【问题讨论】:

如果您使用CF_SQL_DOUBLE 而不是CF_SQL_DECIMALnumberFormat(rHeight, "0.00") 一起使用会发生什么? 我很困惑 - ColdFusion 是给你这个错误还是数据库? 感谢您的帮助 - 小数位数没有太多,但小数点左侧的值太大。我犯了一个菜鸟错误,认为小数(5,2)意味着小数点左边 5 位,右边 2 位。 另外:这就是为什么您应该在问题中包含您正在测试的数据/值。 @HDuck 您能否将该评论转换为答案?您也应该能够将其标记为已接受。 【参考方案1】:

事实证明,传递给存储过程的值对于插入它的列的数据类型来说太大了。数据类型是 Decimal(3,2),我传递的值超过三位数。

解决方案是检查传递给存储过程的数字的大小,如果值太大,则给用户一个错误。

感谢@Tomalak 的帮助!

【讨论】:

以上是关于ColdFusion错误将数据类型十进制转换为十进制的主要内容,如果未能解决你的问题,请参考以下文章

Spark 案例类 - 十进制类型编码器错误“无法从十进制向上转换”

将字符串转换为十进制 Oracle 数据库

将varchar转换为十进制棒球平均值

数据类型

如何通过SQL函数将7个字节的十六进制数据转换为十进制,找了一个函数转换四个字节的可以,7个就不行了

来自OPENJONS()的TSQL,具有显式架构:十进制(38,30)数据类型的空字符串