いつもお世話になっております。
データベースへのインポート/エクスポートを行うツールを作成しようと
しています。
プロジェクトは
(1)Windowsアプリケーション ←母体
(2)クラスライブラリ ←DLL化して母体にImportsしています。
データベースはオラクルです。
エクスポートの種類として、
・種別1 オーナー=ユーザ1
・種別2 オーナー=ユーザ2
・種別3 オーナー=ユーザ1、ユーザ2
を持ち、いずれもエクスポートは問題なく出来ました。
インポートの際には、一度オーナーユーザをドロップしてから再作成し、
エクスポートファイルをインポートするような形式になっています。
下記↓はエクスポート実行ファイルの中身です。
sqlplus @DropUser ←ユーザドロップ用のSQL文
sqlplus @CreateUser ←ユーザ生成用のSQL文
imp system/manager@XXX; 〜 ←実際のインポートコマンド
(1)のアプリケーションでは、インポート/エクスポートを実行する前に
必要な情報を(2)のライブラリを通してデータベースから取り出しています。
(そのときの接続ユーザはユーザ1になります。)
取得は非接続型のデータアクセス(OracleDataAdapter)を使用しており、
これは、.Fill(データテーブル)実行後に自動的に接続を切ってくれますし、
OracleConnectionはState=0になっているのも確認できています。
ですが、情報を取得後にエクスポートしたデータ(種別1)をインポート
しようとすると、
「現在接続中のユーザを削除することはできません」
と言われてしまいます。
同じ状況で種別2のインポートは可能でした。
また、情報を取得する前に同じく種別1のインポートファイルを手動で
実行すると、この場合は正常にインポートできました。
接続解除されているはずなのにどうして接続中と言われてしまうのでしょうか?
どなたかご存知の方いましたらご教授願います。
>下記↓はエクスポート実行ファイルの中身です。
> sqlplus @DropUser ←ユーザドロップ用のSQL文
> sqlplus @CreateUser ←ユーザ生成用のSQL文
> imp system/manager@XXX; 〜 ←実際のインポートコマンド
申し訳ありません。
エクスポートではなく、インポート実行ファイルの中身です。。。
'環境が手元にないので参考程度です
>これは、.Fill(データテーブル)実行後に自動的に接続を切ってくれますし、
>OracleConnectionはState=0になっているのも確認できています。
プログラム上の接続断と実際の接続断にタイムラグがある場合があります。
Oracle側でセッションが残っていないか確認してください。
上記の調べ方がわからなければDB管理者へ聞いてください。
接続プーリングが有効(デフォルト)なのであれば、無効にしてみるとか。
これは、「Oracle Data Provider for .NET 開発者ガイド」を参考にしてください。
http://otn.oracle.co.jp/tech/dotnet/
http://otndnld.oracle.co.jp/tech/windows/odpnet/howto/01_connect/content.html
もげさん、回答ありがとうございます。
セッションの確認は良くわからなかったのですが、接続プーリングを
無効にしてみましたが状況は変わりませんでした。
そこでいろいろ考えた結果、接続ユーザに関しては、ユーザ削除ではなく
テーブル削除で対応する方向で進めていくことにしました。
(テーブル数が多かったので、ユーザ削除を。。。と思っていましたが。)
インポート時のファイルは
sqlplus @DropTable ←ユーザテーブルドロップ用のSQL文
imp system/manager@XXX; 〜 ←実際のインポートコマンド
のように修正して、動作的には問題なく出来ました。
>プログラム上の接続断と実際の接続断にタイムラグがある場合があります。
↑この件に関しては、知らなかった部分でしたので、大変参考になりました。
ありがとうございました。