Auswählen von Daten mithilfe des SqlDataSource-Steuerelements

Aktualisiert: November 2007

Mit dem SqlDataSource-Steuerelement können Sie Daten mit wenig oder ganz ohne Code aus einer Datenbank abrufen. Das SqlDataSource-Steuerelement kann mit jeder Datenbank verwendet werden, die über einen zugeordneten ADO.NET-Anbieter verfügt, der im Konfigurationsabschnitt DbProviderFactories konfiguriert ist. Dazu gehören Datenbanken wie Microsoft SQL Server, Oracle und ODBC sowie OLE DB-Datenbanken wie Microsoft Access. Die verwendete Datenbank gibt die Syntax der SQL-Anweisungen vor, die Sie der SqlDataSource mit Ihrer Konfiguration zur Verfügung stellen. Außerdem bestimmt die verwendete Datenbank, ob Sie erweiterte Features wie gespeicherte Prozeduren verwenden können. Die Operationen des Datenquellensteuerelements sind jedoch bei allen Datenbanken gleich.

Um mit dem SqlDataSource-Steuerelement Daten aus einer Datenbank abzurufen, müssen Sie zumindest die folgenden Eigenschaften festlegen:

  • ProviderName   Legen Sie die Eigenschaft auf den Namen des ADO.NET-Anbieters fest, der die verwendete Datenbank darstellt. Wenn Sie mit Microsoft SQL Server arbeiten, legen Sie die ProviderName-Eigenschaft auf "System.Data.SqlClient" fest; wenn Sie mit einer Oracle-Datenbank arbeiten, legen Sie die ProviderName-Eigenschaft auf "System.Data.OracleClient" fest, usw.

  • ConnectionString   Legen Sie die Eigenschaft auf eine für die Datenbank gültige Verbindungszeichenfolge fest.

  • SelectCommand   Legen Sie die Eigenschaft auf eine SQL-Abfrage oder eine gespeicherte Prozedur fest, die Daten von der Datenbank zurückgibt. Die Abfrage, die Sie für die SelectCommand-Eigenschaft festlegen, ist dieselbe Abfrage, die Sie auch für die CommandText-Eigenschaft eines IDbCommand-ADO.NET-Objekts beim Schreiben von ADO.NET-Datenzugriffscode festlegen. Die tatsächliche Syntax der SQL-Abfrage ist vom Datenschema und von der verwendeten Datenbank abhängig.

In den folgenden Abschnitten werden diese Eigenschaften ausführlicher beschrieben.

Legen Sie die ProviderName-Eigenschaft auf den Namen des ADO.NET-Anbieters für den Datenbanktyp fest, in dem die Daten gespeichert sind. Die Liste der zulässigen Anbieter ist entweder in der Datei Machine.config oder in der Datei Web.config registriert, und zwar jeweils im Abschnitt DbProviderFactories. Standardmäßig verwendet das SqlDataSource-Steuerelement den System.Data.SqlClient-ADO.NET-Anbieter, der Microsoft SQL Server entspricht. Wenn Sie eine Verbindung zu einer SQL Server-Datenbank herstellen, müssen Sie deshalb den Anbieter nicht explizit angeben. Sie können aber auch die Anbieter System.Data.OracleClient, System.Data.Odbc oder System.Data.OleDb angeben. Weitere Informationen finden Sie unter ADO.NET.

w1kdt8w2.alert_note(de-de,VS.100).gifHinweis:

Legen Sie die ProviderName-Eigenschaft nicht auf den Wert eines nicht verwalteten ADO-Anbieters wie SQLOLEDB oder MSDAORA fest.

Legen Sie die ConnectionString-Eigenschaft auf eine datenbankspezifische Verbindungszeichenfolge fest. Das Festlegen der ConnectionString-Eigenschaft eines SqlDataSource-Steuerelements auf eine spezifische Verbindungszeichenfolge ist bei großen Sites jedoch eine wenig geeignete Strategie. Hinzu kommt, dass die Verbindungszeichenfolge in diesem Fall im Nur-Text-Format in der ASP.NET-Seite gespeichert wird. Für mehr Sicherheit und eine einfachere Verwaltung der Webanwendung wird empfohlen, Verbindungszeichenfolgen im connectionStrings-Element der Anwendungskonfigurationsdatei zu speichern. Sie können dann, wie im folgenden Beispiel, mit einem Verbindungsausdruck auf die gespeicherte Verbindungszeichenfolge verweisen:

