2010-06-30 85 views
2

連接到SQL Server 2005所以我通過ActiveRecord的 - SQLSERVER適配器連接到SQL Server 2005從我的Rails應用程序時,Rails中執行SQL查詢。通過ActiveRecord的 - SQLSERVER適配器

我能夠做

Mymodel.execute_procedure("thisProcedure", param1, param2) 

執行存儲的特效,但我有有我有麻煩一個SQL INOUT變量存儲的過程。我執行它,我沒有看到該變量返回。

所以現在我想只是執行一些原始的SQL語句,如

declare @thisVar int 
EXEC thatProcedure 1, 1, @thisVar = @thisVar output 
print @thisVar 

當我做

sql = "declare @thisVar int 
EXEC thatProcedure 1, 1, @thisVar = @thisVar output 
print @thisVar" 

foo = Mymodel.connection.execute(sql) 

我沒有得到任何錯誤,一切看起來成功。我找回具有DBI :: StatementHandle類的foo。我如何真正看到來自SQL的響應?

在此先感謝!

回答

4

自從我進入DBI以來已經有一段時間了,我們讓存儲過程支持ORM。要從StatementHandle對象獲取數據,您需要發出一個fetch all。這應該包含所有返回值/輸出參數以及結果集(如果適用)作爲數組。這是dbi版本.4.1,我相信它是使用sqlserver適配器的最後一個版本。

sql = "declare @thisVar int 
EXEC thatProcedure 1, 1, @thisVar = @thisVar output 
print @thisVar" 

foo = Mymodel.connection.execute(sql) 

result_array = foo.fetch_all 

然後你可以遍歷結果數組。

這裏是DBI文檔http://ruby-dbi.rubyforge.org/rdoc/index.html

你可能也想看看新的ActiveRecord - SQLSERVER適配器。它完全消除了DBI,但不確定它如何處理SP。

http://github.com/rails-sqlserver/2000-2005-adapter

我的建議,有什麼值得注意的是,混合奧姆斯和存儲過程是非常困難的,因爲你是分裂的兩層之間的業務邏輯和它變得越來越難以管理。

祝你好運!

+0

感謝您的信息! 哪裏去定義? 我試過foo.fetch_all,我得到「DBI :: InterfaceError:語句已經關閉!」 – Corey 2010-06-30 20:40:14

+0

真的,對不起。當我寫這段代碼的時候,看着兩年前的代碼,......正如你懷疑的那樣躲在那裏 - sth = foo。我承認,當我不得不專門處理存儲過程時,我繞過了AR,因爲我還在使用Rails「熟悉」。另一個選擇可能是讓存儲過程返回參數作爲結果集「SELECT @output_parameter as somevalue」。那麼至少你正在處理AR可以處理的事情。 – 2010-06-30 21:07:26

相關問題