3

dataTableいくつかのレコードを含む切断されたものがあります。

次の関数を使用してを取得していdataTableます。

static System.Data.DataTable ReadSetUpTable(string queryStr,SqlConnection sc)
{
    try
    {
        var command = new SqlCommand()
                          {Connection = sc, CommandText = queryStr};
        var dataAdapter = new SqlDataAdapter() {SelectCommand = command};
        var dataTable = new System.Data.DataTable();
        dataAdapter.Fill(dataTable);
        return dataTable;
    }
    catch (Exception)
    {
        throw;
    }
} 

これまでのところ問題はありません。

私が知りたいのはdataTable、別の接続文字列を使用してこれを別のスキーマに簡単に入力できるかどうかです。

この投稿のために、2つの列を持つテーブルがあると仮定します

Create Table Student(StudentId NUMBER(6), StudentName varchar2(50));

このテーブルdataTableに、上記のコードにあるものを入力したいと思います。

コマンドObjectとinsertステートメントを使用してそれを行うことができます。たとえば、次のコード:

static int LoadDataTable(OracleConnection oc, System.Data.DataTable dataTable)
{
    try
    {
        var command = 
            new OracleCommand
            {
                CommandText = "INSERT INTO STUDENT (STUDENTID, STUDENTNAME) VALUES(:studentid, :studentname)",
                CommandType = CommandType.TableDirect,
                Connection = oc
            };
        var op1 = 
            new OracleParameter
            {
                ParameterName = "StudentId",
                Size = 6,
                OracleDbType = OracleDbType.Int32,
            Direction = System.Data.ParameterDirection.Input
            };
        command.Parameters.Add(op1);
        var op2 = 
        new OracleParameter
            {
                ParameterName = "studentName",
                OracleDbType = OracleDbType.Varchar2,
                Size = 50,
                Direction = System.Data.ParameterDirection.Input
            };
        command.Parameters.Add(op2);                                   
       /*
        foreach (var row in dataTable.Rows)
        {
            op1.Value = int.Parse(row[0].ToString());
            op2.Value = row[1].ToString();
            command.ExecuteNonQuery();
        }*/
            foreach (System.Data.DataRow row in dataTable.Rows)
            {
                row.SetAdded();
            }    

            var dataAdapter = new OracleDataAdapter() {InsertCommand = command};
            dataAdapter.Update(dataTable); //This updates the table, but all column values are NULL.

    }
    catch(Exception)
    {
        throw;
    }
} 

レコードをループする必要がない、より速くて簡単な方法はありますか?

4

1 に答える 1

2

コードの最初のブロックでは、を設定していますSelectCommandInsertCommand、、、UpdateCommandおよびもありDeleteCommandます。

これらのコマンドはOracleDataAdapterオブジェクトにも存在します...DataTableはエンドポイントに依存OracleCommandしないため、挿入を行うためのを作成し、それを、として設定しOracleDataAdapter's InsertCommand、を呼び出すだけoracleDataAdapter.Update(dataTable)です。

私がそれらをチェックするときに、これをより詳細に変更します。


設定の良い例InsertCommandここにあります。コマンドにパラメーターを追加する場合、渡す最後の値.Add( ... )は、マッピング先の列の名前であることに注意してください。

データをに取得しますが、変更しないため、を呼び出す前に、各行のを「追加」にDataTable変更する必要があります。次のようなことをする必要があります。RowStateoracleDataAdapter.Update()

foreach (DataRow row in dataTable.Rows) {
    row.SetAdded();
}

さらにコード例が必要な場合はお知らせください...投稿したコードから、私がここに行く場所の要点はほぼわかっていると思います。


編集

OracleParametersを作成するときは、ソース列をDataTableの列の名前に設定する必要があります。デフォルトでは、これはselectステートメントによって返される名前なので、次のようになります。

var op1 = new OracleParameter {
                                ParameterName = "StudentId",
                                Size = 6,
                                OracleDbType = OracleDbType.Int32,
                                Direction = System.Data.ParameterDirection.Input
                                SourceColumn = "StudentId" // If that's what it's called in the DataTable
                              };
command.Parameters.Add(op1);

AcceptChanges()メソッドは、プロパティとDataTable同様に、にあります( 、、HasErrorsにも存在します)。 DataRowsDataSets

AcceptChanges()データベースへの更新を処理したことをDataTableに通知するだけです...呼び出したときに変更がデータベースにコミットされますoracleDataAdapter.Update()。呼び出す理由AcceptChanges()は、行の状態をリセットするためです。そうしないと、次にDataTableを更新したときに、すでに追加されている行を追加しようとします。

のプロパティAcceptChangesDuringUpdateは、データベースの更新の一部としてOracleDataAdapter自動的に呼び出されます...呼び出す前にプロパティAcceptChanges()をテストして処理することに慣れているため、通常は行いません...しかし、それを読んでいます現在、アップデート時にデフォルトで呼び出されます。エラーのある行がどのように処理されるか、変更が受け入れられるかどうかの詳細についてはよくわかりません。HasErrorsAcceptChanges()AcceptChanges()

于 2011-04-26T20:02:53.510 に答える