- - PR -
ADO.NET DataAdapter経由でDataRowへのsequenceのセットの仕方
投稿者 | 投稿内容 | ||||
---|---|---|---|---|---|
|
投稿日時: 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 などを発行して順番を先に取得すればできるとは思うのですが。。 もっとスマートな方法があるのではと。。。 | ||||
|
投稿日時: 2006-09-11 22:45
諸農です。
「順序の取得」と言われているのが何を指しているのかがよく判りませんでした。 「順序」という名前の(もしくは順序が格納されているという意味の)カラムのことを指しているのでしたら、そのカラムで ORDER BY すればいいような気もしますが。。 _________________ 諸農和岳 Powered by Turbo Delphi & Microsoft Visual Studio 2005 十兵衛@わんくま同盟 http://blogs.wankuma.com/jubei/ | ||||
|
投稿日時: 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)が「列の順番」を指すかどうかは不明です。 あしからずご了承ください。 | ||||
|
投稿日時: 2006-09-12 08:56
Jubeiさん、VB.Neterさん、回答ありがとうございます。
すみません「順序」はOracleのオブジェクトでSEQUENCEです。 SELECT test.nextval from dual; で取得した値を直接DataRowにつっこみたいのですが。 | ||||
|
投稿日時: 2006-09-12 09:07
OracleDataReader, OracleCommand などで
別途読み込んだシーケンスを元に EMPCODE を更新するか DataAdapter.UpdateCommand に Update用 のコマンドを 設定してあげるかどちらかになると思います。 | ||||
|
投稿日時: 2006-09-12 09:30
どうしてもというのでなければ、ここはCommandBuilderによる自動生成をあきらめて、
"INSERT INTO EMP(EMPNO, ENAME, ...) VALUES (TEST.NEXTVAL, 'FOO', ...)" をInsertCommandに手動で設定してやるのが良いと思います。 CommandBuilderはパフォーマンスを考えるにあまりオススメしません。 | ||||
|
投稿日時: 2006-09-12 10:44
かるあさん、vincentさん、回答ありがとうございます。
私が想像していたようにCommandBuilderで簡単にSequenceをセットする 方法は無いみたいですね。両方の手法で検討してみたいと思います。 大変参考になりました。ありがとうございます。 | ||||
|
投稿日時: 2006-09-12 11:06
まあSequenceはOracle独特なものですからね。
多少の手動実装くらいは仕方ないかと。 というより、SELECT文の内容とは独立したInsert処理を (必要に応じて)自前で実装できるのがDataAdapterの イイところなわけです。 SQL文を実行する代わりにストアドプロシージャを 呼ぶことだってできます。 |