2009-09-18 116 views
1

我在ASP.NET(C#)應用程序中繼承了一個函數,其中作者使用Microsoft.Practices.EnterpriseLibrary.Data library,但我被要求更改它以便它使用System.Data.OracleClient。這個函數使用一個存儲過程形式的數據庫。 itemNameopenDate是函數接受的字符串參數。PKG_AUCTION_ITEMS.IsAuctionItem是存儲過程函數名稱。從DbCommand對象轉換爲OracleCommand對象

下面是我收到的代碼:

string result = String.Empty; 

    Database db = DatabaseFactory.CreateDatabase("OraData"); 
    using (DbCommand cmdDB = db.GetStoredProcCommand("PKG_AUCTION_ITEMS.IsAuctionItem")) 
    { 
     db.AddInParameter(cmdDB, "vItemName", DbType.String, itemName); 
     db.AddInParameter(cmdDB, "vOpenDate", DbType.String, openDate); 
     db.AddParameter(cmdDB, "ret", DbType.String, 2, ParameterDirection.ReturnValue, false, 0, 0, null, DataRowVersion.Current, null); 


     db.ExecuteNonQuery(cmdDB); 
     result = cmdDB.Parameters["ret"].Value.ToString(); 
    } 

這裏是我的代碼:(connstr是連接字符串)

​​

我不明白AddInParameter和AddParameter之間的區別是什麼,以及此行的功能:

​​

我在右邊tr ACK?任何人都可以幫忙嗎? 謝謝

+0

你爲什麼會被要求去改變它?你應該已經能夠改變配置文件來使用Oracle。 – CAbbott 2009-09-18 20:37:11

+0

Microsoft.Practice庫不是這裏使用的標準庫,所以構建引擎沒有它。因此,該項目無法在服務器上構建。 – zohair 2009-09-18 20:50:30

+0

您可能必須在您的Web服務器上安裝Enterprise Library才能使其工作。 – Juri 2009-09-19 16:48:50

回答

1

在這種情況下,db.AddParameter會添加一個輸出參數。您需要讓數據庫客戶端庫知道您正在尋求從sproc調用返回的返回值。因此調用AddParameter。 db.AddInParameter添加一個參數,它只是一個in-parameter。在這是使用ParameterDirection.Input的db.AddParameter的快捷方式。有關AddInParameter與AddParameter的討論,請參閱http://blogs.x2line.com/al/archive/2006/03/25/1579.aspx

同樣,使用OracleClient時,AddWithValue就像AddInParameter--當您已經知道該值時用於輸入參數的快捷方式。由於返回值根據定義是輸出參數,因此不能使用AddWithValue。你需要使用Parameters.Add()來代替。

現在,回到您的主要問題:使用OracleClient的等效代碼是什麼?這件事情是這樣的:

string result = String.Empty; 
OracleConnection conn = new OracleConnection(connstr); 
OracleCommand cmd = new OracleCommand("PKG_AUCTION_ITEMS.IsAuctionItem",conn); 
myCmd.CommandType = CommandType.StoredProcedure; 

using (myCmd) 
{ 
    myCmd.Parameters.AddWithValue("vItemName", itemName); 
    myCmd.Parameters.AddWithValue("vOpenDate", openDate); 

    // depending on whether you're using Microsoft's or Oracle's ODP, you 
    // may need to use OracleType.Varchar instead of OracleDbType.Varchar2. 
    // See http://forums.asp.net/t/1002097.aspx for more details. 
    OracleParameter retval = new OracleParameter("ret",OracleDbType.Varchar2,2); 
    retval.Direction = ParameterDirection.ReturnValue; 
    myCmd.Parameters.Add(retval); 

    myCmd.ExecuteNonQuery(); 
    result = myCmd.Parameters["ret"].Value.ToString(); 
} 
+0

那麼,如果我使用的是「OracleClient」,那麼AddInParameter會相當於什麼呢? – zohair 2009-09-19 09:10:36

+0

我會單獨創建參數,設置ParameterDirection.ReturnValue,然後使用Parameters.Add()。請參閱上文 - 我編輯答案以顯示代碼示例。 – 2009-09-19 17:04:56

+0

謝謝!這完美的作品! – zohair 2009-09-21 14:09:34

0

我們實際上做的參數更明確的配置,這樣的事情

System.Data.OracleClient.OracleCommand command = new System.Data.OracleClient.OracleCommand("PACKAGE_NAME.STORED_NAME"); 
command.CommandType = System.Data.CommandType.StoredProcedure; 

System.Data.OracleClient.OracleParameter param; 
param = new System.Data.OracleClient.OracleParameter("PARAM_NAME_ID", System.Data.OracleClient.OracleType.Number); 
param.Value = id; 
command.Parameters.Add(param); 

param = new System.Data.OracleClient.OracleParameter("PARAM_NAME_RETURN_COUNT", System.Data.OracleClient.OracleType.Number); 
param.Direction = System.Data.ParameterDirection.Output; 
command.Parameters.Add(param); 
... 

你看,有我們明確指定爲是該參數的屬性方向被退回。第一個獲取變量「id」的值並且是傳遞給存儲過程的參數。

:第二個是由存儲過程返回,因此沒有值分配給該參數值和方向設置爲"System.Data.ParameterDirection.Output"