2012-04-18 10 views
-1

PerlプログラムのBCPユーティリティを使用してSQL Serverにファイルをインポートしています。私のPerlプログラムで、次のように私は、bcpコマンドを実行していますPerl system()コマンドは、BCPが失敗したときにエラーを返しません。

SQLState = 22008, NativeError = 0 
Error = [Microsoft][SQL Server Native Client 10.0]Invalid date format 

:インポートプロセスは、次のエラーで失敗したので、私は輸入していたファイルで は、間違った日付の形式があります。

my $myBcp = "bcp.exe" <table name> in <temp file path> -f<format file> -m 1 -h "FIRE_TRIGGERS" -o<log file path> 
my $myResult = system($myBcp); 

$myResultを印刷すると、「0」と表示されます。 「日付フォーマットが無効です」というエラーがあるため、エラーコードが返されます。

誰でも私のperlプログラムで無効な日付のフォーマットエラーをキャッチする方法を教えてもらえますか?次のようにあなたが2>&1によってSTDOUTにSTDERRをリダイレクトする必要があり

おかげ

+2

実際のプログラムでは、 '$ myBcp'の文字列が適切に引用されていて、あなたが上に掲示したものとは違うと思いますか? – TLP

+0

はい適切に引用されています。私はちょうどフォーマットを与えていた。 – user1019072

+2

あなたの実際のコード以外は何も投稿しないでください。そして確かにコンパイルされないコードはありません。混乱を招くだけです。 'system'はエラーコードを返さず、プログラムの終了ステータスだけを返すことに注意してください。 'perldoc -f system'を参照してください。 – TLP

答えて

0

my $myBcp = '"bcp.exe" <table name> in <temp file path> -f<format file> -m 1 -h "FIRE_TRIGGERS" -o<log file path>'; 
my $myResult = `$myBcp 2>&1`; 
print $myResult; 
+0

このコマンドは、my $ myResult = '$ myBcp 2> &1';で動作しますか? $ myResult = system( '$ myBcp 2> &1';) – user1019072

+0

@ user1019072 - バッククォートは、呼び出されたプログラムがSTDOUTに印刷されたものを返します。システムは終了状態を返します。 –

+0

確認していただきありがとうございます。試してみます。 – user1019072

3

system()は、単にそれが呼び出されたプログラムの終了ステータスを返します。 system()が0を返している場合、それはプログラムが終了したものです。一般に、0以外のステータスを持つexit()にエラーを示すプログラムについては、丁寧に考えられますが、これは決してどこにでも強制されるものではありません。それはちょうどそのプログラムがうまく設計されていないことかもしれません。

あなたができることの1つは、プログラムのSTDOUTおよび/またはSTDERRストリームをキャプチャして、特定のパターン、または少なくとも何かを探すことです。 STDERRに何かが印刷されていると、エラーが発生した可能性が高いです。

これらのキャプチャの詳細については、IPC::Run,IPC::Open2またはIPC::Open3を参照してください。

関連する問題