DOBON.NET DOBON.NETプログラミング掲示板過去ログ

テキストファイルの一括読込み

環境/言語:[C# oracle8]
分類:[.NET]

カンマ区切りのテキストファイルの内容を条件付で読込みし、
その結果をOracleの指定DBへInsertしたいのですが、、、

C#上のコーディングで、
Oracleのsqlldrの様なコトは出来ないでしょうか?

最初は『ファイルの件数分ループして条件に合うもののみをDBへ』
と言った処理をしていたのですが、
データ件数が53万件近くあるもので、
時間がかかりすぎてしまいます。

sqlldrをバッチで作成し、
『C#側からプロセス生成⇒起動』で、と思い実行したのですが
これだと、sqlldrの成功/失敗が正しく取得できなくて。

ご存知の方がいらっしゃいましたら
ご教授宜しくお願いしますm(_ _)m
的外れな内容かも知れませんが‥‥

> sqlldrをバッチで作成し、
> 『C#側からプロセス生成⇒起動』で、と思い実行したのですが
> これだと、sqlldrの成功/失敗が正しく取得できなくて。

DOSコマンドを実行し出力データを取得する
http://dobon.net/vb/dotnet/process/standardoutput.html

では実現できないのでしょうか?
回答ありがとうございます。

下記の様なコードで実装しているのですが、
生成したプロセスから取得したはずのハンドル(プロセスID)と
実際に起動しているプロセスのプロセスIDが違い(タスクマネージャで確認)
GetExitCodeProcess の結果が正しく取得できませんでした。

以前、似たような感じで処理を行った時は
上手くいったのですが・・・

//-------------------------------------------------------
// プロセスの起動情報を作成
ProcessStartInfo si = new ProcessStartInfo();
si.FileName = (作成したバッチEXEのパス)
si.UseShellExecute = false;
si.WindowStyle = ProcessWindowStyle.Hidden;
// プロセスを作成
Process p = new Process();
p.StartInfo = si;
// プロセス起動
p.Start();
// プロセスのハンドルを取得
IntPtr lpProcess = p.Handle;
// プロセスの終了を待機
p.WaitForExit();

// プロセスの終了ステータスを取得
if(!GetExitCodeProcess(lpProcess, ref lpEndCode))
{
throw new Exception();
}
// 異常終了の場合
if(lpEndCode != 0)
{
}
//-------------------------------------------------------

宜しくお願いしますm(_ _)m
> 生成したプロセスから取得したはずのハンドル(プロセスID)と
> 実際に起動しているプロセスのプロセスIDが違い(タスクマネージャで確認)

> si.FileName = (作成したバッチEXEのパス)
> p.StartInfo = si;
> IntPtr lpProcess = p.Handle;

 ???
 バッチ”EXE”なるものがどのようなものを指しているか解りませんし、私が誤解しているのかも知れませんけれど‥‥

 ここで取得しているのはバッチファイルを起動したことで生じているプロセスのハンドルであって、バッチから起動されているアプリケーションのそれとは異なっていて当たり前ではないのでしょうか?


> GetExitCodeProcess の結果が正しく取得できませんでした。

 バッチファイルが終了コードを返すようになっていれば取得できるのかも知れません。
#お望みの内容ではないでしょうけれども。


 私が先の Tips を紹介したのは、次のように安易に考えたからです。
 バッチファイルを使用せずに ( コマンドプロンプトから行うのと同様に ) 起動すれば、 StandardOutput.ReadToEnd を用いることで『結果』は取得できるのではなかろうかと。

 終了コードを取得したいのであれば、それこそ SQL*Lodaer ( でしたっけ? ) を直接起動すれば良いように思えるのですけれど、そういったことはできないのでしょうか?
2005/06/02(Thu) 18:42:33 編集(投稿者)

ご回答ありがとう御座いました!


結局、ファイルの読込みは別切り出しでやることになり
エラーは LOG から読み込むコトにしました。

SQLLDR.exe は 直接呼出しをすることが出来ましたが、
GetExitCodeProcess から取得できるステータスは同じでした・・・ι(´Д`υ)
解決済み!
> 結局、ファイルの読込みは別切り出しでやることになり
> エラーは LOG から読み込むコトにしました。
とのことですので、もう用をなさないでしょうけれど‥‥


> SQLLDR.exe は 直接呼出しをすることが出来ましたが、
> GetExitCodeProcess から取得できるステータスは同じでした・・・ι(´Д`υ)
というのが得心いかなかったので、こちらでも少し試してみました。

 行ったのは引数指定が不正というパターンのみですけれど、終了コードは取得できたようです。
#尤も、正しい値かどうかは判りません。 UNIX 版で EX_FAIL として定義されているのと同じ値 ( 3 ) でしたが、 Windows 版でどういう意味を持つ値なのか資料を見つけられませんでした。

 そこで気になったのは、まぁさんの環境です。
> 環境/言語:[C# oracle8] 
とありましたけど、正確なバージョンはいくつになるのでしょうか?
 その後の調査でみつけたページにはリリースによっては終了コードが返されないとありました。この辺りの問題ということはないですよね?

WindowsNT上で、SQL*Loaderの終了コードを取得する方法を教えて下さい。
https://www.ashisuto.co.jp/standard/faq/past/qa51_7a.html

 他の可能性として考えられるのは GetExitCodeProcess API の宣言に誤りがあるとか‥‥あ、でも過去に実績があるようでしたしそれはないですか(汗)
#尚、終了コードは Process.ExitCode プロパティでも取得できます。

 ともあれ、別のことろに原因があるのではないかと思います。


#問い掛けを行ったりしてますけど、レスして頂かなくても構いませんので(^_^;)
#解決済みのところ、スレ汚し失礼しましたm(__)m

DOBON.NET | プログラミング道 | プログラミング掲示板