1

作成者が を使用していた 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);

私は正しい軌道に乗っていますか?誰でも助けてもらえますか?ありがとう

4

2 に答える 2

1

この場合、db.AddParameter は出力パラメーターを追加します。sproc 呼び出しから戻り値を取得しようとしていることを db クライアント ライブラリに知らせる必要があります。したがって、AddParameter の呼び出しです。db.AddInParameter は、パラメータ内のみであるパラメータを追加します。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();
}
于 2009-09-18T20:55:14.507 に答える
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);
...

ご覧のとおり、返されるパラメーターに明示的に割り当てるプロパティ方向があります。1 つ目は、変数「id」の値を取得し、ストアド プロシージャに渡されるパラメータです。

2 番目の値はストアド プロシージャによって返されるため、そのパラメーター値には値が割り当てられず、方向は次のように設定されます。"System.Data.ParameterDirection.Output"

于 2009-09-19T16:47:36.877 に答える