Sql server 存储过程的ColdFusion 10错误
在.CFC文件中,在CFfunction内,使用CFargument标记Sql server 存储过程的ColdFusion 10错误,sql-server,stored-procedures,coldfusion,sql-server-2012,coldfusion-10,Sql Server,Stored Procedures,Coldfusion,Sql Server 2012,Coldfusion 10,在.CFC文件中,在CFfunction内,使用CFargument标记 <cfscript> var sp=new storedproc(); sp.setDatasource(variables.datasource); sp.setProcedure("storedProcedure_INSERT"); sp.addParam(cfsqltype="cf_sql_integer",type="in",val
<cfscript>
var sp=new storedproc();
sp.setDatasource(variables.datasource);
sp.setProcedure("storedProcedure_INSERT");
sp.addParam(cfsqltype="cf_sql_integer",type="in",value=arguments.one);
sp.addParam(cfsqltype="cf_sql_integer",type="in",value=arguments.two);
sp.addParam(cfsqltype="cf_sql_integer",type="in",value=arguments.three);
sp.addParam(cfsqltype="cf_sql_integer",type="in",value=arguments.four);
sp.addProcResult(name="results",resultset=1);
//writeDump(sp);break; //This dump is reached
var spObj=sp.execute(); //blows up here; this is never reached
writeDump(spObj);break; //This is never reached, either.
var spResults=spObj.getProcResultSets().results;
我曾经多次使用过这个psuedo代码,在过去的5个月里,从来没有让它这么做过。我已连接到MSSQL Server 2012 DB,CF Admin中的一切都正常,其他SP工作正常。堆栈跟踪甚至根本不包括我的任何代码
错误出现在C:/ColdFusion10/cfusion/CustomTags/com/adobe/coldfusion/base.cfc:第491行
从C:/ColdFusion10/cfusion/CustomTags/com/adobe/coldfusion/storedproc.cfc调用:第142行
从//总部devfs/development$/websites/myProject/cfc/mysoapwsdl.cfc调用:第123行
如果我再尝试粘贴这些东西,就会爆炸。Google…没有什么帮助。简短回答:该错误表示您正在尝试从存储过程中检索结果集,而实际上它并没有返回结果集。一个简单的解决方案是在过程的末尾添加一个
SELECT
,这样它将返回一个包含所需数据的结果集。然后,您的原始代码将正常工作:
SELECT @@ROWCOUNT AS NumOfRowsAffected;
更长的回答:
您正在使用的方法,addProclesult()
,相当于。它旨在捕获从存储过程返回的数据。(由于CF对属性名称的选择不当,许多人认为“resultset”意味着storedproc“result”结构,但它们是两个完全不同的东西)。用CF的说法,“resultset”是一个查询对象
虽然所有四(4)条主sql语句都返回一些结果,但并非所有语句都返回“查询对象”
- 只有
语句才能生成“查询对象”SELECT
语句只返回受影响的行数。它们不生成“查询对象”INSERT/UPDATE/DELETE
插入操作
,因此它不会生成“查询对象”。因此,尝试在此处获取不存在的查询时会出现错误:
sp.addProcResult(name="results",resultset=1);
简单的解决方案是在存储过程的末尾添加一个SELECT
语句,这样它就返回了一个查询对象。然后代码就可以按预期工作了
顺便说一句,我怀疑您实际上试图获取“result”结构,但使用了错误的方法。尽管这在这里无论如何都不起作用。根据,它不包含受影响的行数。可能是因为存储过程可以执行多个语句,每个语句都可能返回一个行计数,因此不只是返回一个值。简短回答:此错误表示您正在尝试重试从存储过程中删除一个结果集,而实际上它并没有返回结果集。一个简单的解决方案是在过程末尾添加一个
SELECT
,这样它将返回一个包含所需数据的结果集。然后,您的原始代码将起作用:
SELECT @@ROWCOUNT AS NumOfRowsAffected;
更长的回答:
您正在使用的方法,addProclesult()
,相当于。它旨在捕获从存储过程返回的数据。(由于CF的属性名称选择不当,许多人认为“resultset”意味着storedproc“result”结构,但它们是两个完全不同的东西。)“resultset”是一个查询对象,用CF的说法
虽然所有四(4)条主sql语句都返回一些结果,但并非所有语句都返回“查询对象”
- 只有
语句才能生成“查询对象”SELECT
语句只返回受影响的行数。它们不生成“查询对象”INSERT/UPDATE/DELETE
sp.addProcResult(name="results",resultset=1);
简单的解决方案是在存储过程的末尾添加一个SELECT
语句,以便它返回一个查询对象。然后您的代码将按预期工作
顺便说一句,我怀疑您实际上是在试图获取“结果”结构,但使用了错误的方法。
的等价物是getPrefix()
。尽管这在这里无论如何都行不通。根据,它不包含受影响的行数。可能是因为存储过程可以执行多个语句,每个语句都可能返回一个行计数,所以不只是返回一个值 存储过程是否从SSMS执行?如果是这样,它是否使用和关联的标记运行?愚蠢的问题,但给定过程的名称-它是否实际返回resultset ie查询对象?return不会生成“查询”ie resultset。只有SELECT语句可以执行此操作。听起来你要找的东西相当于
,我相信应该是spObj.getPrefix()
。但是,我不知道标记或cfscript版本是否包含“受影响的行数”。可能不会,因为存储过程可以执行多个语句,每个语句都可能生成一个计数。因此我怀疑“结果”或“前缀”中没有包含键。@Janet-将返回更改为选择@ROWCOUNT作为numrowsimpacted
,您的原始代码将正常工作。很好!我将写一个更完整的解释作为回答。主要是因为a)注释是临时的,可以删除;b)我认为理解它为什么不能与insert一起工作可能会对未来的读者有所帮助。存储过程是否从ssm执行?如果是这样,它是否使用和关联的标记运行?愚蠢的问题,但给定过程的名称-它是否实际返回resultset ie查询对象?return不会生成“查询”ie resultset。只有SELECT语句可以执行此操作。听起来你要找的东西相当于
,我相信应该是spObj.getPrefix()
。但是,我不知道标签或cfscript版本是否包含“numb”