Преобразование из объекта DbCommand в объект OracleCommand - PullRequest
1 голос
/ 19 сентября 2009

Я унаследовал функцию в приложении ASP.NET (C #), где автор использовал Microsoft.Practices.EnterpriseLibrary.Data library, но меня попросили изменить его, чтобы он использовал System.Data.OracleClient. Эта функция использует хранимую процедуру из базы данных. itemName и openDate - строковые параметры, которые принимает функция. 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);

Я на правильном пути? Может кто-нибудь, пожалуйста, помогите? Спасибо

Ответы [ 2 ]

1 голос
/ 19 сентября 2009

db.AddParameter добавляет выходной параметр в этом случае. Вам нужно сообщить клиентской библиотеке db, что вы хотите получить возвращаемое значение из вызова sproc. Отсюда и вызов AddParameter. db.AddInParameter добавляет параметр, который является только внутренним параметром. В Это ярлык для db.AddParameter с использованием ParameterDirection.Input. См. http://blogs.x2line.com/al/archive/2006/03/25/1579.aspx для обсуждения AddInParameter и AddParameter.

Точно так же, используя 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 голосов
/ 19 сентября 2009

На самом деле мы настраиваем параметры более явно, что-то вроде этого

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» и является параметром, который передается в хранимую процедуру.

2-й возвращается хранимой процедурой, поэтому этому значению параметра не присваивается значение, а направление устанавливается на "System.Data.ParameterDirection.Output"

...