2017-04-13 8 views
0

私はデータベースを切り離すプログラムを作成しています。SQLクエリがエラーなく正しく実行されたかどうかを確認する方法はありますか?

ストアドプロシージャがエラーなしで実行されたかどうかを確認して、ユーザーに完全に完了したことを確認する方法を確認できます。

実行中にtry catchを使用していますが、100%確実ではありません。すべての内部エラーが返されますか?あなたはは、ExecuteNonQuery()の値を確認することができます

return "sp_detach_db '" + dbType[db] + "', 'true'"; 
+0

あなたはそれが信頼性があり、あなたのDBMS –

+1

してくださいであるエンジン。例外がスローされた場合、それを捕捉します。 – McNets

+2

にタグを付け、usin SQL ServerのオラクルやMySQL – stuartd

答えて

2

元のコードは問題ありません(試してみてください)...あなたが渡している文字列は、あなたがしようとしているものの難しい部分です。私はこの答えを見て、0または1の戻り値が返された場合、新しい例外をスローします。ドキュメントを1として

Calling stored procedure with return value

:あなたはRETURN_CODE後です。

https://docs.microsoft.com/en-us/sql/relational-databases/system-stored-procedures/sp-detach-db-transact-sql

Return Code Values 
0 (success) or 1 (failure) 
Result Sets 
None 

擬似C#コード

using (SqlConnection conn = new SqlConnection("MyString")) 
using (SqlCommand cmd = conn.CreateCommand()) 
{ 
    cmd.CommandText = string.Format("sp_detach_db '{0}', 'true'", myDatabaseName); /* where myDatabaseName is a string */ 
    cmd.CommandType = CommandType.Text; 


    var returnParameter = cmd.Parameters.Add("@ReturnVal", SqlDbType.Int); 
    returnParameter.Direction = ParameterDirection.ReturnValue; 

    conn.Open(); 
    cmd.ExecuteNonQuery(); 
    object result = returnParameter.Value; 
    int resultInt = Convert.ToInt32(result); 
    if(0 != resultInt) 
    { throw new ArgumentOutOfRangeException("detach failed");} 
} 
+0

ありがとう非常にありがとう – SCramphorn

+0

ゲイリーの答え(前に投稿した同じ質問)も見てください。 http:// stackoverflow。com/questions/6210027 /呼び出し元のストアドプロシージャと戻り値/ 25674912#25674912コードを投稿したときに思いついたことだと思います。 – granadaCoder

0

、返す:

try 
{ 
    cmd.ExecuteNonQuery(); 
    MessageBox.Show("it has finished"); 
} 
catch (exception ex) 
{ 
ex.ToString(); 
} 

私のコマンドが信頼できない:

私の懸念は、私が書いた場合ということですIntの影響を受ける行 また、Status MessageをSQLから解析して、エラー値を確認することもできます

1

ストアドプロシージャが例外を発生させる可能性がある場合は、 try-catchブロックで例外をキャッチできます。

create procedure MySp 
as 
begin 

     <some operation> 

     if @@error <> 0 
     begin 
      rollback; 
      raiserror('error message', 16, 1); 
      return -1; 
    end 

    return 0; 
end 
+0

SPのコメント。可能ならば私が修正したくないデフォルトのSQLです。これは100台のマシンで使用されるためです。 – SCramphorn

+1

このコードにはロールバックがあります。テンプレートにはbegin-tranやcommit-tranはありません。 IMHO、これはコードを書くためのコードを書いています...ストアドプロシージャはsp_detach_dbを呼び出すことができますが、ストアドプロシージャの内容は "return sp_detach_db(args)"と同じくらい単純なものになります。不要です。すべての例外は、単にC#にバブルアップします...そして、C#コードはまだreturn_code .....(私の答えごとに)を見つける必要があります再び、IMHO。 – granadaCoder

関連する問題