Я вычисляю выдающийся баланс клиентов в C# Winforms. Код ниже работает, но он медленный. Есть ли способ улучшить его работу?MS SQL Query in C# - низкая производительность
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 запросы, когда вы должны быть просто использовать соединение ...) –