0

在.cFC文件中,使用CF函數和CFargument標記。在過去使用存儲過程的ColdFusion 10錯誤

<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; 

有光澤鎳的人誰可以告訴我爲什麼sp.execute()與消息

"Cannot find results key in structure. 

The specified key, results, does not exist in the structure." 

我用這個僞代碼中的許多吹起來,可倍,從來沒有這樣做過。我已連接到MSSQL Server 2012數據庫,CF Admin中的所有內容都是板球,其他SP正在正常工作。堆棧跟蹤甚至不包括我的任何代碼都O_O用C發生

錯誤:/ColdFusion10/cfusion/CustomTags/com/adobe/coldfusion/base.cfc:行491 由C調用:/ColdFusion10/cfusion/CustomTags/com/adobe/coldfusion/storedproc.cfc:線142從 調用//hq-devfs/development$/websites/myProject/cfc/mySOAPWSDLs.cfc:線123

如果我再嘗試粘貼,那麼SO炸燬了。 Google ...沒有幫助._。

+0

存儲過程是否從SSMS執行?如果是這樣,它是否使用和相關標籤運行? – 2014-10-31 19:29:45

+0

愚蠢的問題,但給定過程的名稱 - 它實際上是否返回結果集,即查詢對象? – Leigh 2014-10-31 19:36:32

+0

這實際上不是它的名字;我試圖避免在這裏給我的僱主放任何特別的東西。它所做的是採用參數,查找現有記錄,如果有,則更新它,否則插入。無論哪種方式,它應該返回受影響的行數,不是? – Janet 2014-10-31 19:42:27

回答

6

簡短回答:錯誤意味着您嘗試從存儲過程中檢索結果集,但實際上並未返回結果集。一個簡單的解決方案是將SELECT添加到過程的末尾,以便返回包含所需數據的結果集。然後你原來的代碼將工作:

SELECT @@ROWCOUNT AS NumOfRowsAffected; 

較長的答案: 您正在使用,addProcResult()的方法,是<cfprocresult>等同。它旨在捕獲從存儲過程返回的resultset。 (由於CF對屬性名稱的選擇很差,很多人認爲「resultset」意味着存儲過程的「結果」結構,但它們是兩個完全不同的東西)。 A「結果集合」是一個查詢對象」,在CF的說法。

雖然所有四(4)的初級SQL語句返回一些結果,不是所有的人返回一個‘查詢對象’

  • 只有SELECT語句生成一個「查詢對象」
  • INSERT/UPDATE/DELETE語句簡單地返回影響,他們沒有產生一個「查詢對象」的行數。

由於您的存儲過程edure執行INSERT,它不會生成「查詢對象」。因此,錯誤,當你試圖在這裏搶不存在查詢:

sp.addProcResult(name="results",resultset=1); 

簡單的解決方案是將SELECT語句添加到您的存儲過程的結束,所以它確實返回查詢對象。然後你的代碼將按預期工作。另外,我懷疑你實際上試圖抓住「結果」結構,但使用了錯誤的方法。相當於<cfstoredproc result="..">的是getPrefix()。儘管如此,這還不行。根據the docs,它不包含受影響的行數。可能是因爲存儲過程可以執行多個語句,每個語句都可能返回一個行數,因此不僅僅有一個返回值。