<asp:SqlDataSource 
  ID="SqlDataSource1" 
  runat="server" 
  ConnectionString="<%$ ConnectionStrings:NorthwindConnectionString %>"
   SelectCommand="SELECT * FROM [Categories]">
</asp:SqlDataSource>

Für zusätzliche Sicherheit können Sie den Inhalt des Konfigurationsabschnitts <connectionStrings> verschlüsseln. Weitere Informationen hierzu finden Sie unter Verschlüsseln und Entschlüsseln von Konfigurationsabschnitten.

Sie können eine SQL-Abfrage, die das SqlDataSource-Steuerelement ausführen soll, mithilfe der SelectCommand-Eigenschaft des Steuerelements festlegen. Das folgende Beispiel zeigt eine SQL-Abfrage, die ein Resultset abruft, das die Nachnamen aller Mitarbeiter aus einer Tabelle mit dem Namen Employees enthält:

SELECT LastName FROM Employees;

Das folgende Codebeispiel zeigt, wie Sie die ConnectionString-Eigenschaft und die SelectCommand-Eigenschaft eines SqlDataSource-Steuerelements so festlegen, dass die Mitarbeiterdaten in einem GridView-Steuerelement angezeigt werden.

<%@ Page language="C#" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" >
  <head runat="server">
    <title>ASP.NET Example</title>
</head>
<body>
    <form id="form1" runat="server">
      <asp:SqlDataSource
          id="SqlDataSource1"
          runat="server"
          DataSourceMode="DataReader"
          ConnectionString="<%$ ConnectionStrings:MyNorthwind%>"
          SelectCommand="SELECT LastName FROM Employees">
      </asp:SqlDataSource>

      <asp:ListBox
          id="ListBox1"
          runat="server"
          DataTextField="LastName"
          DataSourceID="SqlDataSource1">
      </asp:ListBox>

    </form>
  </body>
</html>


<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" >
  <head runat="server">
    <title>ASP.NET Example</title>
</head>
<body>
    <form id="form1" runat="server">
      <asp:SqlDataSource
          id="SqlDataSource1"
          runat="server"
          DataSourceMode="DataReader"
          ConnectionString="Data Source=localhost;Integrated Security=SSPI;Initial Catalog=Northwind;"
          SelectCommand="SELECT LastName FROM Employees">
      </asp:SqlDataSource>

      <asp:ListBox
          id="ListBox1"
          runat="server"
          DataTextField="LastName"
          DataSourceID="SqlDataSource1">
      </asp:ListBox>

    </form>
  </body>
</html>


Wenn die verwendete Datenbank gespeicherte Prozeduren unterstützt, können Sie die SelectCommand-Eigenschaft auf den Namen der gespeicherten Prozedur und die SelectCommandType-Eigenschaft auf StoredProcedure festlegen. Auf diese Weise wird angegeben, dass die SelectCommand-Eigenschaft auf eine gespeicherte Prozedur verweist. Das folgende Beispiel zeigt eine einfache gespeicherte Prozedur, die Sie in SQL Server erstellen können:

CREATE PROCEDURE sp_GetAllEmployees AS
    SELECT * FROM Employees;
GO

Um SqlDataSource für die Verwendung dieser gespeicherten Prozedur zu konfigurieren, legen Sie den SelectCommand-Text auf "sp_GetAllEmployees" und die SelectCommandType-Eigenschaft auf StoredProcedure fest.

Die meisten gespeicherten Prozeduren verwenden Parameter. Weitere Informationen über das Verwenden von gespeicherten Prozeduren mit Parametern finden Sie unter Verwenden von Parametern mit dem SqlDataSource-Steuerelement.

Das SqlDataSource-Steuerelement übergibt zur Laufzeit den Text in der SelectCommand-Eigenschaft an die Datenbank, und die Datenbank gibt das Ergebnis der Abfrage oder der gespeicherten Prozedur an das SqlDataSource-Steuerelement zurück. Alle an das Datenquellensteuerelement gebundenen Websteuerelemente zeigen das Resultset auf der ASP.NET-Seite an.

Benutzer interagieren häufig mit Daten, die auf Parametern basieren, die nur zur Laufzeit aufgelöst oder ausgewertet werden können. Angenommen, die auf einer ASP.NET-Webseite angezeigten Daten stellen einen Bericht für ein bestimmtes Datum dar. Wenn der Benutzer ein anderes Datum wählt, ändern sich möglicherweise auch die Daten im Bericht. Unabhängig davon, ob das Datum explizit vom Benutzer oder programmgesteuert von der Webanwendung geändert wird, ist die an die Datenbank zu übermittelnde SQL-Abfrage noch flexibler und noch einfacher zu verwalten, wenn Sie eine parametrisierte SQL-Abfrage verwenden, bei der die Elemente der SQL-Anweisung an die Variablen der Webanwendung gebunden sind und zur Laufzeit ausgewertet werden.

Für eine parametrisierte SQL-Abfrage mit dem SqlDataSource-Steuerelement müssen Sie die Parameter, die Sie der SelectParameters-Auflistung hinzufügen, entsprechenden Platzhaltern in der SelectCommand-Abfrage zuordnen. Die Parameterwerte können von anderen Steuerelementen auf der Seite, vom Sitzungszustand, vom Benutzerprofil und von anderen Elementen gelesen werden. Weitere Informationen finden Sie unter Verwenden von Parametern mit dem SqlDataSource-Steuerelement.

Die Syntax für die Platzhalter hängt vom Datenbanktyp ab. Wenn Sie mit SQL Server arbeiten, beginnt der Parametername mit dem '@'-Zeichen, und sein Name entspricht dem Namen des Parameter-Objekts in der SelectParameters-Auflistung. Bei einer ODBC- oder OLE DB-Datenbank werden die Parameter in einer parametrisierten Anwendung nicht benannt, sondern durch das Platzhalterzeichen '?' angegeben.

Das folgende Beispiel zeigt, wie eine parametrisierte SQL-Abfrage alle Bestellungen in einer SQL Server-Datenbank Northwind abruft, und zwar auf Grundlage der Mitarbeiter-ID des aktuell angemeldeten Mitarbeiters.

SELECT * FROM Orders WHERE EmployeeID = @empid

In diesem Beispiel ist der @empid-Ausdruck der zur Laufzeit ausgewertete Parameter.

Das folgende Codebeispiel zeigt eine parametrisierte SQL-Abfrage, die den Parameterwert von einem anderen Steuerelement auf der Seite übernimmt:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
  <head runat="server">
    <title>ASP.NET Example</title>
</head>
<body>
    <form id="form1" runat="server">

      <p><asp:dropdownlist
          id="DropDownList1"
          runat="server"
          autopostback="True">
          <asp:listitem selected="True">Sales Representative</asp:listitem>
          <asp:listitem>Sales Manager</asp:listitem>
          <asp:listitem>Vice President, Sales</asp:listitem>
      </asp:dropdownlist></p>

      <asp:sqldatasource
          id="SqlDataSource1"
          runat="server"
          connectionstring="<%$ ConnectionStrings:MyNorthwind%>"
          selectcommand="SELECT LastName FROM Employees WHERE Title = @Title">
          <selectparameters>
              <asp:controlparameter name="Title" controlid="DropDownList1" propertyname="SelectedValue"/>
          </selectparameters>
      </asp:sqldatasource>

      <p><asp:listbox
          id="ListBox1"
          runat="server"
          datasourceid="SqlDataSource1"
          datatextfield="LastName">
      </asp:listbox></p>

    </form>
  </body>
</html>


<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
  <head runat="server">
    <title>ASP.NET Example</title>
