我計算C#Winforms中的優秀客戶餘額。下面的代碼有效,但速度很慢。有什麼辦法可以改善它的表現嗎?C#中的MS SQL查詢 - 性能較差
public DataTable GetOutStandingCustomers()
{
decimal Tot = 0;
DataTable table = new DataTable();
SqlConnection con = null;
try
{
table.Columns.Add("Code", typeof(Int32));
table.Columns.Add("Name", typeof(string));
table.Columns.Add("City", typeof(string));
table.Columns.Add("Tot", typeof(decimal));
string constr = ConfigHelper.GetConnectionString();
string query = "SELECT Code, Name,City FROM Chart WHERE LEFT(CODE,3)='401' AND Code > 401001 ";
string query0 = " SELECT(SELECT ISNULL(SUM(SalSum.Grand),'0') FROM SalSum WHERE SalSum.Code = @Code) +(SELECT ISNULL(SUM(Journals.Amount),'0') FROM Journals WHERE Journals.DrCode = @Code) -(SELECT ISNULL(SUM(RSalSum.Grand),'0') FROM RSalSum WHERE RSalSum.Code = @Code) -(SELECT ISNULL(SUM(Journals.Amount),'0') FROM Journals WHERE Journals.CrCode = @Code)+(SELECT ISNULL(SUM(Chart.Debit),'0') FROM Chart WHERE Chart.Code = @Code) - (SELECT ISNULL(SUM(Chart.Credit), '0') FROM Chart WHERE Chart.Code = @Code)";
Person per = new Person();
con = new SqlConnection(constr);
SqlCommand com = new SqlCommand(query, con);
SqlCommand com0 = new SqlCommand(query0, con);
con.Open();
SqlDataReader r = com.ExecuteReader();
if (r.HasRows)
{
while (r.Read())
{
per.Name = Convert.ToString(r["Name"]);
per.City = Convert.ToString(r["City"]);
per.Code = Convert.ToString(r["Code"]);
com0.Parameters.Clear();
com0.Parameters.Add("@Code", SqlDbType.Int).Value = per.Code;
Tot = Convert.ToDecimal(com0.ExecuteScalar());
if (Tot != 0)
{
table.Rows.Add(per.Code, per.Name, per.City, Tot);
}
}
}
r.Close();
con.Close();
return table;
}
catch (Exception)
{
throw new Exception();
}
}
那麼這部分是慢?你爲什麼要捕捉一個*有用的*異常,只是拋出一個沒有任何信息的異常呢? –
爲什麼2個SQL命令? –
(從根本上看,問題在於你正在做N + 1個查詢,當你應該只是使用連接...) –