2017-01-20 16 views
0

この関数はpostgresデータベースに接続し、データセットを返します。私は私はそれを返すことができますどのようにエラーが出た場合異なる返品タイプ関数でエラーメッセージを返すにはどうすればよいですか?

  1. をunderstantしたい

    2つのこと?

  2. これはデータセットを返す最善の方法ですか?

    string strODBCDriverName = "DSN=Postgres_32"; 
    
    public DataSet SelectDataSet(string sql, bool isProcedure, Dictionary<string, object> parameters = null) { 
    using (OdbcConnection odbcConnection = new OdbcConnection(strODBCDriverName)) 
    { 
        odbcConnection.Open(); 
        using (OdbcCommand odbcCommand = new OdbcCommand(sql, odbcConnection)) 
        { 
    
         if (isProcedure) odbcCommand.CommandType = CommandType.StoredProcedure; 
         else odbcCommand.CommandType = CommandType.Text; 
    
         if (parameters != null) 
          foreach (KeyValuePair<string, object> parameter in parameters) 
           odbcCommand.Parameters.AddWithValue(parameter.Key, parameter.Value); 
    
         using (OdbcDataAdapter adapter = new OdbcDataAdapter(odbcCommand)) 
         { 
          using (DataSet ds = new DataSet()) 
          { 
    
           try 
           { 
            adapter.Fill(ds); return ds; 
           } 
           catch (Exception ex) 
           { 
            throw (ex); 
           } 
           finally 
           { 
    
           } 
          } 
         } 
        } 
    } 
    } 
    
+0

、あなたが本当に必要としない場合'finally'、あなたはそれを省略することができます。また、どのようなエラーが出ると思いますか?例外を知っていれば、その例外をキャッチしてください。すべての例外をキャッチするのは良い方法ではありません。 –

+0

ありがとうkeyuerが、この関数を呼び出す関数にエラーメッセージを返す方法をしたいですか? –

+0

私は、以下の答えは有望そうだと思う。 –

答えて

0

私はあなたがnullを返す場合、それは素晴らしいことだと思います。あなたがカスタマイズされたメッセージを返す必要があるならば、これにはoutのパラメータを使うことができます。この場合、例外が発生した場合、戻り値はnullになります。outパラメータは例外の詳細を保持します。データセットに十分な値が設定されている場合、outParameterには「成功」などの値が設定されます。だから、メソッドのシグネチャは、次の

public static DataSet SelectDataSet(string sql, bool isProcedure, out string message, Dictionary<string, object> parameters = null) 
{ 
    // Rest of codes here 

    try 
    { 
     message = "Success"; 
     adapter.Fill(ds); 
     return ds; 
    } 
    catch (Exception ex) 
    { 
     message = ex.Message; 
     return null; 
    } 

} 

などのように変更され、あなたはこのように、このメソッドを呼び出すことができます。

string message = String.Empty; 
DataSet resultDataset = SelectDataSet("query here", false, out message); 
if (resultDataset != null) 
{ 
    Console.WriteLine(message); 
    // proceed with resultDataset 
} 
else 
{ 
    Console.WriteLine(message); 
} 

ここresultDatasetは、例外の場合はnullになりますそうでなければ、そのを続行することができます値。クエリの実行中

class DataSetWithError: DataSet 
{ 
    public Exception msg { get; set; } 
} 

保存エラー:

+0

ありがとう@ un-lucky –

+0

@Deepakgupta:お手伝いをしてください。 –

+0

私はそれがCA1021に対してコード解析ルールを持っていても、パラメータを使うのは一般的には悪い考えだと思います。 –

0

クラスを作成します

using (OdbcDataAdapter adapter = new OdbcDataAdapter(odbcCommand)) 
{ 
    DataSetWithError ds = new DataSetWithError(); 

    try 
    { 
     adapter.Fill(ds); 
    } 
    catch (Exception ex) 
    { 
     ds.msg = ex; 
    } 
    finally 
    { 
     adapter.Close(); 
    } 

    return ds; 
} 

そして結果:私は再利用できる汎用Resultclassを持つよう

DataSetWithError dataSetWithError = SelectDataSet(); 
if (dataSetWithError.msg == null) 
{ 
    // Show data 
} 
else 
{ 
    MessageBox.Show(dataSetWithError.msg.ToString()); 
} 
+0

ありがとう@DartAlex ..魅力のように動作します。 –

+0

歓迎です、@ deepak-gupta – DartAlex

+0

または[ExtendedProperty](https://msdn.microsoft。サブクラス化したくない場合は、com/ja-ja/library/system.data.dataset.extendedproperties(v = vs.110)。 'myDataSet.ExtendedProperties.Add(" Error "、ex.Message);' –

0

を:

internal class Result 
    { 
    internal bool IsFailure => !IsSuccess; 

    internal bool IsSuccess { get; } 

    internal string Error { get; } 

    protected Result(bool isSuccess, string error) { 
     IsSuccess = isSuccess; 
     Error = error; 
    } 

    private Result(bool isSuccess) : this(isSuccess, null) { } 

    internal static Result Fail(string error) => new Result(false, error); 

    internal static Result<T> Fail<T>(string error) => 
     new Result<T>(default(T), false, error); 

    internal static Result Ok() => new Result(true); 

    internal static Result<T> Ok<T>(T value) => new Result<T>(value, true); 
} 

internal sealed class Result<T> : Result 
    { 
    internal T Value { get; } 

    internal Result(T value, bool isSuccess) : this(value, isSuccess, null) { } 

    internal Result(T value, bool isSuccess, string error) : base(isSuccess, error) { 
     Value = value; 
    } 

これは、DataSetだけでなく、どのタイプでも使用できます。あなたのケースリターンで

Result<DataSet>だろうと戻りになることができます:

returns ds - >new Result.Ok(d)

throw ex - 側の注意点として>new Result.Fail<DataSet>(ex.Message)

関連する問題