簡體   English   中英

從DbCommand對象轉換為OracleCommand對象

[英]Converting from DbCommand object to OracleCommand object

我已經在ASP.NET(C#)應用程序中繼承了一個函數,其中的作者使用了Microsoft.Practices.EnterpriseLibrary.Data library ,但有人要求我對其進行更改,以便它使用System.Data.OracleClient 此功能使用存儲過程形成數據庫。 itemNameopenDate是函數接受的字符串參數PKG_AUCTION_ITEMS.IsAuctionItem是存儲過程函數的名稱。

這是我收到的代碼:

    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是連接字符串)

    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);
        myCmd.Parameters.AddWithValue("ret", ???);
        myCmd.ExecuteNonQuery();
        result = myCmd.Parameters["ret"].Value.ToString();
    }

我不明白AddInParameter和AddParameter之間的區別是什么,以及這行的作用:

db.AddParameter(cmdDB, "ret", DbType.String, 2, ParameterDirection.ReturnValue, false, 0, 0, null, DataRowVersion.Current, null);

我在正確的軌道上嗎? 誰能幫忙嗎? 謝謝

在這種情況下,db.AddParameter添加一個輸出參數。 您需要讓數據庫客戶端庫知道您要從sproc調用中獲取返回值。 因此,調用AddParameter。 db.AddInParameter添加僅是參數中的參數。 在db.AddParameter的快捷方式中,使用ParameterDirection.Input。 有關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();
}

實際上,我們更明確地進行參數的配置,就像這樣

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"

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM