- PR -

DataAdapterのUpdateで更新する場合のトランザクション管理

投稿者投稿内容
kes
ベテラン
会議室デビュー日: 2004/08/10
投稿数: 67
投稿日時: 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()

をやってみました。


よろしくお願いいたします。
Access
ぬし
会議室デビュー日: 2002/04/08
投稿数: 829
投稿日時: 2005-01-22 17:13
引用:

おっしゃるとおりに修正してみたのですが、
da.InsertCommand.Transaction = trn の部分で
やはり下記のエラーが発生します。

 'System.NullReferenceException' のハンドルされていない例外が
   SampleTest.exe で発生しました。
  追加情報 : オブジェクト参照がオブジェクト インスタンスに設定されていません。



テスト用の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サンプル集
kes
ベテラン
会議室デビュー日: 2004/08/10
投稿数: 67
投稿日時: 2005-01-22 17:27
すみません。
やってみましたが、状況変わらずです。

まず最初にこちらの基本的な情報からお話いたしますが、
画面はWindowsフォームで、データベースはオラクルです。
データベース処理はOleDbを使ってます。
なので、Webフォームではなく、Windowsフォームでフォームロード時に書いていただいた処理を行うようにし、SqlConnectionなどの部分はOleDbConnectionのように書き換えました。
OleDbのInsertCommandなどのプロパティはReadOnlyではないので、いけるはずなのですが・・・


もしなにか他に分かりましたら、
またお願いいたします。
Lin
ベテラン
会議室デビュー日: 2004/11/08
投稿数: 50
投稿日時: 2005-01-22 18:08
InsertCommandとかが生成されてますか?
GetUpdateCommand() で生成されるはずなんですが。
データ編集後のUpdateは正常に行われていますか?
kes
ベテラン
会議室デビュー日: 2004/08/10
投稿数: 67
投稿日時: 2005-01-22 18:20
ウォッチするとInertCommandはNothingのままです。
データ編集後のUpdateとはDataAdapterのUpdateのことでしょうか。
Transactionプロパティを設定するところで例外発生するので、
DataAdapterのUpdateまではたどり着けません。
それとも他に何かのUpdateを実行する必要があるのでしょうか。


よろしくお願いします。
Lin
ベテラン
会議室デビュー日: 2004/11/08
投稿数: 50
投稿日時: 2005-01-22 18:32
Updateは正常に行われていますか?
とは、トランザクションを管理せず、DataAdapterのUpdateをしたときに、
データベースに変更が反映されていますか、という意味です。
Insert,Delete,Updateの各コマンドがNothingだと、Updateしないはずです。

GetUpdateCommand() で生成するか、自前で各コマンドをつくりましょう。
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2005-01-22 20:17
 AccessさんがSqlClient名前空間で、kesさんはOleDb名前空間なんですよね?名前空間が違うのだから、そこに用意されているコントロールの仕様が異なっているかもしれませんよね。

 CommandBuilder.GetUpdateCommandメソッド実行後にUpdateCommandなどがNothing。だけど、OleDbDataAdapter.Update後にはセットされている。という状態なら、「仕様が違う」とあきらめましょう。


 あと、CommandBuilderが生成するSQL文は、あまり効率がよいとはいえません。
_________________
kes
ベテラン
会議室デビュー日: 2004/08/10
投稿数: 67
投稿日時: 2005-01-22 20:32
Updateは正常に行えております。
各コマンドはNothingのままですが、ヘルプによるとコマンドが設定されていないと自動で生成されるとありました。
仕様が違うんですかね・・・・。

コマンドビルダはあまり使わないほうが無難でしょうか。
まじめに自分でSQL文を生成したほうが安全ですかね。

どうもでした。

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