首页 > 解决方案 > ColdFusion错误将数据类型十进制转换为十进制

问题描述

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

我的代码基本上执行以下操作:

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

我试过了:

  1. 在将数字发送到存储过程之前使用 numberFormat() 格式化数字
  2. 在将数字发送到存储过程之前使用 decimalFormat() 格式化数字
  3. 使用自定义函数格式化数字,该函数在我们的应用程序的其他地方执行相同的操作
  4. 使用 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.

标签: sql-servercoldfusion

解决方案


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

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

感谢@Tomalak 的帮助!


推荐阅读