asp - asp.net - aspcode.it

COMMUNITY - Login
 Username:
 
 Password:
 
Voglio registrarmi!
Password dimenticata?
 Utenti on-line: 0
 Ospiti on-line: 1235
ASPCode.it - Store

  > > Tips

Recuperare Recordset multipli con il DataReader
di ASPCode.it

Data di pubblicazione: 08/05/2003        Voto della community: 0,00 (Votanti: 0)


Supponiamo di dover popolare diversi DropDownList (combo box) recuperando i valori da altrettante tabelle di SqlServer. Accedere ogni volta al database - oltre a richiedere molte linee di codice - risulterebbe alquanto inefficiente. Girando un po' tra la documentazione scopriamo che è possibile eseguire una sequenza di query (batch query) con un solo accesso al database e poi usare il medodo NextResults del DataReader per saltare da un recordset all'altro e recuperare i dati.

Questa tecnica richiede un solo accesso al database, cio' significa che non dobbiamo reistanziare l'oggetto Command e il DataReader per ogni recordset.

Per illustrare questa tecnica, selezioneremo i campi da quattro tabelle differenti del database Northwind. Come prima cosa, ecco il file aspx dove definiamo i nostri 4 DropwDownList.

<%@ Page Language="vb" Src="ManyResults.aspx.vb" Inherits="DotNetJohn.ManyResults"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<html>
<head>
<title>ManyResults</title>
<meta name="GENERATOR" content="Microsoft Visual Studio.NET 7.0">
<meta name="CODE_LANGUAGE" content="Visual Basic 7.0">
<meta name=vs_defaultClientScript content="JavaScript">
<meta name=vs_targetSchema content="http://schemas.microsoft.com/intellisense/ie5">
</head>
<body>
<form id="Form1" method="post" runat="server">
<table>
  <tr>
    <td bgcolor="#EEEEEE" align="right">Category Name:</td>
    <td><asp:DropDownList ID="ddlCategoryName" Runat="server" /></td>
  </tr>
  <tr>
    <td bgcolor="#EEEEEE" align="right">Company Name:</td>
    <td><asp:DropDownList ID="ddlCompanyName" Runat="server" /></td>
  </tr>
  <tr>
    <td bgcolor="#EEEEEE" align="right">Last Name:</td>
    <td><asp:DropDownList ID="ddlLastName" Runat="server" /></td>
  </tr>
  <tr>
    <td bgcolor="#EEEEEE" align="right">Product Name:</td>
    <td><asp:DropDownList ID="ddlProductName" Runat="server" /></td>
  </tr>
</table>
</form>
</body>
</html>

Di seguito riportiamo il code-behind file, dove è illustrata la tecnica. Ho evidenziato la parte pertinente della tecnica. Notiamo che la strSql contiene le SELECT per tutte e quattro le colonne. L'oggetto Command è istanziato una sola volta e il DataReader è eseguito solo una volta. Quindi iniziamo a spostarci tra i recordset per popolare i vari DropDownList. Poiché il datareadaer si posiziona per default sul primo recordset, dovremo chiamare il metodo NextResult solo dopo il primo recordset.

Imports System
Imports System.Web.UI.WebControls
Imports System.Data
Imports System.Data.SqlClient
Imports System.Configuration

NameSpace DotNetJohn

  Public Class ManyResults : Inherits System.Web.UI.Page

    Protected ddlCategoryName As DropDownList
    Protected ddlCompanyName As DropDownList
    Protected ddlLastName As DropDownList
    Protected ddlProductName As DropDownList

    Private Sub Page_Load(ByVal sender As Object, ByVal e As EventArgs) Handles MyBase.Load

      Dim objConn As SqlConnection
      Dim objCmd As SqlCommand
      Dim dataReader As SqlDataReader
      Dim strSql As String

      objConn = New SqlConnection("Server=(local);uid=sa;pwd=PWD;database=Northwind")
      strSql = _
        "SELECT CategoryName FROM Categories ORDER BY CategoryName;" _
      & "SELECT Top 10 CompanyName FROM Customers ORDER BY CompanyName;" _
      & "SELECT LastName FROM Employees ORDER BY LastName;" _
      & "SELECT Top 10 ProductName FROM Products ORDER BY ProductName;"

      objCmd = New SqlCommand(strSql, objConn)

      Try
        objConn.Open()
        dataReader = objCmd.ExecuteReader()
        'CategoryName
        With ddlCategoryName
          .DataSource = dataReader
          .DataTextField = "CategoryName"
          .DataValueField = "CategoryName"
          .DataBind()
        End With
        'CompanyName
        dataReader.NextResult()
        With ddlCompanyName
          .DataSource = dataReader
          .DataTextField = "CompanyName"
          .DataValueField = "CompanyName"
          .DataBind()
        End With
        'LastName
        dataReader.NextResult()
        With ddlLastName
          .DataSource = dataReader
          .DataTextField = "LastName"
          .DataValueField = "LastName"
          .DataBind()
        End With
        'ProductName
        dataReader.NextResult()
        With ddlProductName
          .DataSource = dataReader
          .DataTextField = "ProductName"
          .DataValueField = "ProductName"
          .DataBind()
        End With
      Catch exc As Exception
        Response.Write(exc)
      Finally
        If Not dataReader Is Nothing Then
          dataReader.Close()
        End If
        objCmd = Nothing
        If objConn.State = ConnectionState.Open Then
          objConn.Close()
        End If
        objConn.Dispose()
      End Try

    End Sub

  End Class

End NameSpace

In conclusione, spero sia chiaro come sia facile (e 'lineare') ottenere recordset multipli con un solo accesso al database e poi spostarsi tra i recordset uno alla volta per ottenere i dati necessari.

E' possibile provare il codice da qui.


Si ringrazia dotnetjohn per la gentile concessione dell'articolo (lingua inglese).




Utenti connessi: 1235