powered by simpleCommunicator - 2.0.56     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / ADO vs. ADO.NET
8 сообщений из 8, страница 1 из 1
ADO vs. ADO.NET
    #32596604
dr.FausT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Начал постигать 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
ADO vs. ADO.NET
    #32596718
Bigheadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dataset в ADO.NET и RecordSet в ADO - суть абсолютно разные вещи.
Подробнее - см. различные статьи по сравнению ADO.NET и ADO, коих написано море.
Кстати не путайте запросы к СУБД и различные операции в приложении. Запросы к СУБД в этих двух технологиях выполняются абсолютно одинаково с точки зрения скорости выполнения.
...
Рейтинг: 0 / 0
ADO vs. ADO.NET
    #32596743
dr.FausT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Насколько я понял, Fill заполняет таблицу из результатов запроса ?
...
Рейтинг: 0 / 0
ADO vs. ADO.NET
    #32598498
Sa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DataAdapter использует DataReader, для того чтобы заполнить DataTable|DataSet. В результате получаем отсоединненый набор данных.
Кроме того вы используете, нетипизированный DataSet следовательно колосальное количество времени тратится на считывание схемы данных.

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

А как ускорить весь процесс ?
...
Рейтинг: 0 / 0
ADO vs. ADO.NET
    #32598962
Sa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я все таки не уверен, по поводу корректности сравнивания 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
ADO vs. ADO.NET
    #32599392
dr.FausT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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
ADO vs. ADO.NET
    #32599581
Sa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если несложно, поясните пожалуйста как "Не считывать метаданные" ?

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

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

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


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