2017-07-18 120 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