2016-07-26 76 views
1

我需要通過ADO.Net優化數據訪問。爲項目requeriments我不能使用Linq或實體...並行運行查詢

因此,我推出15個獨立ADO.NET查詢。我遵循的標準,打開連接,啓動查詢,使用DataReader獲取數據,將它們存儲在類中,最後我關閉連接...

但我感覺像項目是不夠快。所以,夥計們,你們能否教我一些提高速度的技巧?

我的數據庫是SQL Server,並且據我所知,我正在查詢實體的查詢。

編輯:

private void Connect(string comando) { 
    try { 
     string cadena = "connection_data"; 
     Cn = new SqlConnection(cadena); 
     Cn.Open(); 
     SqlCommand Com = new SqlCommand(comando, Cn); 
     Datos = Com.ExecuteReader(); 
    } 
    catch (Exception e) 
    { 
     // 
    } 
} 

    private void Close() 
    { 
     try 
     { 
      Cn.Close(); 
      Datos.Close(); 
     } 
     catch (Exception e) 
     { 
      // 
     } 
    } 

    public List<class1> getClass1(double id) 
    { 
     Connect("SELECT TOP (5) CASE WHEN [table1].[attribute1] IN (7, 12, 13, 14, 15, 16, 17, 18, 19, 28, 29) THEN 'random_name' " + 
      "WHEN [table1].[attribute3] = NULL AND [table1].[attribute2] = NULL THEN 'random_name2' WHEN [table1].[attribute3] = NULL THEN [table1].[attribute3] ELSE " 
// bla bla bla bla and so on and I have 15 massive queries like this one; 

     List<class1> res = new List<class1>(); 

     if (Datos.HasRows == true) 
     { 
      while (Datos.Read()) 
      { 
       class1obj = new class1(); 
       obj.at1= class1.cont + 1; 
       obj.at2= class1.cont + 1; 
       class1.cont++; 
       obj.at3= "random_value"; 
       obj.at4= Datos.GetValue(0); 
       obj.at5= Datos.GetValue(1); 
       res.Add(obj); 
      } 
      Close(); 
     } 
     return res; 
    } 
+0

您應該顯示代碼和查詢... –

+0

@Gilad Green。爲什麼?標準代碼的標準查詢...查詢已優化,代碼是標準的...無論如何,只是爲了如果我錯過了一些東西,我編輯它... –

+1

雅我可以理解,但我說關於代碼和查詢,因爲也許你可以加入查詢,或者你可以並行執行。在任何情況下,爲了確定而不是給出不相關的答案,某些代碼是有用的。 –

回答

1

如果你有創建爲每個類,那麼你可以做什麼的功能是這樣的:

而是具有功能getClass1有一個接口:

public interface IBuildClass<TClass> 
{ 
    Task<IEnumerable<TClass>> BuildAsync(double id); 
} 

添加接口的基類,該接口將作爲依賴項請求連接對象到數據庫

public abstract class BuildClassBase<TClass> : IBuildClass<TClass> 
{ 
    public BuildClassBase(SqlConnection connection) 
    { 
     Connection = connection; 
    } 

    public async Task<IEnumerable<TClass>> BuildAsync(double id) 
    { 
     //Execute query and pass results to InnerBuid 
     return InnerBuildAsync(/*Pass DataTable*/); 
    } 

    public abstract async Task<IEnumerable<TClass>> InnerBuildAsync(DataTable data); 

    //Ctor of each derived class will set the value 
    public string Query { get; protected set; } 
    public SqlConnection Connection {get; set; } 
} 

然後一個特定的實現匹配你想創建的每個類。在你的代碼

public interface IBuildClassFactory 
{ 
    IBuildClass<TClass> GetBuilder<TClass>(); 
} 

然後,你目前執行所有的15種方法,你可以爲每個類創建一個Task然後await buildClassFactory.GetBuilder<ClassA>().BuildAsync(id):您還可以添加一個工廠他們。例如:

double id = 1; 
Task createClassA = buildClassFactory.GetBuilder<ClassA>().BuildAsync(id); 
Task createClassB = buildClassFactory.GetBuilder<ClassB>().BuildAsync(id); 
Task createClassC = buildClassFactory.GetBuilder<ClassC>().BuildAsync(id); 
.... 

Task.WaitAll(createClassA, createClassB, createClassC....); 

//And then get result from tasks 
+0

Uuuuffff。謝謝@吉拉德格林。看起來可能是工作。至少它會改善我的迴應時間。但是這超過了我。我需要時間來實施它。我會讓你知道這件事...感謝你的伴侶...你很酷:)))) –

+0

@EliasMP - 帶來很多樂趣:)深入研究依賴注入 - 真正改善了代碼:)閱讀關於它,也許還有關於它的以前的問題。檢查Castle Windsor/ninject等IoC容器...... –