次の方法で共有


OracleDataAdapter クラス

メモ : この名前空間、クラス、およびメンバは、.NET Framework Version 1.1 だけでサポートされています。

DataSet へのデータの格納およびデータベースの更新に使用される、一連のデータ コマンドおよびデータベース接続を表します。このクラスは継承できません。

この型のすべてのメンバの一覧については、OracleDataAdapter メンバ を参照してください。

System.Object
   System.MarshalByRefObject
      System.ComponentModel.Component
         System.Data.Common.DataAdapter
            System.Data.Common.DbDataAdapter
               System.Data.OracleClient.OracleDataAdapter

NotInheritable Public Class OracleDataAdapter
   Inherits DbDataAdapter
   Implements IDbDataAdapter
[C#]
public sealed class OracleDataAdapter : DbDataAdapter,
   IDbDataAdapter
[C++]
public __gc __sealed class OracleDataAdapter : public
   DbDataAdapter, IDbDataAdapter
[JScript]
public class OracleDataAdapter extends DbDataAdapter implements
   IDbDataAdapter

スレッドセーフ

この型の public static (Visual Basicでは Shared) のすべてのメンバは、マルチスレッド操作で安全に使用できます。インスタンスのメンバの場合は、スレッドセーフであるとは限りません。

解説

OracleDataAdapter は、 DataSet とデータベースの間でデータを取得および保存するための、ブリッジの役割を果たします。 OracleDataAdapter は、このブリッジを提供するために、データベース内のデータを DataSet に読み込む Fill 、および DataSet での変更をデータベースに送り返す Update を使用します。

OracleDataAdapter は、 DataSet にデータを読み込むときに、返されたデータを格納するテーブルおよび列が存在しない場合は、それらを作成します。ただし、 MissingSchemaAction プロパティを AddWithKey に設定しない限り、暗黙的に作成されたスキーマには主キー情報は設定されません。 DataSet にデータを格納する前に、 FillSchema を使用して、主キー情報を含むスキーマを OracleDataAdapter に作成させることもできます。詳細については、「 DataSet への既存の制約の追加 」を参照してください。

OracleDataAdapter には、データの読み込みと更新を効率的に行うために、 SelectCommandInsertCommandDeleteCommandUpdateCommandTableMappings の各プロパティも用意されています。

.NET Framework Data Provider for Oracle は、バッチ SQL ステートメントをサポートしません。ただし、複数の REF CURSOR 出力パラメータを使用して、各 DataTableDataSet にデータを格納できます。パラメータを定義し、定義したパラメータを出力パラメータとしてマークし、 REF CURSOR データ型であることを示す必要があります。 OracleDataAdapter にストアド プロシージャへの REF CURSOR パラメータが格納されている場合、 Update メソッドは使用できません。Oracle では SQL ステートメントの実行時にテーブル名と列名を判別するために必要な情報が提供されないためです。次の C# の例は、このストアド プロシージャが既に作成されていることを前提としています。

create or replace package sp_pkg as
      type refCursorxx is ref cursor;
procedure getdata(a1 out refCursorxx, a2 out refCursorxx);
end;
create or replace package body sp_pkg as
       procedure getdata(a1 in number, a2 out refCursorxx) is
       begin
            open a1 for select * from emp;
            open a2 for select * from dept;
            end getdata;
       end;

ストアド プロシージャを使用してテーブルと列の情報を取得する C# の例を次に示します。

 
OracleConnection conn = new OracleConnection("Data Source=Oracle8i;Integrated Security=yes");
Conn.Open;
OracleCommand cmd = conn.CreateCommand();
cmd.CommandText = "sp_pkg.getdata";
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.Add(new OracleParameter("a1", OracleType.Cursor)).Direction = ParameterDirection.Output;
cmd.Parameters.Add(new OracleParameter("a2", OracleType.Cursor)).Direction = ParameterDirection.Output;
DataSet ds = new DataSet();
OracleDataAdapter adapter = new OracleDataAdapter(cmd);
adapter.Fill(ds);

OracleDataAdapter で、Oracle の REF CURSOR を使用して DataSet にデータを格納する Visual Basic の例を次に示します。この例では、Oracle の Scott/Tiger スキーマで定義されたテーブルを使用し、次の PL/SQL パッケージとパッケージ本体を必要とします。例で使用するために、これらをサーバー側で作成する必要があります。

Oracle サーバーで、次の Oracle パッケージを作成します。

CREATE OR REPLACE PACKAGE CURSPKG AS 
    TYPE T_CURSOR IS REF CURSOR; 
    PROCEDURE OPEN_ONE_CURSOR (N_EMPNO IN NUMBER, 
                               IO_CURSOR IN OUT T_CURSOR); 
    PROCEDURE OPEN_TWO_CURSORS (EMPCURSOR OUT T_CURSOR, 
                                DEPTCURSOR OUT T_CURSOR);
END CURSPKG;
/

Oracle サーバーで、次の Oracle パッケージ本体を作成します。

CREATE OR REPLACE PACKAGE BODY CURSPKG AS
    PROCEDURE OPEN_ONE_CURSOR (N_EMPNO IN NUMBER,
                               IO_CURSOR IN OUT T_CURSOR)
    IS 
        V_CURSOR T_CURSOR; 
    BEGIN s 
        THEN
             OPEN V_CURSOR FOR 
             SELECT EMP.EMPNO, EMP.ENAME, DEPT.DEPTNO, DEPT.DNAME 
                  FROM EMP, DEPT 
                  WHERE EMP.DEPTNO = DEPT.DEPTNO 
                  AND EMP.EMPNO = N_EMPNO;
        ELSE 
             OPEN V_CURSOR FOR 
             SELECT EMP.EMPNO, EMP.ENAME, DEPT.DEPTNO, DEPT.DNAME 
                  FROM EMP, DEPT 
                  WHERE EMP.DEPTNO = DEPT.DEPTNO;
        END IF;
        IO_CURSOR := V_CURSOR; 
    END OPEN_ONE_CURSOR; 
    PROCEDURE OPEN_TWO_CURSORS (EMPCURSOR OUT T_CURSOR,
                                DEPTCURSOR OUT T_CURSOR)
    IS 
        V_CURSOR1 T_CURSOR; 
        V_CURSOR2 T_CURSOR; 
    BEGIN 
        OPEN V_CURSOR1 FOR SELECT * FROM EMP;
        OPEN V_CURSOR2 FOR SELECT * FROM DEPT;
        EMPCURSOR  := V_CURSOR1; 
        DEPTCURSOR := V_CURSOR2; 
    END OPEN_TWO_CURSORS; 
END CURSPKG;
/

この Visual Basic の例では、2 つの REF CURSOR パラメータを返すストアド プロシージャを実行し、返された行のデータを DataSet に格納します。

 
Private Sub Button1_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles Button1.Click
Private Sub Button1_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles Button1.Click
    Dim connString As New String("Data Source=Oracle8i;Integrated Security=yes")
    Dim ds As New DataSet()
    Dim conn As New OracleConnection(connString)
    Dim cmd As New OracleCommand()
    cmd.Connection = conn
    cmd.CommandText = "CURSPKG.OPEN_TWO_CURSORS"
    cmd.CommandType = CommandType.StoredProcedure
    cmd.Parameters.Add(New OracleParameter("EMPCURSOR", OracleType.Cursor)).Direction = ParameterDirection.Output
    cmd.Parameters.Add(New OracleParameter("DEPTCURSOR", OracleType.Cursor)).Direction = ParameterDirection.Output
    Dim da As New OracleDataAdapter(cmd)
    Try
        da.Fill(ds)
    Catch Myex As Exception
        MessageBox.Show(Myex.Message.ToString)
    End Try
    ds.Relations.Add("EmpDept", ds.Tables(0).Columns("Deptno"), ds.Tables(1).Columns("Deptno"), False)
    DataGrid1.DataSource = ds.Tables(0)

OracleDataAdapter を使用して Fill または FillSchema 操作を実行すると、 DataColumn.ReadOnly プロパティは、列が更新できるかどうかに関係なく、常に false を返します。Oracle サーバーからはこの情報が返されないためです。

使用例

[Visual Basic, C#, C++] OracleCommandOracleDataAdapter 、および OracleConnection を使用して、Access データベースからレコードを選択し、選択した行を DataSet に格納する例を次に示します。この例では、続いて、データを格納した DataSet を返します。このメソッドには、初期化済みの DataSet 、接続文字列、および SQL SELECT ステートメントのクエリ文字列が渡されます。

 
Public Function SelectOracleSrvRows(dataSet As DataSet, connection As String, query As String) As DataSet
    Dim conn As New OracleConnection(connection)
    Dim adapter As New OracleDataAdapter()
    adapter.SelectCommand = new OracleCommand(query, conn)
    adapter.Fill(dataset)
    Return dataset
End Function

[C#] 
public DataSet SelectOracleSrvRows(DataSet dataset,string connection,string query) 
{
    OracleConnection conn = new OracleConnection(connection);
    OracleDataAdapter adapter = new OracleDataAdapter();
    adapter.SelectCommand = new OracleCommand(query, conn);
    adapter.Fill(dataset);
    return dataset;
}


[C++] 
public:
DataSet* SelectOracleSrvRows(DataSet* dataset,String* connection,String* query) 
{
    OracleConnection* conn = new OracleConnection(connection);
    OracleDataAdapter* adapter = new OracleDataAdapter();
    adapter->SelectCommand = new OracleCommand(query, conn);
    adapter->Fill(dataset);
    return dataset;
}

[JScript] JScript のサンプルはありません。Visual Basic、C#、および C++ のサンプルを表示するには、このページの左上隅にある言語のフィルタ ボタン 言語のフィルタ をクリックします。

必要条件

名前空間: System.Data.OracleClient

プラットフォーム: Windows 98, Windows NT 4.0, Windows Millennium Edition, Windows 2000, Windows XP Home Edition, Windows XP Professional, Windows Server 2003 ファミリ

アセンブリ: System.Data.Oracleclient (System.Data.Oracleclient.dll 内)

参照

OracleDataAdapter メンバ | System.Data.OracleClient 名前空間 | OracleConnection | OracleCommand