2015-10-10 222 views
1

我正在使用Windows應用程序c#。當我將數據表綁定到Datagridview時,速度變慢,我得到一個SQL連接超時錯誤。DataBinding非常慢

同時我的數據表有批量記錄。我怎麼解決這個問題?

代碼:

private void Window_Loaded(object sender, RoutedEventArgs e) 
{ 
    con.StatisticsEnabled = true; 
    con.Open(); 

    DataTable dt = new DataTable(); 

    SqlCommand cmd = new SqlCommand("select * from Stktrn_table", con); 
    SqlDataAdapter adp = new SqlDataAdapter(cmd);   
    adp.Fill(dt); 

    GridDisplay.ItemsSource = dt.DefaultView; 
} 

SqlCommand cmdVoid = new SqlCommand("select party_no, smas_rtno,convert(numeric(18,2),SUM(smas_NetAmount)) as Amount from salmas_table where [email protected] and Smas_Cancel<>1 and smas_rtno<>0 and [email protected] group by smas_rtno, party_no", con); 
cmdVoid.Parameters.AddWithValue("@tDate", dpBillDate.SelectedDate.Value); 
cmdVoid.Parameters.AddWithValue("@tCounter", tCounterNoNew); 
SqlDataAdapter adpVoid = new SqlDataAdapter(cmdVoid); 
adpVoid.Fill(dtVoid); 
+5

嘗試優化您的查詢不要選擇*,選擇你需要的那些值。 –

+2

使用像LIMIT這樣的選項來限制返回的數據集的數量 –

+0

我使用的只是選擇特定的日期明智....但我變得非常緩慢......上面的代碼只是一個樣本 – Munies

回答

1

此行

SqlCommand cmd = new SqlCommand("select * from Stktrn_table", con); 

將是你的問題。不要選擇數據庫中的所有行,並使用TOP

SELECT TOP 100 Column1, Column2, Column3 FROM Stktrn_table 

一般SELECT *是不好的做法進行限制。

或者,也可以實施分頁,以便按需加載行而不是預先加載。

查詢如何在SQL Server管理工作室中運行?這應該是您查詢從數據庫返回多久的初始指標。

您也可以使用存儲過程,這可能會使您在原始SQL查詢中獲得性能優勢。

+0

Spot On !! @DarrenDavis –

+0

查詢明智我沒有任何問題...我使用選擇特定的日期明智只...上述代碼只是一個示例查詢。我正在使用存儲過程,索引.. – Munies

+0

@Munies - 如何返回行?數據綁定不應該很慢。請粘貼相關代碼,以便我們提供更準確的答案。 –

0

第一件事您不應該使用像這樣的Select * from table_name而應該使用選擇column_1,column_2,column3,column_n即只選擇您需要的列。

第二件事總是使用類(BLL和DLL),而不是在頁面加載或任何形式下直接對數據庫進行編碼。

第三總是使用try catch塊。

第三件事,每當你創建一個對象時,你應該在finally try塊中處理它。前者爲 。

DataTable dt = null; 

SqlDataAdapter da = null; 

SqlConnection con = null; 
try 

{ 

con=new SqlConnection("Connection_Source"); 

con.Open(); 

da = new DataAdapter("select * from table_name",con); 

dt=new DataTable(); 

da.Fill(dt); 

dataGridViewObj.DataSource=dt; 

} 

catch(Exception ex) 

{ 

MessageBox.Show(ex.Message); 

} 

finally 

{ 

if(con.State==ConnectionState.Open) 

con.Close(); 

dt.Dispose(); 

if(dt!=null) 

dt=null; 

da.Dispose(); 
if(da!=null) da=null; 
} 
+0

'使用'關鍵字在沒有'Try .. Catch'的情況下執行相同的操作。 – Fabio

+0

好的,謝謝...我會盡力做到這一點.... – Munies