Verwenden von Parametern mit dem ObjectDataSource-Steuerelement

Aktualisiert: November 2007

Das ObjectDataSource-Steuerelement ruft Geschäftsobjektmethoden anhand des Methodennamens auf, der jeweils in den Eigenschaften SelectMethod, InsertMethod, UpdateMethod und DeleteMethod angegeben ist, sowie anhand der Parameternamen, aus denen sich die Signatur der Geschäftsobjektmethode zusammensetzt. Beim Erstellen einer Methode in einem Geschäftsobjekt müssen Sie sicherstellen, dass die von der Geschäftsobjektmethode akzeptierten Parameternamen und Parametertypen den Namen und Typen entsprechen, die vom ObjectDataSource-Steuerelement übergeben werden. (Die Parameterreihenfolge ist nicht wichtig.)

Verwenden von Parametern

Wie alle Datenquellensteuerelemente nimmt das ObjectDataSource-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 zu identifizieren, die den Parameterwert enthält. Weitere Informationen finden Sie unter Verwenden von Parametern für Datenquellen-Steuerelemente.

Das folgende Codebeispiel veranschaulicht eine Auswahlmethode, die von einem ObjectDataSource-Steuerelement aufgerufen werden kann. Die Methode nimmt einen Parameter an und wählt einen einzelnen Datensatz aus der Datenquelle aus.

<DataObjectMethod(DataObjectMethodType.Select)> _
Public Shared Function GetEmployee(EmployeeID As Integer) As DataTable

  If Not _initialized Then Initialize()

  Dim conn As SqlConnection  = New SqlConnection(_connectionString)
  Dim da  As SqlDataAdapter  = _
    New SqlDataAdapter("SELECT EmployeeID, LastName, FirstName, Address, City, Region, PostalCode FROM Employees WHERE EmployeeID = @EmployeeID", conn) 
  da.SelectCommand.Parameters.Add("@EmployeeID", SqlDbType.Int).Value = EmployeeID

  Dim ds As DataSet =  New DataSet() 

  Try      
    conn.Open()
    da.Fill(ds, "Employees")
  Catch e As SqlException
    ' Handle exception.
  Finally
    conn.Close()
  End Try

  If ds.Tables("Employees") IsNot Nothing Then _
    Return ds.Tables("Employees")

  Return Nothing
End Function
[DataObjectMethod(DataObjectMethodType.Select)]
public static DataTable GetEmployee(int EmployeeID)
{
  if (!_initialized) { Initialize(); }

  SqlConnection conn = new SqlConnection(_connectionString);
  SqlDataAdapter da  = 
    new SqlDataAdapter("SELECT EmployeeID, LastName, FirstName, Address, City, Region, PostalCode FROM Employees WHERE EmployeeID = @EmployeeID", conn); 
  da.SelectCommand.Parameters.Add("@EmployeeID", SqlDbType.Int).Value = EmployeeID;

  DataSet ds =  new DataSet(); 

  try
  {
    conn.Open();
    da.Fill(ds, "Employees");
  }
  catch (SqlException e)
  {
    // Handle exception.
  }
  finally
  {
    conn.Close();
  }

  if (ds.Tables["Employees"] != null)
    return ds.Tables["Employees"];

  return null;
}

Übergeben von Parametern an Einfüge-, Aktualisierungs- und Löschmethoden

Das ObjectDataSource-Steuerelement bestimmt die Methode, die für einen Einfüge-, Aktualisierungs- oder Löschvorgang aufgerufen wird, anhand der Auflistungen InsertParameters, UpdateParameters bzw. DeleteParameters. Zusätzlich erstellt das ObjectDataSource-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.

Das folgende Codebeispiel veranschaulicht eine Methode, die von einem ObjectDataSource-Steuerelement aufgerufen werden kann. Die Methode aktualisiert Mitarbeiterinformationen in der Beispieldatenbank Northwind.

