2017-01-20 1 views
0

Эта функция подключается к базе данных postgres и возвращает набор данных.Как вернуть сообщение об ошибке в другую функцию типа возврата?

Две вещи я хочется понять

  1. Если я получаю сообщение об ошибке, как я могу вернуть его?
  2. Это лучший способ вернуть Dataset?

    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

Как примечание стороны, если вы на самом деле не нужен «наконец», вы можете просто опустить это. Кроме того, какую ошибку вы ожидаете получить? Если вы знаете исключение, поймайте только это, это не хорошая практика, чтобы поймать все исключения. –

+0

Спасибо keyuer, но я хочу, как вернуть сообщение об ошибке функции, вызывающей эту функцию? –

+0

Я вижу, ответ ниже кажется многообещающим. –

ответ

0

Я думаю, что было бы здорово, если бы вы вернуть null; Если вам нужно вернуть какое-то настроенное сообщение, значит, вы можете использовать для этого параметры out. Таким образом, чтобы возвращаемое значение было нулевым, если какое-либо исключение происходит в этом случае, параметр out содержит данные об исключении. если Dataset заполнен хорошо, значит, у параметра «Параметр» будут значения «Успех» или что-то в этом роде. Таким образом, метод подпись будет изменена как следующий

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 будет аннулирован в случае каких-либо исключений в противном случае вы можете продолжить его стоимость.

+0

спасибо @ un-lucky –

+0

@Deepakgupta: Рад помочь вам. –

+0

Я думаю, что это вообще плохая идея использовать параметры, у нас даже есть правило анализа кода против него CA1021. –

0

Создать класс:

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

Сохранить ошибку при запросе:

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; 
} 

И результат:

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/en-us/library/system.data.dataset.extendedproperties (v = vs.110) .aspx), если вы не хотите подклассифицировать его, например. 'myDataSet.ExtendedProperties.Add (" Ошибка ", ex.Message);' –

0

Мне нравится иметь общий Resultclass, которые могут быть повторно использованы:

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)