2017-07-18 121 views
-3

我們正在開發數據訪問框架庫以供業務組件調用以訪問Xamarin應用程序的SQLlite數據庫。 要針對DB執行SELECT Sql,請遵循以下方法。對於匿名方法和使用新功能來說很陌生,所以需要建議 我期待反正可以提高此實現的效率。返回列表的通用方法

private static readonly Lazy<AppDB> Lazy = new Lazy<AppDB>(() => new AppDB()); 

     public static AppDB Instance => Lazy.Value; 
     private SQLiteAsyncConnection _conn =null; 
     static object locker = new object(); 
     private SQLiteAsyncConnection DbConnection 
     { 
      get 
      { 
       if (_conn == null) 
       { 
        LazyInitializer.EnsureInitialized(ref _conn, DependencyService.Get<ISQLite>().GetAsyncConnection); 
       } 
       return _conn; 
      } 
     } 
    public List<T> ExecuteQuery<T>(string sqlQuery, object[] parameters = null) where T: class 
      { 
       List<T> l = new List<T>(); 
       try 
       { 
        l = parameters !=null ? DbConnection.QueryAsync<T>(sqlQuery,parameters).Result : DbConnection.QueryAsync<T>(sqlQuery).Result; 
       } 
       catch (Exception e) 
       { } 
       return l; 
      } 
+0

你有什麼問題具體?你的問題現在有點寬泛。 – Maxime

+0

請不要編寫像catch(Exception e)這樣的代碼,更不要說catch(Exception e){}'。捕捉基本異常是一種糟糕的反模式。 – Enigmativity

+0

你爲什麼叫'新列表();'只是爲了重新分配'l'呢? – Enigmativity

回答

0

在catch塊中,您可以爲列表分配空值,以便您可以基於null條件在屏幕上執行正確的消息和錯誤處理。

catch (Exception e) 
{ 
    l = null; 
    //You can log the exception details in windows event viewer to see complete details. 
} 
0

您應該重新拋出異常或拋出新的異常並在您調用它時捕獲它。

public List<T> ExecuteQuery<T>(string sqlQuery, object[] parameters = null) where T: class 
{ 
    try 
    { 
     var l = parameters !=null ? DbConnection.QueryAsync<T>(sqlQuery,parameters).Result : DbConnection.QueryAsync<T>(sqlQuery).Result; 
     return l; 
    } 
    catch (Exception e) 
    { 
     throw; 
     // or throw new MyCustomRepositoryException(e); 
    } 
} 

// Usage: 
try 
{ 
    var documents = myClass.ExecuteQuery<Document>(...); 
} 
catch (Exception ex) // or catch (MyCustomRepositoryException ex) 
{ 
    // do whatever your system is expected to do in case of error 
} 

Tehnically,你可以忽略的錯誤並返回nullnew List<T>,但在大多數情況下,它在結構上是錯誤的:

  • 「給我列表或拋出異常」是一個方法的預期行爲與List<T>返回值
  • 被叫方將不能區分空列表和錯誤(在List<T>情況下)/未找到對象或錯誤(在T情況)
  • 它增加了DbConnection的一些要求,它應該是可以恢復的。某些對象無法從異常中恢復,因此,你可以嘗試繼續在故障狀態與對象的工作
  • 它並不能保證停止執行代碼,它可能會導致被調用方法意外的行爲或代碼
  • 等甚至其他地方。
1

你的代碼應該是更多這樣的:

public List<T> ExecuteQuery<T>(string sqlQuery, object[] parameters = null) where T : class 
{ 
    if (parameters != null) 
    { 
     return DbConnection.Query<T>(sqlQuery, parameters) 
    } 
    else 
    { 
     return DbConnection.Query<T>(sqlQuery); 
    } 
} 

或者更好的是,這樣的事情:

public List<T> ExecuteQuery<T>(string sqlQuery, object[] parameters = null) where T : class 
{ 
    using (var dbc = new DbConnection()) 
    { 
     if (parameters != null) 
     { 
      return dbc.Query<T>(sqlQuery, parameters).ToList(); 
     } 
     else 
     { 
      return dbc.Query<T>(sqlQuery).ToList(); 
     } 
    } 
} 

現有代碼中存在如此多的問題。如果你真的想得到一些好的指導,你應該發佈更多的代碼。

+0

我添加了額外的代碼.. QueryAsync是SqlliteAsynconnection對象的內置方法 – Sarav