- PR -

ADO.NET DataAdapter経由でDataRowへのsequenceのセットの仕方

投稿者投稿内容
大魔王
会議室デビュー日: 2004/07/20
投稿数: 10
投稿日時: 2006-09-11 21:06
はじめまして、初心者の質問ですみません。

Oracle10g+ODP.NET+VisualStudio2005環境です。

ODP.NETでOracleへ接続し、
OracleDataAdapter経由でデータをInsertしようとしております。

DataRow で値をセットし、
SQL文はOracleCommandBuilderで自動生成してInsertしたいのですが、
この時特定のColumnの値を順序より取得してセットしたいのですが、
順序の取得をスマートにするにはどうすればいいのかわかりません。。

--------------

//接続情報
string conn = "User Id=scott;Password=tiger;Data Source=orcl;";
string cmdstr = "SELECT * from emp";

//接続取得
OracleDataAdapter adapter = new OracleDataAdapter(cmdstr, conn);

DataSet dataset = new DataSet();
adapter.Fill(dataset, "EMP");
DataTable table = dataset.Tables["EMP"];

//表示してみる
dataGridView1.DataSource = dataset;

DataRow newRow = table.NewRow();

//これだとただの文字列挿入になる。
newRow["EMPCODE"] = "(SELECT test.nextval from dual)";
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

newRow["EMPNAME"] = "19991212111111";

table.Rows.Add(newRow);

// コマンド自動作成
OracleCommandBuilder cb = new OracleCommandBuilder(adapter);

adapter.Update(dataset, "EMP");

-------------------
別にOracleDataReaderSQL
などを発行して順番を先に取得すればできるとは思うのですが。。
もっとスマートな方法があるのではと。。。

Jubei
ぬし
会議室デビュー日: 2002/03/02
投稿数: 830
お住まい・勤務地: 関西
投稿日時: 2006-09-11 22:45
諸農です。

引用:

大魔王さんの書き込み (2006-09-11 21:06) より:
この時特定のColumnの値を順序より取得してセットしたいのですが、
順序の取得をスマートにするにはどうすればいいのかわかりません。。



「順序の取得」と言われているのが何を指しているのかがよく判りませんでした。
「順序」という名前の(もしくは順序が格納されているという意味の)カラムのことを指しているのでしたら、そのカラムで ORDER BY すればいいような気もしますが。。


_________________
諸農和岳
Powered by Turbo Delphi & Microsoft Visual Studio 2005

十兵衛@わんくま同盟
http://blogs.wankuma.com/jubei/
VB.Neter
会議室デビュー日: 2006/09/12
投稿数: 2
投稿日時: 2006-09-12 02:13
はじめまして。

DataTableReader.GetSchemaTable メソッド はお試しになりましたか?
以下、MSDNから要約・抜粋(SQLServerですがOracleでも大丈夫なはず)。

Dim adapter As SqlDataAdapter = _
New SqlDataAdapter("SELECT * FROM Sales.Customer", connectionString)
Dim table As New DataTable
adapter.Fill(table)

Using reader As New DataTableReader(table)
Dim schemaTable As DataTable = reader.GetSchemaTable()
'あとはschemaTableから「ColumnOrdinal」の値を取り出して判定していく・・・
End Using

詳しくは「DataTableReader.GetSchemaTable」のヘルプを見てください。
これ使えば、別途SQLを発行する手間がなくなると思います。
ただ、この方法(ColumnOrdinal)が「列の順番」を指すかどうかは不明です。
あしからずご了承ください。




大魔王
会議室デビュー日: 2004/07/20
投稿数: 10
投稿日時: 2006-09-12 08:56
Jubeiさん、VB.Neterさん、回答ありがとうございます。
すみません「順序」はOracleのオブジェクトでSEQUENCEです。

SELECT test.nextval from dual;

で取得した値を直接DataRowにつっこみたいのですが。
かるあ
ぬし
会議室デビュー日: 2003/11/16
投稿数: 1190
お住まい・勤務地: センガワ→ムサシノ
投稿日時: 2006-09-12 09:07
OracleDataReader, OracleCommand などで
別途読み込んだシーケンスを元に EMPCODE を更新するか

DataAdapter.UpdateCommand に Update用 のコマンドを
設定してあげるかどちらかになると思います。
vincent
大ベテラン
会議室デビュー日: 2004/07/09
投稿数: 142
投稿日時: 2006-09-12 09:30
どうしてもというのでなければ、ここはCommandBuilderによる自動生成をあきらめて、
"INSERT INTO EMP(EMPNO, ENAME, ...) VALUES (TEST.NEXTVAL, 'FOO', ...)"
をInsertCommandに手動で設定してやるのが良いと思います。

CommandBuilderはパフォーマンスを考えるにあまりオススメしません。
大魔王
会議室デビュー日: 2004/07/20
投稿数: 10
投稿日時: 2006-09-12 10:44
かるあさん、vincentさん、回答ありがとうございます。
私が想像していたようにCommandBuilderで簡単にSequenceをセットする
方法は無いみたいですね。両方の手法で検討してみたいと思います。
大変参考になりました。ありがとうございます。
vincent
大ベテラン
会議室デビュー日: 2004/07/09
投稿数: 142
投稿日時: 2006-09-12 11:06
まあSequenceはOracle独特なものですからね。
多少の手動実装くらいは仕方ないかと。

というより、SELECT文の内容とは独立したInsert処理を
(必要に応じて)自前で実装できるのがDataAdapterの
イイところなわけです。

SQL文を実行する代わりにストアドプロシージャを
呼ぶことだってできます。

スキルアップ/キャリアアップ(JOB@IT)