Verwenden von Parametern mit dem SqlDataSource-Steuerelement

Aktualisiert: November 2007

SQL-Anweisungen und gespeicherte Prozeduren enthalten oft Parameter, die zur Laufzeit ausgewertet werden. Eine mit Parametern geschriebene SQL-Anweisung wird als parametrisierte SQL-Anweisung bezeichnet.

Bei Verwendung des SqlDataSource-Steuerelements können Sie SQL-Abfragen und -Anweisungen mit Parametern verwenden. Ihre Datenbindungsszenarios gewinnen deutlich an Flexibilität. Das Lesen und Schreiben von Datenbankinformationen erfolgt auf der Grundlage von Werten, die zur Laufzeit ausgewertet werden. Sie können Parameterwerte aus verschiedenen Quellen abrufen, u. a. aus ASP.NET-Anwendungsvariablen, Benutzeridentitäten und vom Benutzer gewählten Werten. Parameter können beispielsweise verwendet werden, um Suchkriterien zum Abrufen von Daten zu übermitteln, oder um Werte zu übermitteln, die in einen Datenspeicher eingefügt, aktualisiert oder aus dem Datenspeicher gelöscht werden sollen. Ebenso können Parameter verwendet werden, um Werte zu übermitteln, die für das Sortieren, Paging oder Filtern erforderlich sind.

Verwenden von Parametern

Wie alle Datenquellensteuerelemente nimmt das SqlDataSource-Steuerelement zur Laufzeit Eingabeparameter an und verwaltet diese in Parameterauflistungen. Für jede Datenoperation gibt es eine eigene Parameterauflistung. Für Auswahloperationen können Sie die SelectParameters-Auflistung verwenden, für Aktualisierungen die UpdateParameters-Auflistung usw.

Sie können für jeden Parameter einen Namen, einen Typ, eine Richtung und einen Standardwert angeben. Wenn Parameter Werte aus einem bestimmten Objekt abrufen, z. B. aus einem Steuerelement, einer Sitzungsvariable oder dem Benutzerprofil, müssen zusätzliche Eigenschaften festlegt werden. Beispielsweise muss für ein ControlParameter-Objekt die ControlID-Eigenschaft festgelegt werden, um das Steuerelement zu identifizieren, das den Parameterwert aufnimmt. Außerdem muss die PropertyName-Eigenschaft festgelegt werden, um die Eigenschaft festzulegen, die den Parameterwert enthält. Weitere Informationen finden Sie unter Verwenden von Parametern für Datenquellen-Steuerelemente.

Zusätzlich erstellt das SqlDataSource-Steuerelement anhand der von einem datengebundenen Steuerelement übergebenen Werte automatisch Parameter. Bei dem Steuerelement kann es sich z. B. um ein GridView-Steuerelement oder ein FormView-Steuerelement handeln, das automatische Aktualisierungs-, Einfüge- und Löschvorgänge unterstützt. Weitere Informationen finden Sie unter Erstellen von Parametern für datengebundene Felder durch ein Datenquellensteuerelement.

Angeben von Parametern in Befehlen

Bei Verwendung des SqlDataSource-Steuerelements können Sie die Befehlseigenschaften des Steuerelements auf parametrisierte SQL-Anweisungen oder den Namen einer gespeicherten Prozedur festlegen. Wenn Sie für einen Befehl eine gespeicherte Prozedur angeben, müssen Sie angeben, dass der Befehlstyp des Befehls StoredProcedure ist.

Parameternamen

Das SqlDataSource-Steuerelement stellt allen Parameternamen den Wert der ParameterPrefix-Eigenschaft voran. (Das Standardpräfix ist "@".)

Wenn ein datengebundenes Steuerelement wie das GridView-Steuerelement an ein SqlDataSource-Steuerelement gebunden ist, übergibt das datengebundene Steuerelement während einer Aktualisierungs- oder Löschoperation sowohl die aktuellen als auch die ursprünglichen Werte des Satzes an das SqlDataSource-Steuerelement. Die aktuellen Werte werden im Values-Wörterbuch übergeben. Die ursprünglichen Werte werden im Keys- oder im OldValues-Wörterbuch übergeben. Die Inhalte dieser Wörterbücher werden für eine entsprechende Operation an die Parameters-Auflistung des zugrunde liegenden DbCommand-Objekts angehängt.

