- PR -

Transaction 処理について

投稿者投稿内容
りん
常連さん
会議室デビュー日: 2003/06/30
投稿数: 22
投稿日時: 2003-07-22 11:01
こんにちは。Transaction処理について、困っているので投稿しました。
VB.NETでの開発です。サーバはOracle9iR2、プロバイダはODP.NETを使用します。
-----------------------
Dim cn As New Oracle.DataAccess.Client.OracleConnection() 'コネクション
Dim cmd As New Oracle.DataAccess.Client.OracleCommand() 'コマンド
Dim myTrans As Oracle.DataAccess.Client.OracleTransaction 'トランザクション

cn.ConnectionString = "接続文字列"
cn.Open()
cmd.Connection = cn
myTrans = cn.BeginTransaction()
cmd.Transaction = myTrans <--- ココ
-----------------------
矢印の部分に、「プロパティ'Transaction'は'ReadOnly'です」というメッセージが出て、トランザクションを設定できません。
サンプル等見ながら書いたつもりなのですが、何か抜けている設定などがあるのでしょうか?どなたか、ご存知の方、アドバイスをよろしくお願いします!
NYRL
ベテラン
会議室デビュー日: 2003/07/14
投稿数: 90
投稿日時: 2003-07-22 11:20
こんにちはNYRLです。

コマンドをコネクションから作成してもダメですか?

Dim cmd As Oracle.DataAccess.Client.OracleCommand() = cn.CreateCommand()

SQLServerでやっていた時に new したコマンドに代入できなかった
記憶があります。


[ メッセージ編集済み 編集者: NYRL 編集日時 2003-07-22 11:28 ]
りん
常連さん
会議室デビュー日: 2003/06/30
投稿数: 22
投稿日時: 2003-07-22 11:43
-------------
'Dim cmd As New Oracle.DataAccess.Client.OracleCommand() コメントにしました
'cmd.Connection = cn コメントにしました

cn.Open()
Dim cmd As Oracle.DataAccess.Client.OracleCommand() = cn.CreateCommand()
myTrans = cn.BeginTransaction()
cmd.Transaction = myTrans
-------------
ううん、試してみたのですが、
やはり、同じ場所で「ReadOnlyです」というメッセージがでます。。
なな
ぬし
会議室デビュー日: 2003/06/22
投稿数: 659
お住まい・勤務地: 愛知県
投稿日時: 2003-07-22 12:23
> cmd.Transaction = myTrans

読み取り専用プロパティなので、設定不可能です。

下記のとおり試してみてください。

OracleTransaction txn;
OracleCommand cmd;

txn = con.BeginTransaction();
cmd = new OracleCommand("", con);

# C#ですみません...。
りん
常連さん
会議室デビュー日: 2003/06/30
投稿数: 22
投稿日時: 2003-07-22 14:47
NYRLさん、ななさん、ありがとうございます。

>読み取り専用プロパティなので、設定不可能です
そうだったんですね・・・

------
Dim cn As New Oracle.DataAccess.Client.OracleConnection()
Dim cmd As Oracle.DataAccess.Client.OracleCommand
Dim myTrans As Oracle.DataAccess.Client.OracleTransaction

cn.Open()
myTrans = cn.BeginTransaction()
cmd = new OracleCommand("", cn)
cmdDelete.CommandText = "delete from 社員テーブル where 氏名='テスト'"
Call cmdDelete.ExecuteNonQuery
myTrans.Commit
-------
例えばですが、上記ようなやりかたでうまくいきました!
どうもありがとうございました!

NYRL
ベテラン
会議室デビュー日: 2003/07/14
投稿数: 90
投稿日時: 2003-07-22 14:52
MSDNによると

Transaction プロパティに既に特定の値が設定されていて、コマンドが実行中の場合は、このプロパティは設定できません。 OracleCommand オブジェクトと同じ OracleConnection に接続されていない OracleTransaction オブジェクトをトランザクション プロパティに設定すると、次回のステートメント実行時に例外がスローされます。

となっていてOracleTransaction のサンプルでは

Dim myConnection As New OracleConnection(myConnString)
myConnection.Open()

Dim myCommand As OracleCommand = myConnection.CreateCommand()
Dim myTrans As OracleTransaction

myTrans = myConnection.BeginTransaction(IsolationLevel.ReadCommitted)
myCommand.Transaction = myTrans

となっているので順番に気をつければ代入できるはずなんですけどね・・・

とりあえずできたからいいのかな
りん
常連さん
会議室デビュー日: 2003/06/30
投稿数: 22
投稿日時: 2003-07-22 15:17
>順番に気をつければ代入できるはず

なるほど!まさにこのページを参考にしていたんですが、確かに、
自分の作りたいようにプログラムの順番を換えていました。
その結果、上記のようなことが起こっていたんですね。
本当にどうもありがとうございました!


なな
ぬし
会議室デビュー日: 2003/06/22
投稿数: 659
お住まい・勤務地: 愛知県
投稿日時: 2003-07-22 18:32
> MSDNによると

恐れ入ります。
念のために、C# + ODP.NETで確認していますが、どうしても代入できません。

OracleConnection con = new OracleConnection("...");
con.Open();
OracleCommand cmd = con.CreateCommand();
OracleTransaction txn = con.BeginTransaction();
cmd.Transaction = txn; // ← ここでコンパイルエラー発生!


MSDNのどこにサンプルが記述されているか教えていただけませんか?

# ちなみに、わたしはODP.NETのOracleTransaction Classに書かれているサンプルを参考にしました。

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