</head>
<body>
    <form id="form1" runat="server">

      <p><asp:DropDownList
          id="DropDownList1"
          runat="server"
          AutoPostBack="True">
          <asp:ListItem Selected="True">Sales Representative</asp:ListItem>
          <asp:ListItem>Sales Manager</asp:ListItem>
          <asp:ListItem>Vice President, Sales</asp:ListItem>
      </asp:DropDownList></p>

      <asp:SqlDataSource
          id="SqlDataSource1"
          runat="server"
          ConnectionString="Data Source=localhost;Integrated Security=SSPI;Initial Catalog=Northwind;"
          SelectCommand="SELECT LastName FROM Employees WHERE Title = @Title">
          <SelectParameters>
              <asp:ControlParameter Name="Title" ControlId="DropDownList1" PropertyName="SelectedValue"/>
          </SelectParameters>
      </asp:SqlDataSource>

      <p><asp:ListBox
          id="ListBox1"
          runat="server"
          DataSourceID="SqlDataSource1"
          DataTextField="LastName">
      </asp:ListBox></p>

    </form>
  </body>
</html>


Weitere Informationen über das Verwenden von Parametern mit dem SqlDataSource-Steuerelement finden Sie unter Verwenden von Parametern mit dem SqlDataSource-Steuerelement. Weitere allgemeine Informationen über das Verwenden von Datenquellenparametern finden Sie unter Verwenden von Parametern für Datenquellen-Steuerelemente.

Die DataSourceMode-Eigenschaft des SqlDataSource-Steuerelements bestimmt, wie das SqlDataSource-Steuerelement die Daten verwaltet. Die DataSourceMode-Eigenschaft ist standardmäßig auf DataSet festgelegt. Dies bedeutet, dass das von der Datenbank zurückgegebene Resultset vom SqlDataSource-Steuerelement im Arbeitsspeicher des Servers gespeichert wird. Beim Abrufen von Daten mit dem SqlDataSource-Steuerelement im DataSet-Modus können zugeordnete datengebundene Steuerelemente wie das GridView-Steuerelement und das DetailsView-Steuerelement zahlreiche Anzeigemöglichkeiten wie automatisches Sortieren und Paging anbieten.

Als Alternative können Sie die DataSourceMode-Eigenschaft auf DataReader festlegen, wodurch das Resultset nicht im Arbeitsspeicher gespeichert wird. Verwenden Sie den DataReader-Modus für Szenarios, bei denen ein Speichern des Resultsets im Arbeitsspeicher des Servers nicht erforderlich ist.

Das folgende Codebeispiel zeigt, wie Sie für eine Situation, die kein Sortieren, Paging oder Filtern erfordert, die DataSourceMode-Eigenschaft des SqlDataSource-Steuerelements auf DataReader festlegen.

<%@ Page language="C#" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" >
  <head runat="server">
    <title>ASP.NET Example</title>
</head>
<body>
    <form id="form1" runat="server">
      <asp:SqlDataSource
          id="SqlDataSource1"
          runat="server"
          DataSourceMode="DataReader"
          ConnectionString="<%$ ConnectionStrings:MyNorthwind%>"
          SelectCommand="SELECT LastName FROM Employees">
      </asp:SqlDataSource>

      <asp:ListBox
          id="ListBox1"
          runat="server"
          DataTextField="LastName"
          DataSourceID="SqlDataSource1">
      </asp:ListBox>

    </form>
  </body>
</html>


<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" >
  <head runat="server">
    <title>ASP.NET Example</title>
</head>
<body>
    <form id="form1" runat="server">
      <asp:SqlDataSource
          id="SqlDataSource1"
          runat="server"
          DataSourceMode="DataReader"
          ConnectionString="Data Source=localhost;Integrated Security=SSPI;Initial Catalog=Northwind;"
          SelectCommand="SELECT LastName FROM Employees">
      </asp:SqlDataSource>

      <asp:ListBox
          id="ListBox1"
          runat="server"
          DataTextField="LastName"
          DataSourceID="SqlDataSource1">
      </asp:ListBox>

    </form>
  </body>
