2013-02-27 122 views
2

我正在使用ASP.NET Web窗體並試圖從SQL服務器加載數據。下面是我如何做到這一點的僞代碼:減少往返數據庫

connect1 = connect("database") 
categories = connect.query("select * from category") 
loop categories as category 

    print category   

    connect2 = connect("database") 
    subCategories = connect2.query("select * from subCategory where category = @0", category) 
    loop subCategories as subCategory 

      print subCategory    

      connect3 = connect("database") 
      items = connect3.query("select * from item where subCategory = @0", subCategory) 
      loop items as item 
       print item 
      end loop 'items 
      connect3.close 

    end loop 'subcategories 
    connect2.close 

end loop 'categories 
connect1.close 

正如你所看到的,有很多往返於我的腳本發生的情況,這是好的,當我只有幾個記錄,但有數百打交道時或更多,這需要永遠顯示數據。

我該怎麼做才能減少往返次數?我想從數據庫中一次獲得所有數據,然後在應用程序端對它們進行分類,但這有可能嗎?

+0

在一個查詢中完成所有操作。看看[CTE](http://msdn.microsoft.com/en-us/library/ms190766%28v=sql.105%29.aspx)。這個問題更適合[codereview](http://codereview.stackexchange.com/) – nunespascal 2013-02-27 08:43:39

+0

@nunespascal爲什麼選擇CTE? – dpp 2013-02-27 08:48:49

+0

CTE,以便您可以遞歸地獲取子類別。 – nunespascal 2013-02-27 09:08:26

回答

2

爲什麼不通過一個含有連接的查詢獲取所需的所有數據,然後在客戶端進行篩選;或者你可以做的其他方式(它沒有太多的數據)將數據作爲XML獲取,將其反序列化爲可循環迭代。

,我看到它,你做

categories = connect.query("select * from category"); 

因此,所有你需要的是:手動映射

whole_data = connect.query("select * from category c inner join subCategory sc on c.id = sc.id inner join item i on i.id = si.id") /*or some kind of*/ 
/*let me think that whole_data is a list of objects, not a dataset*/ 
categories = whole_data.Distinct(d => d.category); 
subCategories = whole_data.Distinct(d => d.subCategories); 
/*and then do your loops*/ 

C#代碼可能是這樣的:

 using (var connection = new SqlConnection(connString)) 
     { 
      connection.Open(); 
      var command = connection.CreateCommand(); 
      command.CommandText = "select * from ..."; 

      var reader = command.ExecuteReader(); 
      while (reader.Read()) 
      { 
       var a = reader.GetInt32(0); 
       var b = reader.GetString(1); 
       /*so basically you read all fields that you get from DB and build object here, then you add it to List or any other kind of collection*/ 
      } 
     } 
+0

這就是我的想法,但問題是,如何?有這樣的事情,我需要在應用程序端查詢結果集的庫或類。 – dpp 2013-02-27 08:51:19

+0

僞代碼我會怎麼做:) – Sergio 2013-02-27 08:58:40

+0

我明白,你正在嘗試幫助,但我不尋找僞代碼或實際代碼,如果你知道任何圖書館或類,我可以用來查詢「whole_data」,它會是什麼? – dpp 2013-02-27 09:01:36

1

取決於延遲到數據庫,即使彙集,連接也可能需要很長時間。爲了避免這種情況,請將所有連接設置在循環之外。也就是說,不要嵌套連接。相反,它的結構是這樣的:

Connect1 = connect("database") 
Connect2 = connect("database") 
Connect3 = connect("database") 

sql 1 nest 
    sql 2 nest 
     sql 3 nest 
     end nest 
    end nest 
end nest 

close connections. 

如果每個循環10個條目,並連接需要10毫秒,你會花10×10×10 = 1000個毫秒只是在做連接。把它們放在巢外,然後你只花30 mS連接。在每個嵌套完成時關閉數據讀取器,以便可以重新使用連接。

當然,對於您展示的示例,執行單個查詢是最佳解決方案。 但是,如果您的查詢是有選擇的,並且您需要執行一些無法在查詢中進行組合的業務邏輯,那麼請始終將您的連接移到循環之外。