<DataObjectMethod(DataObjectMethodType.Update)> _
Public Shared Function UpdateEmployee(EmployeeID As Integer, _
                                      FirstName As String, _
                                      LastName As String, _
                                      Address As String, _
                                      City As String, _
                                      Region As String, _
                                      PostalCode As String) As Boolean

  If String.IsNullOrEmpty(FirstName) Then _
    Throw New ArgumentException("FirstName cannot be null or an empty string.")
  If String.IsNullOrEmpty(LastName) Then _
    Throw New ArgumentException("LastName cannot be null or an empty string.")

  If Address    Is Nothing Then Address    = String.Empty 
  If City       Is Nothing Then City       = String.Empty 
  If Region     Is Nothing Then Region     = String.Empty 
  If PostalCode Is Nothing Then PostalCode = String.Empty 

  If Not _initialized Then Initialize()

  Dim conn As SqlConnection  = New SqlConnection(_connectionString)
  Dim cmd  As SqlCommand     = New SqlCommand("UPDATE Employees " & _
                                              "  SET FirstName=@FirstName, LastName=@LastName, " & _
                                              "  Address=@Address, City=@City, Region=@Region, " & _
                                              "  PostalCode=@PostalCode " & _
                                              "  WHERE EmployeeID=@EmployeeID", conn)  

  cmd.Parameters.Add("@FirstName",  SqlDbType.VarChar, 10).Value = FirstName
  cmd.Parameters.Add("@LastName",   SqlDbType.VarChar, 20).Value = LastName
  cmd.Parameters.Add("@Address",    SqlDbType.VarChar, 60).Value = Address
  cmd.Parameters.Add("@City",       SqlDbType.VarChar, 15).Value = City
  cmd.Parameters.Add("@Region",     SqlDbType.VarChar, 15).Value = Region
  cmd.Parameters.Add("@PostalCode", SqlDbType.VarChar, 10).Value = PostalCode
  cmd.Parameters.Add("@EmployeeID", SqlDbType.Int).Value = EmployeeID

  Try      
    conn.Open()

    If cmd.ExecuteNonQuery() <> 0 Then _
      Return False
  Catch e As SqlException
    ' Handle exception.
  Finally
    conn.Close()
  End Try

  Return True
End Function
[DataObjectMethod(DataObjectMethodType.Update)]
public static bool UpdateEmployee(int EmployeeID, string FirstName, string LastName, 
                                  string Address, string City, string Region, string PostalCode)
{
  if (String.IsNullOrEmpty(FirstName))
    throw new ArgumentException("FirstName cannot be null or an empty string.");
  if (String.IsNullOrEmpty(LastName))
    throw new ArgumentException("LastName cannot be null or an empty string.");

  if (Address    == null) { Address    = String.Empty; }
  if (City       == null) { City       = String.Empty; }
  if (Region     == null) { Region     = String.Empty; }
  if (PostalCode == null) { PostalCode = String.Empty; }

  if (!_initialized) { Initialize(); }

  SqlConnection conn = new SqlConnection(_connectionString);
  SqlCommand    cmd  = new SqlCommand("UPDATE Employees " + 
                                      "  SET FirstName=@FirstName, LastName=@LastName, " + 
                                      "  Address=@Address, City=@City, Region=@Region, " +
                                      "  PostalCode=@PostalCode " +
                                      "  WHERE EmployeeID=@EmployeeID", conn);  

  cmd.Parameters.Add("@FirstName",  SqlDbType.VarChar, 10).Value = FirstName;
  cmd.Parameters.Add("@LastName",   SqlDbType.VarChar, 20).Value = LastName;
  cmd.Parameters.Add("@Address",    SqlDbType.VarChar, 60).Value = Address;
  cmd.Parameters.Add("@City",       SqlDbType.VarChar, 15).Value = City;
  cmd.Parameters.Add("@Region",     SqlDbType.VarChar, 15).Value = Region;
  cmd.Parameters.Add("@PostalCode", SqlDbType.VarChar, 10).Value = PostalCode;
  cmd.Parameters.Add("@EmployeeID", SqlDbType.Int).Value = EmployeeID;

  try
  {
    conn.Open();

    if (cmd.ExecuteNonQuery() == 0)
      return false;
  }
  catch (SqlException e)
  {
    // Handle exception.
  }
  finally
  {
    conn.Close();
  }

  return true;
}