</html>


Das SqlDataSource-Steuerelement macht Ereignisse verfügbar, die Sie behandeln können, um vor oder nach einem Datenabruf des Steuerelements eigenen Code auszuführen.

Das SqlDataSource-Steuerelement löst erst das Selecting-Ereignis aus und ruft dann die Select-Methode auf, um die in der SelectCommand-Eigenschaft festgelegte SQL-Abfrage auszuführen. Sie können das Selecting-Ereignis behandeln, um die SQL-Abfrage vor der Ausführung zu untersuchen, um die Parameter der SelectParameters-Auflistung zu prüfen oder um andere Aufgaben vor dem Abrufen der Daten auszuführen. Wenn Sie z. B. in Verbindung mit dem SqlDataSource-Steuerelement einen FormParameter verwenden, können Sie das Selecting-Ereignis behandeln, um den Wert des Parameters vor dem Abrufen der Daten zu prüfen. (Der FormParameter übernimmt den in einem HTML-Element gesendeten Wert und übermittelt ihn ohne jede Validierung an die Datenbank.) Wenn der Wert nicht zulässig ist, können Sie die Abfrage abbrechen, indem Sie die Cancel-Eigenschaft des SqlDataSourceSelectingEventArgs-Objekts auf true festlegen.

Das SqlDataSource-Steuerelement löst das Selected-Ereignis aus, nachdem die Daten abgerufen worden sind. Sie können das Selected-Ereignis behandeln, um zu bestimmen, ob bei der Datenbankabfrage eine Ausnahme ausgelöst wurde, oder um die zurückgegebenen Werte zu überprüfen.

Verwenden Sie zum Anzeigen der Daten auf einer ASP.NET-Seite ein datengebundenes Steuerelement wie GridView, DetailsView oder FormView bzw. Steuerelemente wie das ListBox-Steuerelement oder das DropDownList-Steuerelement. Das datengebundene Steuerelement fungiert als Consumer der Daten, die vom SqlDataSource-Steuerelement abgerufen werden. Legen Sie die DataSourceID-Eigenschaft auf die ID des SqlDataSource-Steuerelements fest. Bei der Darstellung der Seite ruft das SqlDataSource-Steuerelement die Daten ab und stellt sie dem datengebundenen Steuerelement zur Verfügung, das daraufhin die Daten anzeigt. Weitere Informationen über datengebundene Steuerelemente und ihre Verwendung in Verbindung mit Datenquellensteuerelementen für das Anzeigen von Daten finden Sie unter Übersicht über datengebundene ASP.NET-Webserversteuerelemente.

Das folgende Codebeispiel zeigt, wie sich die Ergebnisse der Abfrage mit einem GridView-Steuerelement anzeigen lassen.

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" >
  <head runat="server">
    <title>ASP.NET Example</title>
</head>
<body>
    <form id="form1" runat="server">

      <asp:SqlDataSource
          id="SqlDataSource1"
          runat="server"
          DataSourceMode="DataReader"
          ConnectionString="<%$ ConnectionStrings:MyNorthwind%>"
          SelectCommand="SELECT FirstName, LastName, Title FROM Employees">
      </asp:SqlDataSource>

      <asp:GridView
          id="GridView1"
          runat="server"
          DataSourceID="SqlDataSource1">
      </asp:GridView>

    </form>
  </body>
</html>


<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" >
  <head runat="server">
    <title>ASP.NET Example</title>
</head>
<body>
    <form id="form1" runat="server">

      <asp:SqlDataSource
          id="SqlDataSource1"
          runat="server"
          DataSourceMode="DataReader"
          ConnectionString="Data Source=localhost;Integrated Security=SSPI;Initial Catalog=Northwind;"
          SelectCommand="SELECT FirstName, LastName, Title FROM Employees">
      </asp:SqlDataSource>

      <asp:GridView
          id="GridView1"
          runat="server"
          DataSourceID="SqlDataSource1">
      </asp:GridView>

    </form>
  </body>
</html>


Community-Beiträge

HINZUFÜGEN
Anzeigen: