Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / ADO vs. ADO.NET / 8 сообщений из 8, страница 1 из 1
09.07.2004, 08:37
    #32596604
dr.FausT
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ADO vs. ADO.NET
Начал постигать C# и ADO.NET.
Вопрос такой, имеем идентичные приложения написаные на Delphi 6 и C#.NET.
Оба работают с базой. Но ! В C# приложении запросы выполняются раза в 3 медленнее. Где Грабли ?

C#
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
static string  sConnectionString  = "workstation id=ws;packet size=4096;integrated security=SSPI;data source=serv;persist security info=False;initial catalog=base";
public SqlConnection cnNorthwind = new SqlConnection(sConnectionString);
public DataSet dsProducts = new DataSet();
public DataSet details = new DataSet();
public ArrayList history = new ArrayList();
public int curlevel;
public DataGridTableStyle tableStyle = new DataGridTableStyle(false);
public string top;
public string papa;
private void Form1_Load(object sender, System.EventArgs e)
{			
             curlevel =  0 ;
	history.Add("root");
	string s;
	s = "c:/111.xml";
	System.IO.FileInfo  FileInf = new System.IO.FileInfo(s);
	if (FileInf.Exists)
	{
	dsProducts.ReadXml(s);
	dataGrid1.DataSource = dsProducts;
	dataGrid1.DataMember = "root";
	}   
	else
	{   
	SqlCommand cmdProducts = new SqlCommand("tree_getChilds", cnNorthwind);
	cmdProducts.CommandType = CommandType.StoredProcedure;
	SqlDataAdapter daGetProducts = new SqlDataAdapter(cmdProducts);
	daGetProducts.Fill(dsProducts, "root");
	dataGrid1.DataSource = dsProducts;
	dataGrid1.DataMember = "root";				
            }
}

private void dataGrid1_Click(object sender, System.EventArgs e)
{		
  id = dsProducts.Tables[history[curlevel].ToString()].Rows[dataGrid1.CurrentCell.RowNumber]["id"].ToString();
  Guid g = new Guid(id);
  SqlCommand det = new SqlCommand("Tree_getChildAllSetAttributes", cnNorthwind);
  det.CommandType = CommandType.StoredProcedure;
  SqlParameter prmCustomerID = new SqlParameter();
  prmCustomerID.ParameterName = "@id";
  prmCustomerID.SqlDbType = SqlDbType.UniqueIdentifier;
  prmCustomerID.Value = g;
  det.Parameters.Add(prmCustomerID);
  SqlDataAdapter daGetDetails = new SqlDataAdapter(det);
  details.Clear();
//==============TORMOZ ON==================
  daGetDetails.Fill(details,"details");
//==============TORMOZ OFF=================
  dataGrid2.DataSource = details;
  dataGrid2.DataMember = "details";
}
Тормозит не выражении daGetDetails.Fill(details,"details");


Delphi

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
procedure TForm1.FormCreate(Sender: TObject);
begin
  ADOQuery1.Close;
  ADOQuery1.SQL.Clear;
  ADOQuery1.sql.add('tree_getChilds');
  ADOQuery1.open;
end;

procedure TForm1.DBGrid1CellClick(Column: TColumn);
var 
  id,str:string;
begin
  id:=ADOQuery1.fieldbyname('id').asstring;
  ADOQuery2.Close;
  ADOQuery2.SQL.Clear;
  str:='Tree_getChildAllSetAttributes '+# 39 +id+# 39 ;
  ADOQuery2.sql.add(str);
  ADOQuery2.open;
end;


Всё летает.
...
Рейтинг: 0 / 0
09.07.2004, 10:17
    #32596718
Bigheadman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ADO vs. ADO.NET
Dataset в ADO.NET и RecordSet в ADO - суть абсолютно разные вещи.
Подробнее - см. различные статьи по сравнению ADO.NET и ADO, коих написано море.
Кстати не путайте запросы к СУБД и различные операции в приложении. Запросы к СУБД в этих двух технологиях выполняются абсолютно одинаково с точки зрения скорости выполнения.
...
Рейтинг: 0 / 0
09.07.2004, 10:29
    #32596743
dr.FausT
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ADO vs. ADO.NET
Насколько я понял, Fill заполняет таблицу из результатов запроса ?
...
Рейтинг: 0 / 0
10.07.2004, 13:35
    #32598498
Sa
Sa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ADO vs. ADO.NET
DataAdapter использует DataReader, для того чтобы заполнить DataTable|DataSet. В результате получаем отсоединненый набор данных.
Кроме того вы используете, нетипизированный DataSet следовательно колосальное количество времени тратится на считывание схемы данных.

Код: plaintext
 uid  =  S a
...
Рейтинг: 0 / 0
12.07.2004, 06:23
    #32598923
dr.FausT
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ADO vs. ADO.NET
>Кроме того вы используете, нетипизированный DataSet следовательно >колосальное количество времени тратится на считывание схемы данных.

А как ускорить весь процесс ?
...
Рейтинг: 0 / 0
12.07.2004, 08:23
    #32598962
Sa
Sa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ADO vs. ADO.NET
Я все таки не уверен, по поводу корректности сравнивания ADO.NET и ADO. Уж слишком они разные.

А как ускорить весь процесс ?

Не считывать метаданные и например использовать типизированный DataSet.
Думаю у вас будет исключение, при Fill:
Код: plaintext
1.
2.
3.
4.
5.
6.
details.Clear();
//==============TORMOZ ON==================
daGetDetails.MissingSchemaAction = MissingSchemaAction.Error;  // add this line
daGetDetails.Fill(details,"details");
//==============TORMOZ OFF=================
dataGrid2.DataSource = details;
Попробуйте... ???????

Как еще можно ускорить? на некоторых данных, помогает отключение ограничений (используем типизированный DataSet):
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
details.Clear();
details.EnforceConstraints = false;
//==============TORMOZ ON==================
daGetDetails.MissingSchemaAction = MissingSchemaAction.Error;
daGetDetails.Fill(details,"details");
//==============TORMOZ OFF=================
details.EnforceConstraints = true;
dataGrid2.DataSource = details;
...
Рейтинг: 0 / 0
12.07.2004, 12:16
    #32599392
dr.FausT
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ADO vs. ADO.NET
Sa
Не считывать метаданные и например использовать типизированный DataSet.
Думаю у вас будет исключение, при Fill:
Код: plaintext
1.
daGetDetails.MissingSchemaAction = MissingSchemaAction.Error;  // add this line
Попробуйте... ???????

Попробовал. После добавления
Код: plaintext
1.
daGetDetails.MissingSchemaAction = MissingSchemaAction.Error;  // add this line
возникает ошибка
"Missing the 'details' DataTable for the 'details' SourceTable."
Если несложно, поясните пожалуйста как "Не считывать метаданные" ?
...
Рейтинг: 0 / 0
12.07.2004, 13:33
    #32599581
Sa
Sa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ADO vs. ADO.NET
Если несложно, поясните пожалуйста как "Не считывать метаданные" ?

У вас так сейчас и стоит, но использовать при этом надо DataSet со схемой данных, например typed dataset. Тогда и не будет исключения.

Вообще попробуйте в существующем коде, перед методом Fill использовать метод FillSchema. Время потраченное на FillSchema - это и будет время затраченное на считывание метаданных.

Код: plaintext
 uid  =  S a
...
Рейтинг: 0 / 0
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / ADO vs. ADO.NET / 8 сообщений из 8, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]