In den SQL-Befehlen des SqlDataSource-Steuerelements verwenden Sie eine Namenskonvention, damit die Parameterplatzhalter mit den alten Werten übereinstimmen, die dem Befehl übergeben werden. Sie legen das Format von Platzhalternamen mithilfe der OldValuesParameterFormatString-Eigenschaft des SqlDataSource-Steuerelements fest. Legen Sie die OldValuesParameterFormatString-Eigenschaft auf eine Zeichenfolge fest, die "{0}" als Platzhalter für den Namen des Felds enthält. Wenn Sie beispielsweise die OldValuesParameterFormatString-Eigenschaft auf "old_{0}" festlegen, erhalten die Parameter mit den ursprünglichen Werten einen Feldnamen mit dem Präfix "@old_". Gehen wir von einem Aktualisierungsvorgang aus, zu dem auch ein Feld mit dem Namen LastModifiedDate gehört. Der aktuelle Wert des Felds wird im Values-Wörterbuch, der ursprüngliche Wert des Felds im OldValues-Wörterbuch übergeben. Zur Übergabe des aktuellen Werts wird ein Parameter mit dem Namen @LastModifiedDate erstellt und zur Übergabe des ursprünglichen Werts ein Parameter mit dem Namen @old\_LastModifiedDate. Danach können beide Parameter zur Unterscheidung zwischen dem aktuellen und dem ursprünglichen Wert in eine SQL-Anweisung einbezogen werden, wie das folgende Beispiel zeigt:

UPDATE Table1 SET LastModifiedDate = @LastModifiedDate
  WHERE Key = @Key AND LastModifiedDate = @old_LastModifiedDate

Die Fähigkeit, in einem Befehl aktuelle von ursprünglichen Werten zu unterscheiden, ist essentiell für eine Prüfung auf vollständige Parallelität oder beim Arbeiten mit einer Datenquelle, deren Primärschlüssel geändert werden kann.

Weitere Informationen über Wörterbücher, die von datengebundenen Steuerelementen übergeben werden, finden Sie unter Erstellen von Parametern für datengebundene Felder durch ein Datenquellensteuerelement.

Verwenden von Parametern mit dem SqlClient-Anbieter

Standardmäßig verwendet das SqlDataSource-Steuerelement den System.Data.SqlClient-Datenanbieter, um mit SQL Server als Datenquelle zu arbeiten. Der System.Data.SqlClient-Anbieter unterstützt benannte Parameter als Platzhalter, wie im folgenden Beispiel gezeigt:

SELECT * FROM Employees WHERE LastName = @LastName 
  AND FirstName = @FirstName

Bei benannten Parametern ist die Reihenfolge, in der Sie in der Parameterauflistung des Befehls angegeben sind, nicht von Bedeutung. Sie müssen allerdings sicherstellen, dass die Parameternamen im SQL-Befehl den Parameternamen in der zugeordneten Auflistung entsprechen.

Im folgenden Beispiel wird veranschaulicht, wie benannte Parameter in einem SQL-Befehl für ein SqlDataSource-Steuerelement verwendet werden, das den System.Data.SqlClient-Anbieter verwendet.

<asp:sqlDataSource ID="EmployeeDetailsSqlDataSource" 
  SelectCommand="SELECT EmployeeID, LastName, FirstName FROM Employees WHERE EmployeeID = @EmpID"

  InsertCommand="INSERT INTO Employees(LastName, FirstName) VALUES (@LastName, @FirstName); 
                 SELECT @EmpID = SCOPE_IDENTITY()"
  UpdateCommand="UPDATE Employees SET LastName=@LastName, FirstName=@FirstName 
                   WHERE EmployeeID=@EmployeeID"
  DeleteCommand="DELETE Employees WHERE EmployeeID=@EmployeeID"

  ConnectionString="<%$ ConnectionStrings:NorthwindConnection %>"
  OnInserted="EmployeeDetailsSqlDataSource_OnInserted"
  RunAt="server">

  <SelectParameters>
    <asp:Parameter Name="EmpID" Type="Int32" DefaultValue="0" />
  </SelectParameters>

  <InsertParameters>
    <asp:Parameter Name="EmpID" Direction="Output" Type="Int32" DefaultValue="0" />
  </InsertParameters>

</asp:sqlDataSource>
<asp:sqlDataSource ID="EmployeeDetailsSqlDataSource" 
  SelectCommand="SELECT EmployeeID, LastName, FirstName FROM Employees WHERE EmployeeID = @EmpID"

  InsertCommand="INSERT INTO Employees(LastName, FirstName) VALUES (@LastName, @FirstName); 
                 SELECT @EmpID = SCOPE_IDENTITY()"
  UpdateCommand="UPDATE Employees SET LastName=@LastName, FirstName=@FirstName 
                   WHERE EmployeeID=@EmployeeID"
  DeleteCommand="DELETE Employees WHERE EmployeeID=@EmployeeID"

  ConnectionString="<%$ ConnectionStrings:NorthwindConnection %>"
  OnInserted="EmployeeDetailsSqlDataSource_OnInserted"
  RunAt="server">

  <SelectParameters>
    <asp:Parameter Name="EmpID" Type="Int32" DefaultValue="0" />
  </SelectParameters>

  <InsertParameters>
    <asp:Parameter Name="EmpID" Direction="Output" Type="Int32" DefaultValue="0" />
  </InsertParameters>

</asp:sqlDataSource>

Verwenden von Parametern mit dem OleDb-Anbieter und dem Odbc-Anbieter

