VBからOracle 11gに接続 何度も似た様な質問になりますが、依然としてVBからOracle 11gに接続できません。 現在のエラーメッセージは 追加情報:'Oracle.DataAccess.Client.OracleConnection' のタイプ初期化子が例外をスローしました。 で、発生しているコードは Dim cnn As New OracleConnection です。 プロジェクトのプロパティから Oracle.DataAccess.Client Oracle.DataAccess.Types をインポート設定しているので、コードにImports宣言はありません。
・ODBCについては、システムDSNにドライバ(Oracle in OraDb11g_Home1)を登録し、 接続テストもOKです。 ※ただ、接続時のユーザID/パスワードがOracleをインストールした時の値じゃなく、 Widowsログオン時の「それ」になっているのが気にはなりますが。 ・11gでマネージドドライバが使えない事は、過去の質問で理解しております。 ・OADCをインストールする際は64bit用のClient版(XCOPYじゃない方)を選択しました。 ・プロジェクトの[参照]でOracle.DataAccessを追加しています。 相変わらず何が何だかさっぱり分かりません。 SQL*Plusからは、user/pass一体型で"@サービス名"を指定しないと接続できず、 user/pass分離型(二段階入力)では 「ORA-12560: TNS: プロトコル・アダプタ・エラーが発生しました。」 というエラーになり接続できません。 補足 追記ですが、Oracle
11g本体はアンインストーラで削除し、再インストールしました。
その他の回答(2件)・user/pass一体型で"@サービス名"を指定しないと接続できず ・ORA-12560: TNS: プロトコル・アダプタ・エラーが発生しました。 ということは、環境変数ORACLE_HOME、ORACLE_SIDが設定されていないか、正しくないのでは?前回の質問のやりとりを見てると、 >追加情報:'Oracle.DataAccess.Client.OracleConnection' のタイプ初期化子が例外をスローしました。 これは、 (A) VBのプロジェクトが参照している Oracle.DataAccess.dll のバージョン (B) (A) が参照している OraOps11w.dll のバージョン が不一致のために起きているような気が・・・。 つまり、Oracle Client が複数インストールされているとか、インストール/アンインストールを繰り返したために古い情報がレジストリに残っているために、 Oracle.DataAccess.dll → OraOps11w.dll の参照がおかしくなっているんじゃないかと。 レジストリの内容を確認してみて、同じようなキーが複数存在しているようなら、 (1) Oracle Client をアンインストール (2) レジストリから、該当する Oracle 関連のキーを全て削除 (3) Oracle Client をインストール としてみるといいかも。 ちなみに、何度も言うけど、Oracle.DataAccess を使おうとしているのなら、ODBC は関係ないよ。(↓参照) http://www.atmarkit.co.jp/ait/articles/0305/16/news003.html
Visual Basic(VB6.0A)からOracleへアクセスする方法として oo4o を使った内容を以前から載せてはいましたが、 時代はVB.NETでの開発となり、ADO.NET の方式が主流となってきました。 ADO.NET とは、SQL Server や XML などのデータソースや、OLE DBやODBC経由でデータ ソースに対する一貫性を持ったアクセスができる仕組みです。 オラクルも「.NET」に対応するために、ネイティブにデータベースにアクセスできる「Oracle Data Provider for .NET」(ODP.NETと略します)を提供しています。 基本的な関数などはADO.NETと似た部分が多いですが、オラクル独自の機能が使用可能です。
ODP.NET使用の準備ODP.NETを使用するためには、Oracle Clientをインストールするのがいいのですが、 .NETからデータベースへのアクセスのみを行いたい場合はOracle Data Access Components のインストールで十分です。 オラクルの 「Oracle Data Access Components (ODAC) for Windows ダウンロード」 ページから該当するダウンロードを選びます。 私は32ビット用の 「32-bit ODAC with ODT ダウンロード」 を選びました。 このページを見ますと多くのバージョンがダウンロードできますが、私はオラクルサーバのバージョンに合わせて ODAC 11.2 Release 5 and Oracle Developer Tools for Visual Studio (11.2.0.3.20)をダウンロードしました。 ■「ODTwithODAC1120320_32bit.zip」をダウンロードし、デスクトップZIPファイルを解凍します。 Oracleへの接続と切断Orcaleへの接続と切断のみの処理を、フォームに貼り付けたコマンドボタンのクリックイベントでテストします。 ODP.NETを使うためには「Oracle.DataAccess.Client」をソースの先頭で宣言したほうが良いでしょう。 接続のために、Orcaleの接続用オブジェクトの OracleConnection を使用します。 OracleConnection に接続文字列を渡して、オブジェクトの生成を行っています。 ■簡易接続ネーミング・メソッドを使用した接続文字列について //<ホスト名>[:<ポート番号>][/<データベース名(SID)>] (ポート番号省略時は”:1521”が指定されたものとする) Instant Clientのtnsnames設定(tnsnames.oraファイル)を構成することなく、アプリケーションから直接データベースに対する接続文字列を指定できます。 ソース内でコメントの接続文字列は、プログラムをサーバ上で動作させる場合で、localhost の設定でOKです。 'ソースの先頭で以下のImportを宣言 Imports Oracle.DataAccess.Client '----- 'オラクル接続のオープン・クローズのテスト Private Sub Button5_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button5.Click '接続文字列 Dim strConnect As String = _ "Data Source=//192.168.1.207/test; User ID=test;Password=test;" 'Dim strConnect As String = _ ' "Data Source=//localhost/test; User ID=test;Password=test;" 'オラクル接続オブジェクト Dim Conn As New OracleConnection(strConnect) 'オラクル接続オープン Conn.Open() 'オラクル接続クローズ Conn.Close() Conn.Dispose() End Sub オラクル接続オブジェクト OracleConnection のメソッド Open・Close を使用して接続のオープン・クローズを行います。 簡単な接続はこれでいいのですが、実際にはエラー処理が必要になります。 'オラクル接続のオープン・クローズのテスト2 Private Sub Button5_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button5.Click '接続文字列(エラーが発生するようにPasswordは"test2"としている) Dim strConnect As String = _ "Data Source=//192.168.1.207/test; User ID=test;Password=test2;" 'オラクル接続オブジェクト Dim Conn As New OracleConnection(strConnect) Try 'オラクル接続オープン Conn.Open() 'オラクル接続クローズ Conn.Close() Catch exora As OracleException 'オラクルエラー MsgBox(exora.Number & ":" & exora.Message) Catch ex As Exception 'PGエラー MsgBox(ex.Message) Finally Conn.Dispose() End Try End Sub 上記の例では、エラーを起こすためにパスワードを間違ったものにしています。 このプログラムを実行すると、以下のメッセージが表示されます。 SQLの実行その1:簡単なSELECT文の実行 データベース内のデータを検索するSQL文としてのSELECT文の実行を行います。 ODP.NET では以下のオブジェクトを使用しテーブルからのデータを取得します。
■処理手順 ・接続文字列の生成 '簡単なSELECT文の実行 Private Sub Button5_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button5.Click '接続文字列 Dim strConnect As String = _ "Data Source=//192.168.1.207/test; User ID=test;Password=test;" 'オラクル接続オブジェクト Dim Conn As New OracleConnection(strConnect) Try 'オラクル接続オープン Conn.Open() 'SQL文 Dim SQL As String = _ "SELECT SYSDATE, TO_CHAR(SYSDATE, 'YYYY/MM/DD') AS DATEX FROM DUAL" 'コマンドオブジェクト(SQL文と接続オブジェクト) Dim Cmd As New OracleCommand(SQL, Conn) Cmd.CommandType = CommandType.Text 'コマンドオブジェクトの実行で読込オブジェクト取得 Dim dr As OracleDataReader = Cmd.ExecuteReader() 'データ行の読込処理 If dr.Read() = True Then '読込が正常の場合、各データの取得 MsgBox(dr.Item("SYSDATE") & ":" & dr.Item("DATEX")) '取得① MsgBox(dr.Item(0) & ":" & dr.Item(1)) '取得② MsgBox(dr(0) & ":" & dr("DATEX")) '取得③ MsgBox(dr.GetDateTime(0) & ":" & dr.GetString(1)) '取得④ End If '読込オブジェクトのクローズ dr.Close() dr = Nothing 'オラクル接続クローズ Conn.Close() Catch exora As OracleException 'オラクルエラー MsgBox(exora.Number & ":" & exora.Message) Catch ex As Exception 'PGエラー MsgBox(ex.Message) Finally Conn.Dispose() End Try End Sub■注意点 データ行の読込が正常でのデータの取得の所で、4種類の方法を示しています。 ■代表的な型指定アクセッサについて
■関連記事 ⇒Oracle SQL SELECT1 : SELECT文の基礎 SQLの実行その2:複数行を返すSELECT文の実行SQLの実行その1のSELECT文では1行しか結果を返さないことがはっきりしていましたが、 複数行を返すSELECT文を実行することのほうが実際には多いものです。 以下のプログラムでは、TM_商品の商品コードと商品名の一覧を表示する処理を行っています。 '複数行を返すSELECT文の実行 Private Sub Button5_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button5.Click '接続文字列 Dim strConnect As String = _ "Data Source=//192.168.1.207/test; User ID=test;Password=test;" 'オラクル接続オブジェクト Dim Conn As New OracleConnection(strConnect) Try 'オラクル接続オープン Conn.Open() 'SQL文 Dim SQL As String = "SELECT 商品コード, 商品名 FROM TM_商品" 'コマンドオブジェクト(SQL文と接続オブジェクト) Dim Cmd As New OracleCommand(SQL, Conn) Cmd.CommandType = CommandType.Text '読込オブジェクトに接続 Dim dr As OracleDataReader = Cmd.ExecuteReader() Dim strDsp As String = "" '読込処理 While (dr.Read() = True) '読込行が在った場合 strDsp &= dr.Item("商品コード").ToString & ":" & dr.Item("商品名") & vbCr End While '読込データの表示 MsgBox(strDsp) '読込オブジェクトのクローズ dr.Close() dr = Nothing 'オラクル接続クローズ Conn.Close() Catch exora As OracleException 'オラクルエラー MsgBox(exora.Number & ":" & exora.Message) Catch ex As Exception 'PGエラー MsgBox(ex.Message) Finally Conn.Dispose() End Try End Sub SQLの実行その3:INSERT,UPDATE,DELETE文の実行SELECT文以外のDML(データ操作言語)であるINSERT,UPDATE,DELETE文の実行を OracleCommandオブジェクトのメソッドである ExecuteNonQuery を用いて行います。 ExecuteNonQuery の戻り値は処理された行数が返されます。 ■1個のINSERT文の実行'1個のINSERT文の実行 Private Sub Button5_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button5.Click '接続文字列 Dim strConnect As String = _ "Data Source=//192.168.1.207/test; User ID=test;Password=test;" 'オラクル接続オブジェクト Dim Conn As New OracleConnection(strConnect) Try 'オラクル接続オープン Conn.Open() 'SQL文 Dim SQL As String = _ "INSERT INTO TM_商品(商品コード, 商品名, 商品区分, 仕入単価, 売上単価)" & _ " VALUES(1001,'商品1001', '区分1001', 10000, 15000)" 'コマンドオブジェクト(SQL文と接続オブジェクト) Dim Cmd As New OracleCommand(SQL, Conn) 'INSERT文の実行 Dim nCnt As Integer = Cmd.ExecuteNonQuery() 'オラクル接続クローズ Conn.Close() Catch exora As OracleException 'オラクルエラー MsgBox(exora.Number & ":" & exora.Message) Catch ex As Exception 'PGエラー MsgBox(ex.Message) Finally Conn.Dispose() End Try End Sub 以下は連続で、INSERT、UPDATE、DELETE文の実行を行います。 'INSERT,UPDATE,DELETE文の実行 Private Sub Button5_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button5.Click '接続文字列 Dim strConnect As String = _ "Data Source=//192.168.1.207/test; User ID=test;Password=test;" 'オラクル接続オブジェクト Dim Conn As New OracleConnection(strConnect) Try 'オラクル接続オープン Conn.Open() 'INSERT-SQL文1 Dim SQL As String = _ "INSERT INTO TM_商品(商品コード, 商品名, 商品区分, 仕入単価, 売上単価)" & _ " VALUES(1001,'商品1001', '区分1001', 10000, 15000)" 'コマンドオブジェクト(SQL文と接続オブジェクト) Dim Cmd As New OracleCommand(SQL, Conn) 'INSERT文の実行 Dim nCnt As Integer = Cmd.ExecuteNonQuery() 'INSERT-SQL文2 SQL = "INSERT INTO TM_商品(商品コード, 商品名, 商品区分, 仕入単価, 売上単価)" & _ " VALUES(1002,'商品1002', '区分1002', 10000, 15000)" 'コマンドオブジェクトへのSQL文設定 Cmd.CommandText = SQL 'INSERT文の実行 nCnt = Cmd.ExecuteNonQuery() 'UPDATE-SQL文 SQL = "UPDATE TM_商品 SET 売上単価 = 20000 WHERE 商品コード = 1001" 'コマンドオブジェクトへのSQL文設定 Cmd.CommandText = SQL 'UPDATE文の実行 nCnt = Cmd.ExecuteNonQuery() 'DELETE-SQL文 SQL = "DELETE TM_商品 WHERE 商品コード = 1002" 'コマンドオブジェクトへのSQL文設定 Cmd.CommandText = SQL 'DELETE文の実行 nCnt = Cmd.ExecuteNonQuery() 'オラクル接続クローズ Conn.Close() Catch exora As OracleException 'オラクルエラー MsgBox(exora.Number & ":" & exora.Message) Catch ex As Exception 'PGエラー MsgBox(ex.Message) Finally Conn.Dispose() End Try End Sub■関連記事
⇒Oracle SQL・データの追加(INSERT) SQLの実行その4:トランザクションを加味したINSERT,UPDATE,DELETE文の実行 「SQLの実行その3:INSERT,UPDATE,DELETE文の実行」ではDML文の実行の都度コミットがされてしまうので、
途中でエラーが在った場合はそこまでの結果がデータに残ってしまいます。 以下の例では、OracleConnectionオブジェクトのBeginTransactionメソッドを用いて、 トランザクション開始しOracleTransactionオブジェクトを取得します。 'トランザクションを加味したINSERT,UPDATE,DELETE文の実行 Private Sub Button5_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button5.Click '接続文字列 Dim strConnect As String = _ "Data Source=//192.168.1.207/test; User ID=test;Password=test;" 'オラクル接続オブジェクト Dim Conn As New OracleConnection(strConnect) 'トランザクションオブジェクト Dim Trans As OracleTransaction = Nothing Try 'オラクル接続オープン Conn.Open() 'トランザクション開始 Trans = Conn.BeginTransaction(IsolationLevel.ReadCommitted) 'INSERT-SQL文1 Dim SQL As String = _ "INSERT INTO TM_商品(商品コード, 商品名, 商品区分, 仕入単価, 売上単価)" & _ " VALUES(1001,'商品1001', '区分1001', 10000, 15000)" 'コマンドオブジェクト(SQL文と接続オブジェクト) Dim Cmd As New OracleCommand(SQL, Conn) 'トランザクションをコマンドオブジェクトに関連付け Cmd.Transaction = Trans 'INSERT文の実行 Dim nCnt As Integer = Cmd.ExecuteNonQuery() 'INSERT-SQL文2 SQL = "INSERT INTO TM_商品(商品コード, 商品名, 商品区分, 仕入単価, 売上単価)" & _ " VALUES(1002,'商品1002', '区分1002', 10000, 15000)" 'コマンドオブジェクトへのSQL文設定 Cmd.CommandText = SQL 'INSERT文の実行 nCnt = Cmd.ExecuteNonQuery() 'UPDATE-SQL文 SQL = "UPDATE TM_商品 SET 売上単価 = 20000 WHERE 商品コード = 1001" 'コマンドオブジェクトへのSQL文設定 Cmd.CommandText = SQL 'UPDATE文の実行 nCnt = Cmd.ExecuteNonQuery() 'DELETE-SQL文 SQL = "DELETE TM_商品 WHERE 商品コード = 1002" 'コマンドオブジェクトへのSQL文設定 Cmd.CommandText = SQL 'DELETE文の実行 nCnt = Cmd.ExecuteNonQuery() 'コミット実行 Trans.Commit() 'オラクル接続クローズ Conn.Close() Catch exora As OracleException 'ロールバック実行 Trans.Rollback() 'オラクルエラー MsgBox(exora.Number & ":" & exora.Message) Catch ex As Exception 'ロールバック実行 Trans.Rollback() 'PGエラー MsgBox(ex.Message) Finally Conn.Dispose() End Try End Sub■関連記事 ⇒トランザクション・ロック BLOB型の利用方法:画像データをテーブルに設定■テーブルにBLOB型を設定しその中に画像データファイルを格納する方法を以下に示します。テストを行うためのBLOBフィールドを持つテーブルを用意します。(以下のCREATE文でテーブルを作成) CREATE TABLE TT_BLOB( ID NUMBER(5,0) primary key, BLOB blob ); 画像ファイルはテストのため、「test.png」というファイル名とします。(画像の内容は「Oracleへの接続と切断」でメッセージとして表示しているものです) 'BLOBデータの新規追加の実行 Private Sub Button5_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button5.Click '接続文字列 Dim strConnect As String = _ "Data Source=//192.168.1.207/test; User ID=test;Password=test;" 'テスト画像データをバイト配列に読込 Dim fs As New System.IO.FileStream("test.png", IO.FileMode.Open, IO.FileAccess.Read) Dim blob(fs.Length) As Byte fs.Read(blob, 0, fs.Length) 'オラクル接続オブジェクト Dim Conn As New OracleConnection(strConnect) Try 'オラクル接続オープン Conn.Open() 'INSERT-SQL文 Dim SQL As String = "INSERT INTO TT_BLOB(ID, BLOB) VALUES(1, :blob)" 'コマンドオブジェクト(SQL文と接続オブジェクト) Dim Cmd As New OracleCommand(SQL, Conn) '引数の定義 Dim prm As OracleParameter = Cmd.Parameters.Add("blob", OracleDbType.Blob) 'BLOBデータの設定 prm.Value = blob 'INSERT文の実行 Dim nCnt As Integer = Cmd.ExecuteNonQuery() 'オラクル接続クローズ Conn.Close() Catch exora As OracleException 'オラクルエラー MsgBox(exora.Number & ":" & exora.Message) Catch ex As Exception 'PGエラー MsgBox(ex.Message) Finally Conn.Dispose() End Try End Sub ■BLOBデータを取得し表示上で登録されたBLOBデータを読込んで、フォーム上のPictureBoxに設定し表示します。 SELECT文でBLOBデータのカラムを指定し、コマンドオブジェクトを生成後、OracleDataReaderで読み込み処理を行います。 OracleDataReader の GetOracleBlob メソッドでBLOBデータの取得を行い、MemoryStreamオブジェクトに変換後、 PictureBoxに画像設定を行います。 'BLOBデータの表示 Private Sub Button5_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button5.Click '接続文字列 Dim strConnect As String = _ "Data Source=//192.168.1.207/test; User ID=test;Password=test;" 'オラクル接続オブジェクト Dim Conn As New OracleConnection(strConnect) Try 'オラクル接続オープン Conn.Open() 'SELECT-SQL文 Dim SQL As String = "SELECT BLOB FROM TT_BLOB WHERE ID = 1" 'コマンドオブジェクト(SQL文と接続オブジェクト) Dim Cmd As New OracleCommand(SQL, Conn) Cmd.CommandType = CommandType.Text '読込オブジェクトに接続 Dim dr As OracleDataReader = Cmd.ExecuteReader() '読込処理 If dr.Read Then 'BLOBデータの取得 Dim blob As Oracle.DataAccess.Types.OracleBlob = dr.GetOracleBlob(0) 'BLOBデータをMemoryStreamオブジェクトに変換 Dim mstr As New System.IO.MemoryStream(blob.Value) '画像設定 PictureBox1.Image = New Bitmap(mstr) End If '読込オブジェクトのクローズ dr.Close() dr = Nothing 'オラクル接続クローズ Conn.Close() Catch exora As OracleException 'オラクルエラー MsgBox(exora.Number & ":" & exora.Message) Catch ex As Exception 'PGエラー MsgBox(ex.Message) Finally Conn.Dispose() End Try End Sub ■BLOBデータ更新1:OracleCommandおよびOracleParameterを使用したLOBの更新既に存在するBLOBデータを更新する方法は、新規追加の場合と同じになります。違いはSQL文がUPDATE文である点のみです。 'BLOBデータの更新の実行1 Private Sub Button5_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button5.Click '接続文字列 Dim strConnect As String = _ "Data Source=//192.168.1.207/test; User ID=test;Password=test;" 'テスト画像データをバイト配列に読込 Dim fs As New System.IO.FileStream("test2.png", IO.FileMode.Open, IO.FileAccess.Read) Dim blob(fs.Length) As Byte fs.Read(blob, 0, fs.Length) 'オラクル接続オブジェクト Dim Conn As New OracleConnection(strConnect) Try 'オラクル接続オープン Conn.Open() 'UPDATE-SQL文 Dim SQL As String = "UPDATE TT_BLOB SET BLOB = :blob WHERE ID = 1" 'コマンドオブジェクト(SQL文と接続オブジェクト) Dim Cmd As New OracleCommand(SQL, Conn) '引数の定義 Dim prm As OracleParameter = Cmd.Parameters.Add("blob", OracleDbType.Blob) prm.Value = blob 'UPDATE文の実行 Dim nCnt As Integer = Cmd.ExecuteNonQuery() 'オラクル接続クローズ Conn.Close() Catch exora As OracleException 'オラクルエラー MsgBox(exora.Number & ":" & exora.Message) Catch ex As Exception 'PGエラー MsgBox(ex.Message) Finally Conn.Dispose() End Try End Sub ■BLOBデータ更新2:ODP.NET LOBオブジェクトを使用したLOBの更新 BLOBデータを更新方法のもう一つの方法は、トランザクションを開始し SELECT FOR UPDATE でBLOBデータの行を取得します。 その後、OracleDataReader の GetOracleBlobForUpdate メソッドでBLOBデータ(OracleBlob)そのものを取得します。 この処理で一つ注意点があります。SELECT文の中で取得するカラムに PRIMARY KEY を指定しないと、以下のエラーが発生します。 (以下の例では SELECT BLOB, ID FROM
... の中の ID です) 'BLOBデータの更新の実行2 Private Sub Button5_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button5.Click '接続文字列 Dim strConnect As String = _ "Data Source=//192.168.1.207/test; User ID=test;Password=test;" 'テスト画像データをバイナリ配列に読込 Dim fs As New System.IO.FileStream("test.png", IO.FileMode.Open, IO.FileAccess.Read) Dim blobByte(fs.Length) As Byte fs.Read(blobByte, 0, fs.Length) 'オラクル接続オブジェクト Dim Conn As New OracleConnection(strConnect) 'トランザクションオブジェクト Dim Trans As OracleTransaction = Nothing Try 'オラクル接続オープン Conn.Open() 'トランザクション開始 Trans = Conn.BeginTransaction(IsolationLevel.ReadCommitted) 'SELECT-SQL文 Dim SQL As String = "SELECT BLOB, ID FROM TT_BLOB WHERE ID = 1 FOR UPDATE" 'コマンドオブジェクト(SQL文と接続オブジェクト) Dim Cmd As New OracleCommand(SQL, Conn) Cmd.CommandType = CommandType.Text 'トランザクションをコマンドオブジェクトに関連付け Cmd.Transaction = Trans '読込オブジェクトに接続 Dim dr As OracleDataReader = Cmd.ExecuteReader() '読込処理 If dr.Read Then 'BLOBデータの取得 Dim blob As Oracle.DataAccess.Types.OracleBlob = dr.GetOracleBlobForUpdate(0) '読込オブジェクトのクローズ dr.Close() 'BLOBへの書き込み blob.Write(blobByte, 0, blobByte.Length) 'コミット Trans.Commit() End If '読込オブジェクト廃棄 dr.Dispose() 'オラクル接続クローズ Conn.Close() Catch exora As OracleException 'ロールバック Trans.Rollback() 'オラクルエラー MsgBox(exora.Number & ":" & exora.Message) Catch ex As Exception 'ロールバック Trans.Rollback() 'PGエラー MsgBox(ex.Message) Finally Conn.Dispose() End Try End Sub ■VB.NET関連記事 ⇒「VB.NET-TIPS」ページ |