将数据类型十进制转换为十进制的 ColdFusion 错误
ColdFusion Error converting data type decimal to decimal
我在 CFStoredProc 中遇到了一个错误,每当我尝试向存储过程发送十进制值时,它就会导致崩溃。该过程只是将值插入 SQL table 中的 decimal(4,2) 列。如果我将十进制值硬编码为 cfprocparam 的值,则该过程有效。但是,如果从文件中读入该值,无论我如何确保数字格式正确,我总是会收到错误“将数据类型十进制转换为十进制时出错”。谁能看出我在这里做错了什么?
我的代码主要执行以下操作:
- 读取 CSV 文件并将其转换为查询
- 循环查询以将 CSV 数据读入变量
- 将这些变量作为 cfprocparams 发送到存储过程
我试过:
- 在将数字发送到存储过程之前使用 numberFormat() 格式化数字
- 在将数字发送到存储过程之前使用 decimalFormat() 格式化数字
- 使用自定义函数格式化数字,该函数在我们的应用程序的其他地方做同样的事情
- 在 cfprocparam
的 'value' 部分使用上述函数格式化数字
我尝试过的代码示例:
<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.
事实证明,传递给存储过程的值对于要插入的列的数据类型来说太大了。数据类型是 Decimal(3,2),我传递的值超过三位数。
解决方案是检查传递给存储过程的数字的大小,如果值太大则给用户一个错误。
感谢@Tomalak 的帮助!
我在 CFStoredProc 中遇到了一个错误,每当我尝试向存储过程发送十进制值时,它就会导致崩溃。该过程只是将值插入 SQL table 中的 decimal(4,2) 列。如果我将十进制值硬编码为 cfprocparam 的值,则该过程有效。但是,如果从文件中读入该值,无论我如何确保数字格式正确,我总是会收到错误“将数据类型十进制转换为十进制时出错”。谁能看出我在这里做错了什么?
我的代码主要执行以下操作:
- 读取 CSV 文件并将其转换为查询
- 循环查询以将 CSV 数据读入变量
- 将这些变量作为 cfprocparams 发送到存储过程
我试过:
- 在将数字发送到存储过程之前使用 numberFormat() 格式化数字
- 在将数字发送到存储过程之前使用 decimalFormat() 格式化数字
- 使用自定义函数格式化数字,该函数在我们的应用程序的其他地方做同样的事情
- 在 cfprocparam 的 'value' 部分使用上述函数格式化数字
我尝试过的代码示例:
<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.
事实证明,传递给存储过程的值对于要插入的列的数据类型来说太大了。数据类型是 Decimal(3,2),我传递的值超过三位数。
解决方案是检查传递给存储过程的数字的大小,如果值太大则给用户一个错误。
感谢@Tomalak 的帮助!