Bei einer Verbindung zu einer OLE DB- oder ODBC-Datenquelle können Sie das SqlDataSource-Steuerelement für die Verwendung des System.Data.OleDb-Anbieters bzw. des System.Data.Odbc-Anbieters für die Arbeit mit der Datenquelle konfigurieren. Der System.Data.OleDb-Anbieter und der System.Data.Odbc-Anbieter unterstützen nur positionelle Parameter, die mit einem Fragenzeichen ("?") gekennzeichnet sind, wie im folgenden Beispiel gezeigt:

SELECT * FROM Employees WHERE LastName = ? AND FirstName = ?

Wenn Sie den System.Data.OleDb-Anbieter oder den System.Data.Odbc-Anbieter mit parametrisierten SQL-Anweisungen verwenden, muss die Reihenfolge der Parameterplatzhalter der Reihenfolge in der zugehörigen Parameterauflistung entsprechen. Sie können die Parameterreihenfolge steuern, indem Sie sie in der Auflistung für die zugehörige Datenoperation explizit angeben, z. B. in der UpdateParameters-Auflistung für den zugehörigen UpdateCommand. Wenn Sie eine Parameterauflistung explizit für Parameter erstellen, die automatisch aus Werten erstellt werden, die von einem datengebundenen Steuerelement übergeben werden, werden die automatisch generierten Parameter von den explizit erstellten überschrieben. Auf diese Weise stellen Sie sicher, dass die Parameter in der gewünschten Reihenfolge übergeben werden. Wenn Sie eine gespeicherte Prozedur aufrufen, die einen Wert zurückgibt, müssen Sie als ersten Parameter in der Befehlsparameterauflistung einen Parameter angeben, dessen Direction-Wert ReturnValue ist.

Hinweis:

Standardmäßig werden Parameter, die auf datengebundenen Feldern eines datengebundenen Steuerelements basieren, beim Hinzufügen zum Befehl in der folgenden Reihenfolge aus den Parameterwörterbüchern entnommen: Values, Keys, OldValues. Für Löschvorgänge wird nur das Keys-Wörterbuch verwendet. Für Einfügevorgänge wird nur das Values-Wörterbuch verwendet. Weitere Informationen über Wörterbücher, die von datengebundenen Steuerelementen übergeben werden, finden Sie unter Erstellen von Parametern für datengebundene Felder durch ein Datenquellensteuerelement.

Das folgende Beispiel zeigt, wie Parameter für ein SqlDataSource-Steuerelement angegeben werden, das den System.Data.OleDb-Anbieter verwendet. Parameter werden explizit angegeben, um sicherzustellen, dass die Reihenfolge der Parameter in der Auflistung mit der Reihenfolge der Platzhalter in der SQL-Anweisung übereinstimmt.

<Fields>                  
  <asp:BoundField DataField="EmployeeID" HeaderText="Employee ID" InsertVisible="False" ReadOnly="true"/>                    
  <asp:BoundField DataField="FirstName"  HeaderText="First Name"/>
  <asp:BoundField DataField="LastName"   HeaderText="Last Name"/>                    
  <asp:TemplateField HeaderText="Birth Date">
    <ItemTemplate> 
      <asp:Label ID="BirthDateLabel" Runat="Server" 
                 Text='<%# Eval("BirthDate", "{0:d}") %>' />
    </ItemTemplate>
    <InsertItemTemplate>
      <asp:Calendar ID="InsertBirthDateCalendar" Runat="Server"
                    SelectedDate='<%# Bind("BirthDate") %>' />
    </InsertItemTemplate>
    <EditItemTemplate>
      <asp:Calendar ID="EditBirthDateCalendar" Runat="Server"
                    VisibleDate='<%# Eval("BirthDate") %>'
                    SelectedDate='<%# Bind("BirthDate") %>' />
    </EditItemTemplate>
  </asp:TemplateField>                    
</Fields> 
<Fields>                  
  <asp:BoundField DataField="EmployeeID" HeaderText="Employee ID" InsertVisible="False" ReadOnly="true"/>                    
  <asp:BoundField DataField="FirstName"  HeaderText="First Name"/>
  <asp:BoundField DataField="LastName"   HeaderText="Last Name"/>                    
  <asp:TemplateField HeaderText="Birth Date">
    <ItemTemplate> 
      <asp:Label ID="BirthDateLabel" Runat="Server" 
                 Text='<%# Eval("BirthDate", "{0:d}") %>' />
    </ItemTemplate>
    <InsertItemTemplate>
      <asp:Calendar ID="InsertBirthDateCalendar" Runat="Server"
                    SelectedDate='<%# Bind("BirthDate") %>' />
    </InsertItemTemplate>
    <EditItemTemplate>
      <asp:Calendar ID="EditBirthDateCalendar" Runat="Server"
                    VisibleDate='<%# Eval("BirthDate") %>'
                    SelectedDate='<%# Bind("BirthDate") %>' />
    </EditItemTemplate>
  </asp:TemplateField>                    
</Fields> 

Siehe auch

Konzepte

Auswählen von Daten mithilfe des SqlDataSource-Steuerelements

Bearbeiten von Daten mithilfe des SqlDataSource-Steuerelements

Referenz

SqlDataSource

AccessDataSource