Im Codebeispiel wird davon ausgegangen, dass die ConflictDetection-Eigenschaft des ObjectDataSource-Steuerelements auf OverwriteChanges festgelegt worden ist. Wenn die ConflictDetection-Eigenschaft auf CompareAllValues festgelegt wird, muss die Geschäftsobjektmethode Parameter für die ursprünglichen Werte der Datenfelder akzeptieren. Sie können mit der OldValuesParameterFormatString-Eigenschaft zwischen Parametern für aktuelle und ursprüngliche Werte unterscheiden. Sie legen die OldValuesParameterFormatString-Eigenschaft auf einen Zeichenfolgenausdruck fest, der verwendet wird, um die Namen für Parameter mit ursprünglichem Wert zu formatieren. Dabei stellt die Zeichenfolge {0} den Feldnamen dar. Wenn Sie z. B. die OldValuesParameterFormatString-Eigenschaft auf original_{0} festlegen, wird der aktuelle Wert für ein Feld mit dem Namen FirstName an den Parameter FirstName übergeben, und der ursprüngliche Wert für das Feld wird an den Parameter original_FirstName übergeben.

Identifizieren von Parametern für Sortierung und Paging

Für eine Select-Geschäftsobjektmethode können Sie neben SelectParameters-Objekten auch Parameter für das Sortieren und Paging angeben. Damit können Sie Daten im Datenquellenobjekt sortieren und die Ergebnisse, die von dem Datenquellenobjekt zurückgegeben werden, auf die angeforderte Datenseite einschränken.

Identifizieren eines Sortierparameters

Der Sortierparameter für eine Select-Geschäftsobjektmethode wird mithilfe der SortParameterName-Eigenschaft des ObjectDataSource-Steuerelements angegeben. Die SortParameterName-Eigenschaft bezeichnet den Namen des Parameters, mit dem die Sortierspaltennamen an die Geschäftsobjektmethode übergeben werden. Der Parameter ist ein Zeichenfolgentyp.

Bestimmte datengebundene Steuerelemente, z. B. das GridView-Steuerelement, können Sortierparameter automatisch an das ObjectDataSource-Steuerelement übergeben. Wenn ein datengebundenes Steuerelement, das Sortieren unterstützt, an das ObjectDataSource-Steuerelement gebunden wird, übergibt das datengebundene Steuerelement einen Sortierausdruck, mit dem die Datenspalten angegeben werden, die zum Sortieren der Ergebnisse verwendet werden sollen. Z. B. übergibt das GridView-Steuerelement die Sortierwerte in seiner SortExpression-Eigenschaft. Das ObjectDataSource-Steuerelement legt anhand des übergebenen Sortierausdrucks den Wert des Parameters fest, der von der SortParameterName-Eigenschaft angegeben wird. Der Sortierausdruck kann mehr als eine Spalte angeben, wobei die Spaltennamen dann durch Kommas voneinander getrennt werden. Durch den DESC-Modifizierer hinter dem Namen einer Sortierspalte können Sie eine absteigende Sortierung angeben. Für eine Sortierung nach der LastName-Spalte und der FirstName-Spalte müsste der Sortierausdruck also "LastName, FirstName" lauten, bzw. "LastName, FirstName DESC", wenn absteigend sortiert werden soll.

Identifizieren von Paging-Parametern

