Исходники.Ру - Программирование
Исходники
Статьи
Книги и учебники
Скрипты
Новости RSS
Магазин программиста

Главная » Статьи по программированию » .NET - ADO.NET »

Обсудить на форуме Обсудить на форуме

Введение в ADO.NET III

В первых статьях из этой серии мы представили несколько особенностей Dataset Object. Напомним их:

1) Dataset не взаимодействует напрямую с истчником данных.
2) Поддерживает отношения между различными таблицами.
3) Вы можете перемещаться по таблицам с помощью этих отношений 4) Для передачи данных используется XML.
 5) Помимо расшрения передаваемых тиипов, это позволяет передаваемому объекту не испытывать воздействия брандмауэров.

Ниже приведена иллюстрация объектной модели Dataset (взята из документации): DataSet model

Как видно, Dataset имеет более сложную структуру, нежели Recordset Object.
Схема наглядно показывает возможности хранения некольких таблиц и программного добавления связей между ними.

Но как Dataset заполняется первый раз? Очень просто! Для этого используется метод FillDataset() объекта DatasetCommand. Метод получает два параметра - имя Dataseta который должен быть заполнен и имя таблицы, котора будет добавлена в Dataset.
Код ниже иллюстрирует заполнение Dataset на примере SQL provider:

public class SQLConnect {
   
   public string openConnection(HttpResponse Response,String
                                     dbConnectString,String cmdString) {
   try {
     Dataset dsOrders = new Dataset();
     SQLConnection dataConn = new SQLConnection(dbConnectString);
     SQLDatasetCommand dsCmd = new SQLDatasetCommand(cmdString,dataConn);
     dsCmd.FillDataset(dsOrders,"Orders");
     // Loop through Dataset "Orders" table
     Response.Write("<table><tr><td><b>Order ID</b></td></tr>");
     foreach (DataRow Order in dsOrders.Tables["Orders"].Rows) {
        Response.Write("<tr>");
        Response.Write("<td>" + Order["OrderId"].ToString() + "</td>");
        Response.Write("</tr>");
     }
     Response.Write("</table>");
     return "<p>SQL Server Data Connection Opened";
   }
   catch (Exception e) {
      return(e.ToString());
   }
   }
} //End Class

Код во многом похож на использованный при работе с DataReader, хотя содинение и не поддерживается во время перебора записей. Видно что после заполнения Dataset мы просмтриваем все строчки таблицы. Вместо ручного форматирования таблицы, можно связать Dataset с ASP+ DataGrid заставить его выполнить эту работу:

<%@ Import Namespace="System.Data"%>
<%@ Import Namespace="System.Data.SQL"%>
<html><head>
<script language="C#" runat="server">
public class SQLConnect {
   
   public Dataset returnDataset(String dbConnectString,String cmdString) {
   Dataset dsOrders = new Dataset();
   SQLConnection dataConn = new SQLConnection(dbConnectString);
   SQLDatasetCommand dsCmd =  
   new
   SQLDatasetCommand(cmdString,dataConn);
   dsCmd.FillDataset(dsOrders,"Orders");
return(dsOrders);

} } public void Page_Load(Object Src, EventArgs 
   E) {  StringSQLconnStr="server=localhost;uid=sa;pwd=;database=Northwind";
   String sql = "SELECT * FROM Orders";
   
   //Open SQL Connection
   SQLConnect SQLconn = new SQLConnect();
   Dataset OrdersDataset = SQLconn.returnDataset(SQLconnStr,sql);
   OrdersDataGrid.DataSource=OrdersDataset.Tables["Orders"].DefaultView;
   OrdersDataGrid.DataBind();   
} 
</script>
</head>
<body bgcolor="#ffffff">
  <ASP:DataGrid id="OrdersDataGrid" runat="server" Width="700"
    BackColor="#E6E6CC" BorderColor="#000000" ShowFooter="false" 
    CellPadding=5 CellSpacing="0" Font-Name="Arial" Font-Size="8pt"
    HeaderStyle-BackColor="#6C0A00" HeaderStyle-ForeColor="#ffffff"
    MaintainState="false"
  />
