- - PR -
DataAdapterのUpdateで更新する場合のトランザクション管理
投稿者 | 投稿内容 | ||||
---|---|---|---|---|---|
|
投稿日時: 2005-01-22 15:12
ご指摘ありがとうございます。
おっしゃるとおりに修正してみたのですが、 da.InsertCommand.Transaction = trn の部分で やはり下記のエラーが発生します。 'System.NullReferenceException' のハンドルされていない例外が SampleTest.exe で発生しました。 追加情報 : オブジェクト参照がオブジェクト インスタンスに設定されていません。 書いてくださったソース以外に何か処理が必要でしょうか。 こちらでやってみたのはフォームにFlexGridを貼り付けて、DataSourceにデータテーブルを指定、 グリッド上で編集したあと、 da.InsertCommand.Transaction = trn da.UpdateCommand.Transaction = trn da.DeleteCommand.Transaction = trn da.Update(dt) trn.Commit() をやってみました。 よろしくお願いいたします。 | ||||
|
投稿日時: 2005-01-22 17:13
テスト用のWebフォームを作成して、Page_Loadイベントに下記コートを追加してテストしてみたらどうでしょうか。 それからOracleのOracleCommandオブジェクトのTransactionプロパティは、 ReadOnlyですから設定できません。 Dim dt As New DataTable Dim con As New SqlConnection(strConnectionString) Dim da As New SqlDataAdapter(strSQL, con) Dim cb As New SqlCommandBuilder(da) con.Open() cb.GetUpdateCommand() da.Fill(dt) Dim trn As SqlTransaction = con.BeginTransaction() da.InsertCommand.Transaction = trn da.UpdateCommand.Transaction = trn da.DeleteCommand.Transaction = trn da.Update(dt) trn.Commit() con.Close() _________________ ASP.NET+Ajaxサンプル集 | JavaScript+Ajaxサンプル集 | ||||
|
投稿日時: 2005-01-22 17:27
すみません。
やってみましたが、状況変わらずです。 まず最初にこちらの基本的な情報からお話いたしますが、 画面はWindowsフォームで、データベースはオラクルです。 データベース処理はOleDbを使ってます。 なので、Webフォームではなく、Windowsフォームでフォームロード時に書いていただいた処理を行うようにし、SqlConnectionなどの部分はOleDbConnectionのように書き換えました。 OleDbのInsertCommandなどのプロパティはReadOnlyではないので、いけるはずなのですが・・・ もしなにか他に分かりましたら、 またお願いいたします。 | ||||
|
投稿日時: 2005-01-22 18:08
InsertCommandとかが生成されてますか?
GetUpdateCommand() で生成されるはずなんですが。 データ編集後のUpdateは正常に行われていますか? | ||||
|
投稿日時: 2005-01-22 18:20
ウォッチするとInertCommandはNothingのままです。
データ編集後のUpdateとはDataAdapterのUpdateのことでしょうか。 Transactionプロパティを設定するところで例外発生するので、 DataAdapterのUpdateまではたどり着けません。 それとも他に何かのUpdateを実行する必要があるのでしょうか。 よろしくお願いします。 | ||||
|
投稿日時: 2005-01-22 18:32
Updateは正常に行われていますか?
とは、トランザクションを管理せず、DataAdapterのUpdateをしたときに、 データベースに変更が反映されていますか、という意味です。 Insert,Delete,Updateの各コマンドがNothingだと、Updateしないはずです。 GetUpdateCommand() で生成するか、自前で各コマンドをつくりましょう。 | ||||
|
投稿日時: 2005-01-22 20:17
AccessさんがSqlClient名前空間で、kesさんはOleDb名前空間なんですよね?名前空間が違うのだから、そこに用意されているコントロールの仕様が異なっているかもしれませんよね。
CommandBuilder.GetUpdateCommandメソッド実行後にUpdateCommandなどがNothing。だけど、OleDbDataAdapter.Update後にはセットされている。という状態なら、「仕様が違う」とあきらめましょう。 あと、CommandBuilderが生成するSQL文は、あまり効率がよいとはいえません。 _________________ | ||||
|
投稿日時: 2005-01-22 20:32
Updateは正常に行えております。
各コマンドはNothingのままですが、ヘルプによるとコマンドが設定されていないと自動で生成されるとありました。 仕様が違うんですかね・・・・。 コマンドビルダはあまり使わないほうが無難でしょうか。 まじめに自分でSQL文を生成したほうが安全ですかね。 どうもでした。 |