Sie können für eine Select-Methode zusätzliche Parameter angeben, um die zurückzugebende Datenseite zu identifizieren. Das ObjectDataSource-Steuerelement unterstützt zwei Eigenschaften für die Angabe von Paging-Parametern:

  • Die StartRowIndexParameterName-Eigenschaft identifiziert den Namen des Parameters in der Auswahlmethode des Geschäftsobjekts, der die Startzeile der Datenseite angibt.

  • Die MaximumRowsParameterName-Eigenschaft identifiziert den Namen des Parameters in der Auswahlmethode des Geschäftsobjekts, der die Zeilenanzahl der Datenseite angibt.

Die beiden von der StartRowIndexParameterName-Eigenschaft und MaximumRowsParameterName-Eigenschaft identifizierten Parameter sind vom Typ Int32.

Das folgende Codebeispiel zeigt ein ObjectDataSource-Steuerelement, das zum Übergeben von Sortier-und Pagingparametern an die Select-Methode des festgelegten Geschäftsobjekts konfiguriert ist:

<asp:ObjectDataSource 
  ID="EmployeesObjectDataSource" 
   
  TypeName="Samples.AspNet.Controls.NorthwindEmployee" 
  SortParameterName="SortColumns"
  EnablePaging="true"
  StartRowIndexParameterName="StartRecord"
  MaximumRowsParameterName="MaxRecords" 
  SelectMethod="GetAllEmployees" >
</asp:ObjectDataSource>
<asp:ObjectDataSource 
  ID="EmployeesObjectDataSource" 
   
  TypeName="Samples.AspNet.Controls.NorthwindEmployee" 
  SortParameterName="SortColumns"
  EnablePaging="true"
  StartRowIndexParameterName="StartRecord"
  MaximumRowsParameterName="MaxRecords" 
  SelectMethod="GetAllEmployees" >
</asp:ObjectDataSource>

Das folgende Codebeispiel zeigt die Select-Geschäftsobjektmethode, die im vorangehenden Beispiel aufgerufen wurde. Die Geschäftsobjektmethode gibt eine Datenseite aus der Beispieldatenbank Northwind zurück, die in der angegebenen Reihenfolge sortiert ist.

Public Shared Sub Initialize()    
  ' Initialize data source. Use "Northwind" connection string from configuration.

  If ConfigurationManager.ConnectionStrings("Northwind") Is Nothing OrElse _
     ConfigurationManager.ConnectionStrings("Northwind").ConnectionString.Trim() = "" Then      
    Throw New Exception("A connection string named 'Northwind' with a valid connection string " & _
                        "must exist in the <connectionStrings> configuration section for the application.")
  End If

  _connectionString = _
    ConfigurationManager.ConnectionStrings("Northwind").ConnectionString

  _initialized = True
End Sub



' Select all employees.

<DataObjectMethod(DataObjectMethodType.Select, True)> _
Public Shared Function GetAllEmployees(sortColumns As String, startRecord As Integer, maxRecords As Integer) As DataTable

  VerifySortColumns(sortColumns)

  If Not _initialized Then Initialize()

  Dim sqlCommand As String = "SELECT EmployeeID, LastName, FirstName, Address, City, Region, PostalCode FROM Employees "

  If sortColumns.Trim() = "" Then
    sqlCommand &= "ORDER BY EmployeeID"
  Else
    sqlCommand &= "ORDER BY " & sortColumns
  End If

  Dim conn As SqlConnection  = New SqlConnection(_connectionString)
  Dim da   As SqlDataAdapter = New SqlDataAdapter(sqlCommand, conn) 

  Dim ds As DataSet =  New DataSet() 

  Try
    conn.Open()
    da.Fill(ds, startRecord, maxRecords, "Employees")
  Catch e As SqlException
    ' Handle exception.
  Finally      
    conn.Close()
  End Try

  If ds.Tables("Employees") IsNot Nothing Then _
    Return ds.Tables("Employees")

  Return Nothing
End Function