</body>
</html>

В заключение приведем еще один пример. Таблицы Customer и Orders из БД NorthWind будут загружены в dsTables.Затем они будут связаны друг с другом через .После установки отношений все запросы, связанные с каждым покупателем будут помещены в DIV тег и будут появляться и исчезать по щелчку пользователя.

<%@ Import Namespace="System.Data"%>
<%@ Import Namespace="System.Data.SQL"%>
<html>
<script language="C#" runat="server">
public class SQLConnect {
   
  public Dataset returnDataset(String dbConnectString,String
                                                     table1,String table2) {
  Dataset dsTables = new Dataset();
  SQLConnection dataConn = new SQLConnection(dbConnectString);
  SQLDatasetCommand dsCmdCustomers = new SQLDatasetCommand(table1,dataConn);
  SQLDatasetCommand dsCmdOrders = new SQLDatasetCommand(table2,dataConn);
  dsCmdCustomers.FillDataset(dsTables,"Customers");
  dsCmdOrders.FillDataset(dsTables,"Orders");
  dsTables.Relations.Add( _
           "CustomerOrders",dsTables.Tables["Customers"].Columns _
           ["CustomerId"],dsTables.Tables["Orders"].Columns["CustomerId"]);
  return(dsTables);
 }
} //End Class

public void Page_Load(Object Src, EventArgs E) { 
  String SQLconnStr = "server=localhost;uid=sa;pwd=;database=Northwind";
  String table1 = @"SELECT * FROM Customers WHERE CustomerID LIKE 'f%' _
                  ORDER BY ContactName";
  String table2 = "SELECT * FROM Orders WHERE CustomerID LIKE 'f%'";
  String output = "";
  //Open SQL Connection
  SQLConnect SQLconn = new SQLConnect();
  Dataset TablesDataset = SQLconn.returnDataset(SQLconnStr,table1,table2);
  foreach (DataRow Customer in TablesDataset.Tables["Customers"].Rows) {
    output += "<div onClick=\"showDetails('";
    output += Customer["CustomerID"].ToString() + "')\">";
    output += "<br><span style=\"background: #02027a;color:";
    output += "#ffffff;width: 400px;";
    output += "cursor: hand;font-weight: bold\"> Customer Name: ";
    output += Customer["ContactName"].ToString() + "</span>";
    output += "</div>";
    output += "<div style='width: 400px;display: none;background:";
    output += "#efefef' id='";
    output += Customer["CustomerID"].ToString() + "'>";
    // Iterate over orders data
    foreach (DataRow Order in    
         Customer.GetChildRows(TablesDataset.Relations["CustomerOrders"])) {
      output += "<br><b>Order:</b> #" + Order["OrderId"].ToString();
      output += "&nbsp;&nbsp;&nbsp;&nbsp;<b>Order Date:</b>";
      output += Order["OrderDate"].ToString();
    }
    output += "</div>";
    }
  content.InnerHtml = output;
  } 
</script>

<head>
<script language="JavaScript">
     function showDetails(id) {
          var loc = document.all(id);
          if (loc.style.display == 'none') {
               loc.style.display = 'block';   
          } else {
               loc.style.display = 'none';
          }   
     }
</script>
</head>
<body bgcolor="#ffffff">
     <h2><b>Customer Orders</b></h2>
     <div id="content" runat="server"/>
</body>
</html>

Просмотрим код. Видно, что при загрузке вначале загружаются SQL строки для получения данных при создании обеих таблиц. Затем создается объект класса SQLConnect и вызывается его метод returnDataset( ) Метод получает соединение и SQL строки для необходимые для работы. После помещения этих строк в Dataset создается связь между таблицами по CustomerID. Затем начинается просмотр всех заказов.


Может пригодится:


Автор: dotSite Team
Прочитано: 4040
Рейтинг:
Оценить: 1 2 3 4 5

Комментарии: (0)

Добавить комментарий
Ваше имя*:
Ваш email:
URL Вашего сайта:
Ваш комментарий*:
Код безопастности*:

Рассылка новостей
Рейтинги
© 2007, Программирование Исходники.Ру