2016-10-06 11 views
1

参照カーソルの出力パラメータを持つストアドプロシージャがOracleデータベースにあるとします。OracleRefereceCursorはデータベースからどのようにデータを取得しますか?

私は以下のようにDBからデータを取得しようとしていますODP.Netを使用して.NETから

(私はhttp://www.oracle.com/technetwork/articles/dotnet/williams-refcursors-092375.htmlからこれをとっている)

OracleCommand cmd = new OracleCommand("otn_ref_cursor.get_emp_info", con); 
    cmd.CommandType = CommandType.StoredProcedure; 

    // create parameter object for the cursor 
    OracleParameter p_refcursor = new OracleParameter(); 

    // this is vital to set when using ref cursors 
    p_refcursor.OracleDbType = OracleDbType.RefCursor; 

    // this is a function return value so we must indicate that fact 
    p_refcursor.Direction = ParameterDirection.ReturnValue; 

    // add the parameter to the collection 
    cmd.Parameters.Add(p_refcursor); 

    // create a data adapter to use with the data set 
    OracleDataAdapter da = new OracleDataAdapter(cmd); 

    // create the data set 
    DataSet ds = new DataSet(); 

    // fill the data set 
    da.Fill(ds); 

どのデータセットがレコードを埋めるのですか?一度に1つのレコードを取得するためにデータベースサーバーへの1回のラウンドトリップを行いますか?

は、それは私がDBへの各行ごとに1往復を行いますDataReaderを使用してのアプローチは、私の理解が正しいと思い

OracleDataReader dr = cmd.ExecuteReader(); 
while (reader.Read()) 
{ 
    //Do Something 
} 

と同じですか?

+1

データベースへの各ラウンドトリップでフェッチされるデータの量は、特定のバイト数であるフェッチサイズによって制御されます。私はデフォルトのサイズを忘れています。これを制御するには、FetchSizeをRowsizeの倍数に設定します。 ODP.NETはデータをフェッチするまでデータをキャッシュします。 –

+0

ありがとうございます@ChristianShay、それはデータを取得するためにDBへの往復回数が多すぎるという懸念に対応しています。 –

+0

私は先に進み、それを答えとして加えました。 –

答えて

0

データベースへの各ラウンドトリップでフェッチされるデータの量は、特定のバイト数であるフェッチサイズによって制御されます。私はデフォルトのサイズを忘れています。これを制御するには、FetchSizeをRowsizeの倍数に設定します。 ODP.NETはデータをフェッチするまでデータをキャッシュします。

関連する問題