'''''
' Verify that only valid columns are specified in the sort expression to aSub a SQL Injection attack.

Private Shared Sub VerifySortColumns(sortColumns As String)

  If sortColumns.ToLowerInvariant().EndsWith(" desc") Then _
    sortColumns = sortColumns.Substring(0, sortColumns.Length - 5)

  Dim columnNames() As String = sortColumns.Split(",")

  For Each columnName As String In columnNames      
    Select Case columnName.Trim().ToLowerInvariant()        
      Case "employeeid"
      Case "lastname"
      Case "firstname"
      Case ""
      Case Else
        Throw New ArgumentException("SortColumns contains an invalid column name.")
    End Select
  Next
End Sub
public static void Initialize()
{
  // Initialize data source. Use "Northwind" connection string from configuration.

  if (ConfigurationManager.ConnectionStrings["Northwind"] == null ||
      ConfigurationManager.ConnectionStrings["Northwind"].ConnectionString.Trim() == "")
  {
    throw new Exception("A connection string named 'Northwind' with a valid connection string " + 
                        "must exist in the <connectionStrings> configuration section for the application.");
  }

  _connectionString = 
    ConfigurationManager.ConnectionStrings["Northwind"].ConnectionString;

  _initialized = true;
}


// Select all employees.

[DataObjectMethod(DataObjectMethodType.Select, true)]
public static DataTable GetAllEmployees(string sortColumns, int startRecord, int maxRecords)
{
  VerifySortColumns(sortColumns);

  if (!_initialized) { Initialize(); }

  string sqlCommand = "SELECT EmployeeID, LastName, FirstName, Address, City, Region, PostalCode FROM Employees ";

  if (sortColumns.Trim() == "")
    sqlCommand += "ORDER BY EmployeeID";
  else
    sqlCommand += "ORDER BY " + sortColumns;

  SqlConnection conn = new SqlConnection(_connectionString);
  SqlDataAdapter da  = new SqlDataAdapter(sqlCommand, conn); 

  DataSet ds =  new DataSet(); 

  try
  {
    conn.Open();
    da.Fill(ds, startRecord, maxRecords, "Employees");
  }
  catch (SqlException e)
  {
    // Handle exception.
  }
  finally
  {
    conn.Close();
  }

  if (ds.Tables["Employees"] != null)
    return ds.Tables["Employees"];

  return null;
}


//////////
// Verify that only valid columns are specified in the sort expression to avoid a SQL Injection attack.

private static void VerifySortColumns(string sortColumns)
{
  if (sortColumns.ToLowerInvariant().EndsWith(" desc"))
    sortColumns = sortColumns.Substring(0, sortColumns.Length - 5);

  string[] columnNames = sortColumns.Split(',');

  foreach (string columnName in columnNames)
  {
    switch (columnName.Trim().ToLowerInvariant())
    {
      case "employeeid":
        break;
      case "lastname":
        break;
      case "firstname":
        break;
      case "":
        break;
      default:
        throw new ArgumentException("SortColumns contains an invalid column name.");
        break;
    }
  }
}

Parameterrichtung

Alle Parameter von Geschäftsobjektmethoden sind standardmäßig Eingabeparameter. Wenn die Geschäftsobjektmethode einen out-Parameter enthält, der einen Wert an das ObjectDataSource-Steuerelement übergibt, müssen Sie explizit einen Parameter mit Parameterrichtung angeben, wie in Verwenden von Parametern für Datenquellen-Steuerelemente beschrieben.

Im folgenden Codebeispiel wird ein ObjectDataSource-Steuerelement veranschaulicht, das zum Akzeptieren eines Ausgabeparameters vom Typ Int32 konfiguriert ist. Der Ausgabeparameter gibt einen automatisch generierten Primärschlüsselwert von der Methode zurück, die von der InsertMethod-Eigenschaft angegeben wird.

<asp:ObjectDataSource 
  ID="EmployeeDetailsObjectDataSource" 
   
  TypeName="Samples.AspNet.Controls.NorthwindEmployee" 
  SelectMethod="GetEmployee" 
  UpdateMethod="UpdateEmployee"
  DeleteMethod="DeleteEmployee"
  InsertMethod="InsertEmployee" 
  OnInserted="EmployeeDetailsObjectDataSource_OnInserted" >
  <SelectParameters>
    <asp:Parameter Name="EmployeeID" />  
  </SelectParameters>
  <InsertParameters>
    <asp:Parameter Name="NewEmployeeID" Direction="Output" 
                   Type="Int32" DefaultValue="0" />
  </InsertParameters>
</asp:ObjectDataSource>
<asp:ObjectDataSource 
  ID="EmployeeDetailsObjectDataSource" 
   
  TypeName="Samples.AspNet.Controls.NorthwindEmployee" 
  SelectMethod="GetEmployee" 
  UpdateMethod="UpdateEmployee"
  DeleteMethod="DeleteEmployee"
  InsertMethod="InsertEmployee" 
  OnInserted="EmployeeDetailsObjectDataSource_OnInserted" >
  <SelectParameters>
    <asp:Parameter Name="EmployeeID" />  
  </SelectParameters>
  <InsertParameters>
    <asp:Parameter Name="NewEmployeeID" Direction="Output" 
                   Type="Int32" DefaultValue="0" />
  </InsertParameters>
</asp:ObjectDataSource>

Das folgende Codebeispiel zeigt die Insert-Geschäftsobjektmethode, die den Primärschlüsselwert als out-Parameter zurückgibt:

<DataObjectMethod(DataObjectMethodType.Insert)> _
Public Shared Function InsertEmployee(ByRef NewEmployeeID As Integer, _
                                      FirstName As String, _
                                      LastName As String, _
                                      Address As String, _
                                      City As String, _
                                      Region As String, _
                                      PostalCode As String) As Boolean

  If String.IsNullOrEmpty(FirstName) Then _
    Throw New ArgumentException("FirstName cannot be null or an empty string.")
  If String.IsNullOrEmpty(LastName) Then _
    Throw New ArgumentException("LastName cannot be null or an empty string.")

  If Address    Is Nothing Then Address    = String.Empty 
  If City       Is Nothing Then City       = String.Empty 
  If Region     Is Nothing Then Region     = String.Empty 
  If PostalCode Is Nothing Then PostalCode = String.Empty 

  If Not _initialized Then Initialize()

  NewEmployeeID = -1

  Dim conn As SqlConnection  = New SqlConnection(_connectionString)
  Dim cmd  As SqlCommand     = New SqlCommand("INSERT INTO Employees " & _ 
                                              "  (FirstName, LastName, Address, City, Region, PostalCode) " & _
                                              "  Values(@FirstName, @LastName, @Address, @City, @Region, @PostalCode) " & _
                                              "SELECT @EmployeeID = SCOPE_IDENTITY()", conn)  

  cmd.Parameters.Add("@FirstName",  SqlDbType.VarChar, 10).Value = FirstName
  cmd.Parameters.Add("@LastName",   SqlDbType.VarChar, 20).Value = LastName
  cmd.Parameters.Add("@Address",    SqlDbType.VarChar, 60).Value = Address
  cmd.Parameters.Add("@City",       SqlDbType.VarChar, 15).Value = City
  cmd.Parameters.Add("@Region",     SqlDbType.VarChar, 15).Value = Region
  cmd.Parameters.Add("@PostalCode", SqlDbType.VarChar, 10).Value = PostalCode
  Dim p As SqlParameter = cmd.Parameters.Add("@EmployeeID", SqlDbType.Int)
  p.Direction = ParameterDirection.Output

  Try
    conn.Open()

    cmd.ExecuteNonQuery()

    NewEmployeeID = CInt(p.Value)
  Catch e As SqlException
    ' Handle exception.
  Finally
    conn.Close()
  End Try

  Return True
End Function
[DataObjectMethod(DataObjectMethodType.Insert)]
public static bool InsertEmployee(out int NewEmployeeID, string FirstName, string LastName, 
                                  string Address, string City, string Region, string PostalCode)
{
  if (String.IsNullOrEmpty(FirstName))
    throw new ArgumentException("FirstName cannot be null or an empty string.");
  if (String.IsNullOrEmpty(LastName))
    throw new ArgumentException("LastName cannot be null or an empty string.");

  if (Address    == null) { Address    = String.Empty; }
  if (City       == null) { City       = String.Empty; }
  if (Region     == null) { Region     = String.Empty; }
  if (PostalCode == null) { PostalCode = String.Empty; }

  if (!_initialized) { Initialize(); }

  NewEmployeeID = -1;

  SqlConnection conn = new SqlConnection(_connectionString);
  SqlCommand    cmd  = new SqlCommand("INSERT INTO Employees " + 
                                      "  (FirstName, LastName, Address, City, Region, PostalCode) " +
                                      "  Values(@FirstName, @LastName, @Address, @City, @Region, @PostalCode); " +
                                      "SELECT @EmployeeID = SCOPE_IDENTITY()", conn);  

  cmd.Parameters.Add("@FirstName",  SqlDbType.VarChar, 10).Value = FirstName;
  cmd.Parameters.Add("@LastName",   SqlDbType.VarChar, 20).Value = LastName;
  cmd.Parameters.Add("@Address",    SqlDbType.VarChar, 60).Value = Address;
  cmd.Parameters.Add("@City",       SqlDbType.VarChar, 15).Value = City;
  cmd.Parameters.Add("@Region",     SqlDbType.VarChar, 15).Value = Region;
  cmd.Parameters.Add("@PostalCode", SqlDbType.VarChar, 10).Value = PostalCode;
  SqlParameter p = cmd.Parameters.Add("@EmployeeID", SqlDbType.Int);
  p.Direction = ParameterDirection.Output;

  try
  {
    conn.Open();

    cmd.ExecuteNonQuery();

    NewEmployeeID = (int)p.Value;
  }
  catch (SqlException e)
  {
    // Handle exception.
  }
  finally
  {
    conn.Close();
  }

  return true;
}

Parameterdatentypen

Standardmäßig sind alle Parameter für Geschäftsobjektmethoden als Object typisiert. Wenn die Geschäftsobjektmethode Parameter unterschiedlicher Typen enthält, müssen Sie explizit Parameter mit strikter Typbindung angeben. Ausführliche Informationen finden Sie unter Verwenden von Parametern für Datenquellen-Steuerelemente.

Übergeben von benutzerdefinierten Parametertypen

Die meisten Signaturen von Geschäftsobjektmethoden nehmen Parameter der Typen String und Int32 an. Möglicherweise haben Sie es jedoch mit einer Geschäftsobjektmethode zu tun, bei der ein oder mehrere angenommene Parameter von einem komplexen oder benutzerdefinierten Typ sind. Um mit komplexen oder benutzerdefinierten Parametertypen zu arbeiten, können Sie die DataObjectTypeName-Eigenschaft des ObjectDataSource-Steuerelements verwenden.

Wenn Sie in einem Geschäftsobjekt Methoden mit langen Parameterlisten erstellen, die Steuerelementwerten über eine 1:1-Beziehung Datenspeicherwerte zuordnen, kann dadurch Code entstehen, der nur schwer wiederverwendbar ist. Es ist besser, die Daten in einer benutzerdefinierten Klasse zu kapseln und dann eine Instanz der Klasse als Parameter zu übergeben. Auf diese Weise müssen bei einer Änderung der Daten, die eine Instanz der Klasse bilden (es kann sich z. B. um einen Mitarbeiterdatensatz handeln), die vom Datenquellenobjekt verfügbar gemachten öffentlichen Schnittstellen nicht geändert werden. Das folgende Codebeispiel zeigt eine Klasse mit dem Namen NorthwindExployee, die die Mitarbeiterdaten definiert und die als Parameter an ein Geschäftsobjekt übergeben werden kann.

public class NorthwindEmployee {
    public NorthwindEmployee() { }
    private int _empId;
    private string _firstName;
    public int EmpId {
      get { return _empId; }
      set { _empId = value; }
    }
    public string FirstName {
      get { return _firstName; }
      set { _firstName = value; }
    }
    // Additional code for the class.
}
Public Class NorthwindEmployee
    Public Sub New()
    End Sub

    Private _empId As String
    Public Property EmpId() As Integer
        Get
            Return _empId
        End Get
        Set
            _empId = value
        End Set
    End Property 

    Private _firstName As String
    Public Property FirstName() As String
        Get
            Return _firstName
        End Get
        Set
            _firstName = value
        End Set
    End Property

    ' Additional code for the class.
End Class

Um eine Instanz der obigen Klasse als Parameter zu akzeptieren, kann die UpdateEmployeeInfo-Methode des Geschäftsobjekts z. B. mit der folgenden Signatur definiert werden:

public void UpdateEmployeeInfo(NorthwindEmployee emp) {
}
Public Sub UpdateEmployeeInfo(emp As NorthwindEmployee)
End Sub

Obwohl es nicht möglich ist, den Type eines Parameters auf den Namen einer benutzerdefinierten Klasse festzulegen, können Sie die DataObjectTypeName-Eigenschaft eines ObjectDataSource-Steuerelements auf den Namen eines benutzerdefinierten Typs festlegen, z. B. auf die NorthwindEmployee-Klasse. Sie können dann eine Instanz des Typs an eine Datenmethode des Geschäftsobjekts übergeben. Damit benutzerdefinierte Objekte an ein Datenquellenobjekt übergeben werden können, müssen folgende Bedingungen erfüllt sein:

  • Der benutzerdefinierte Typ muss über einen Standardkonstruktor verfügen, d. h. einen Konstruktor, der keine Parameter annimmt.

  • Der benutzerdefinierte Typ muss öffentliche Eigenschaften definieren, deren Namen mit denen der Wörterbucheinträge übereinstimmen, die dem Datenquellensteuerelement von datengebundenen Steuerelementen, z. B. GridView und DetailsView, übergeben werden. Ausführliche Informationen zu diesen Wörterbüchern finden Sie unter Verwenden von Parametern für Datenquellen-Steuerelemente.

  • Die öffentlichen Eigenschaften des Datenquellenobjekts müssen sowohl get-Accessoren als auch set-Accessoren verfügbar machen.

Das folgende Beispiel veranschaulicht ein ObjectDataSource-Steuerelement, das einen Aktualisierungsvorgang durchführt, indem es die UpdateEmployeeInfo-Methode eines Geschäftsobjekts mit dem Namen EmployeeLogic aufruft. Das ObjectDataSource-Steuerelement ist so konfiguriert, dass es eine Instanz der NorthwindEmployee-Klasse an die Aktualisierungsmethode übergibt.

<asp:objectdatasource
  
  id="ObjectDataSource1"
  typename="EmployeeLogic"
  selectmethod="GetAllEmployees"
  updatemethod="UpdateEmployeeInfo"
  dataobjecttypename="NorthwindEmployee" />

In einigen Fällen enthält die Geschäftsobjektmethode eine Parameterliste mit mehreren komplexen Parametertypen. In diesem Fall können Sie das ObjectDataSource-Steuerelement verwenden, aber Sie müssen dem ObjectDataSource-Steuerelement die Parameter programmgesteuert hinzufügen. Behandeln Sie dazu das Ereignis, das vor dem Datenvorgang ausgelöst wird, also z. B. die Ereignisse Inserting, Updating oder Deleting, und legen Sie die Werte in der InputParameters-Auflistung fest, die von der ObjectDataSourceMethodEventArgs-Klasse verfügbar gemacht wird.

Siehe auch

Referenz

Übersicht über das ObjectDataSource-Webserversteuerelement

ObjectDataSource

Parameter