- - PR -
DataAdapterのUpdateで更新する場合のトランザクション管理
«前のページへ
1|2|3
投稿者 | 投稿内容 | ||||||||
---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2005-01-23 06:27
性能を考慮されるのでしたら、DataAdapterのUpdateメソッドで使用する INSERT, UPDATE, DELETE用のSQL文をストアドプロシージャに自前で用意 すべきです。 なお、UPDATE, DELETEのSQL文を作成するときは、2重更新を考慮して 楽観的ロックを組み込んでください。 CommandBuilderが自動生成するSQLは、2重更新を回避するために SQLのWHERE句に列名の条件式が追加されますので効率よくありません。 自前でSQLを作成するときは、列名を羅列するのではなく主キーと タイムスタンプなどで2重更新を回避します。 私は、タイムスタンプの代わりにConcurrencyID列を追加して 2重更新を回避しています。 それからOLEDBではなく、ODP.NETを利用することをお勧めします。 参考までにOracle用のパッケージ本体部を添付します。
_________________ ASP.NETサンプル集(Web Matrix版) [ メッセージ編集済み 編集者: Access 編集日時 2005-01-23 10:16 ] | ||||||||
|
投稿日時: 2005-01-23 07:03
OLEDBで確認しましたが正常に動作しました。 参考までにソースコードを添付します。
Tip: 私は仕事柄、Access, MySQL, SQL Server, Oracleを利用するのですが connectionstring.com便利ですね!一度、覗いてみてください。 http://www.connectionstrings.com/ _________________ ASP.NET+Ajaxサンプル集 | JavaScript+Ajaxサンプル集 | ||||||||
|
投稿日時: 2005-01-24 15:16
いろいろとありがとうございます。
書いてくださったソースでやってみたのですが、 mcb.GetInsertCommand.Transaction = txn の部分で、 「Executeは、コマンドに割り当てられた接続が保留状態であるローカルのトランザクションにあるとき、トランザクション オブジェクトを持つコマンドが必要です。コマンドのTransactionプロパティがまで初期化されていません。」 というエラーになります。よく意味が分かりません。誤字っぽいのもそのままです。 下記のようにしたらうまくいきました。 mda.InsertCommand = mcb.GetInsertCommand mda.DeleteCommand = mcb.GetDeleteCommand mda.UpdateCommand = mcb.GetUpdateCommand txn = mcon.BeginTransaction mda.InsertCommand.Transaction = txn mda.DeleteCommand.Transaction = txn mda.UpdateCommand.Transaction = txn なんだか分からないけどうまくいくということではちょっと怖いので、 もっと勉強して分かるようになってから使おうと思います。 ありがとうございました。 | ||||||||
|
投稿日時: 2005-01-24 15:32
mcon.Open() <-- これを追加すると正常に動作すると思います. txn = mcon.BeginTransaction mda.InsertCommand.Transaction = txn mda.DeleteCommand.Transaction = txn mda.UpdateCommand.Transaction = txn mcon.Close() _________________ ASP.NET+Ajaxサンプル集 | JavaScript+Ajaxサンプル集 | ||||||||
|
投稿日時: 2005-01-24 15:52
ありがとうございます。
>mcon.Open() <-- これを追加すると正常に動作すると思います. >txn = mcon.BeginTransaction Accessさんが書いてくださったソースにはもとからOpenが入っておりましたので、 Opneもやっております。 私のやったやり方ですと、 @Open AGetInserCommand BBeginTransaction CInsertCommand.TransactionにBのTransactionを設定 DUpdate ECommit ならうまくいくのですが、 AGetInsertCommandをBBeginTransactionの後に持ってくると、 先ほどのエラーが発生します。 GetxxxxCommandはトランザクション開始の前でないと だめっぽい感じです。 理由は分かりませんが。 |
«前のページへ
1|2|3