ObjectDataSource コントロールにおけるパラメータの使用

更新 : 2007 年 11 月

ObjectDataSource コントロールは、SelectMethodInsertMethodUpdateMethod、または DeleteMethod の各プロパティで識別されるメソッドの名前に基づいてビジネス オブジェクト メソッドを呼び出します (さらに、ビジネス オブジェクト メソッドのシグネチャを形成するパラメータ名に基づくこともあります)。ビジネス オブジェクトでメソッドを作成する場合は、ビジネス オブジェクト メソッドが受け取るパラメータの名前と型が ObjectDataSource コントロールが渡すパラメータの名前と型に一致する必要があります。パラメータの順序は重要ではありません。

パラメータの使用

すべてのデータ ソース コントロールと同様に、ObjectDataSource コントロールは実行時に入力パラメータを受け取ってパラメータ コレクションで管理します。それぞれのデータ操作には、関連するパラメータ コレクションがあります。たとえば、選択操作では SelectParameters コレクションを使用し、更新操作では UpdateParameters コレクションを使用します。

各パラメータには、名前、型、方向、および既定値を指定できます。コントロール、セッション変数、ユーザー プロファイルなどの特定のオブジェクトから値を受け取るパラメータには、追加のプロパティを設定する必要があります。たとえば、ControlParameter オブジェクトでは ControlID プロパティを設定してパラメータ値を取得するコントロールを指定し、PropertyName プロパティを設定してパラメータ値を含むプロパティを指定します。詳細については、「データ ソース コントロールとパラメータの使用」を参照してください。

ObjectDataSource コントロールが呼び出すことができる選択メソッドのコード例を次に示します。このメソッドは、パラメータを受け取ってデータ ソースからレコードを 1 つ選択します。

<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;
}

挿入、更新、および削除の各メソッドにパラメータを渡す

ObjectDataSource コントロールは、InsertParametersUpdateParameters、および DeleteParameters の各コレクションに基づいて、挿入、更新、および削除の各操作に対して呼び出すメソッドを決定します。ObjectDataSource コントロールは、GridView コントロール、FormView コントロールなどの自動的な更新、挿入、および削除をサポートするデータ バインド コントロールが渡す値に基づいてパラメータを自動的に作成することもできます。詳細については、「データ ソース コントロールがデータ連結フィールドのパラメータを作成する方法」を参照してください。

ObjectDataSource コントロールが呼び出すことができるメソッドのコード例を次に示します。このメソッドは、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;
}

このコード例では、ObjectDataSource コントロールの ConflictDetection プロパティが OverwriteChanges に設定されていることを前提にしています。ConflictDetection プロパティが CompareAllValues に設定されている場合、ビジネス オブジェクト メソッドはデータ フィールドの元の値のパラメータを受け取る必要があります。現在の値と元の値のパラメータは、OldValuesParameterFormatString プロパティを使用して区別できます。OldValuesParameterFormatString プロパティには、元の値のパラメータの名前の形式を指定するために使用する文字列式を設定します。ここで、{0} 文字はフィールド名を表します。たとえば、OldValuesParameterFormatString プロパティを original_{0} に設定すると、FirstName というフィールドの現在の値は FirstName というパラメータで渡され、フィールドの元の値は original_FirstName というパラメータで渡されます。

並べ替えとページングのパラメータの指定

Select ビジネス オブジェクト メソッドには、SelectParameters オブジェクトを指定できるだけでなく、並べ替えとページングのパラメータを含めることができます。これによって、データ ソース オブジェクトのデータを並べ替えることができ、データ ソース オブジェクトから返される結果を必要なデータのページのみに制限できます。

並べ替えのパラメータの指定

Select ビジネス オブジェクト メソッドの並べ替えのパラメータは、ObjectDataSource コントロールの SortParameterName プロパティを使用して指定できます。SortParameterName プロパティには、ビジネス オブジェクト メソッドに並べ替えのための列名を渡すために使用するパラメータの名前を指定します。このパラメータは文字列型です。

GridView コントロールなどの特定のデータ バインド コントロールは、ObjectDataSource コントロールに並べ替えパラメータを自動的に渡すことができます。並べ替えをサポートするデータ バインド コントロールを ObjectDataSource コントロールにバインドすると、データ バインド コントロールは結果を並べ替えるために使用するデータ列を指定する並べ替え式を渡します。たとえば、GridView コントロールは SortExpression プロパティに並べ替えの値を入れて渡します。ObjectDataSource コントロールは、SortParameterName プロパティが指定するパラメータの値を渡された並べ替え式に基づいて設定します。並べ替え式には複数の列を指定でき、その場合、列名はコンマによって区切ります。降順の並べ替えを指定する場合、並べ替え式には並べ替えの列名の後に DESC 修飾子を含めます。たとえば、並べ替えに使用する列として LastName 列と FirstName 列を指定する並べ替え式は、昇順の並べ替えでは "LastName, FirstName" になり、降順の並べ替えでは "LastName, FirstName DESC" になります。

ページングのパラメータの指定

Select メソッドには、返すデータのページを指定するための追加のパラメータを指定できます。ObjectDataSource コントロールは、ページングのパラメータを指定するための 2 つのプロパティをサポートします。

  • StartRowIndexParameterName プロパティには、データ ページの開始行を指定するために使用するビジネス オブジェクトの選択メソッド内のパラメータの名前を指定します。

  • MaximumRowsParameterName プロパティには、データ ページの行数を指定するために使用するビジネス オブジェクトの選択メソッド内のパラメータの名前を指定します。

StartRowIndexParameterName プロパティと MaximumRowsParameterName プロパティによって指定されるこの 2 つのパラメータは共に Int32 型です。

並べ替えのパラメータとページングのパラメータを指定されたビジネス オブジェクトの Select メソッドに渡すように構成された ObjectDataSource コントロールのコード例を次に示します。

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

前の例で呼び出されている Select ビジネス オブジェクト メソッドのコード例を次に示します。ビジネス オブジェクト メソッドは、Northwind サンプル データベースから指定された順序で並べ替えられたデータ ページを返します。

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;
    }
  }
}

パラメータの方向

既定では、ビジネス オブジェクト メソッドのすべてのパラメータは入力パラメータです。ビジネス オブジェクト メソッドに ObjectDataSource コントロールに値を返す出力パラメータが含まれる場合、「データ ソース コントロールとパラメータの使用」に説明されているように、パラメータの方向をパラメータに明示的に指定する必要があります。

Int32 型の出力パラメータを受け入れるように構成された ObjectDataSource コントロールのコード例を次に示します。出力パラメータは、InsertMethod プロパティによって指定されたメソッドから自動的に生成された主キー値を返します。

<asp:ObjectDataSource 
  ID="EmployeeDetailsObjectDataSource" 
  runat="server" 
  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" 
  runat="server" 
  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>

主キー値を出力パラメータとして返す Insert ビジネス オブジェクト メソッドのコード例を次に示します。

<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;
}

パラメータのデータ型

既定では、ビジネス オブジェクト メソッドのすべてのパラメータは、Object 型です。ビジネス オブジェクト メソッドに別の型のパラメータが含まれる場合は、厳密に型指定されたパラメータを明示的に指定する必要があります。詳細については、「データ ソース コントロールとパラメータの使用」を参照してください。

カスタムのパラメータ型を渡す

ほとんどのビジネス オブジェクト メソッドのシグネチャは String 型と Int32 型のパラメータを受け取ります。ただし、複合型またはユーザー定義型で型指定された 1 つ以上のパラメータを受け取るビジネス オブジェクト メソッドを使用する場合もあります。複合型またはユーザー定義型のパラメータを使用する場合は、ObjectDataSource コントロールの DataObjectTypeName プロパティを使用します。

ビジネス オブジェクトでコントロール値をデータ ストア値に 1 対 1 でマップする長いパラメータ リストを使用するメソッドを作成すると、容易に再利用できないコードが生成される場合があります。このような場合は、カスタム クラスにデータをカプセル化し、クラスのインスタンスをパラメータとして渡します。これによって、データ ソース オブジェクトによって公開されるパブリック インターフェイスを変更せずに、従業員レコードなどのクラスのインスタンスを形成するデータを変更できます。従業員データを定義し、ビジネス オブジェクトにパラメータとして渡すことができる NorthwindExployee というクラスのコード例を次に示します。

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

上のクラスのインスタンスをパラメータとして受け取るには、次のシグネチャを使用してビジネス オブジェクトの UpdateEmployeeInfo メソッドを定義します。

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

パラメータの Type をカスタム クラスの名前に設定することはできませんが、ObjectDataSource コントロールの DataObjectTypeName プロパティを NorthwindEmployee クラスなどのカスタムのユーザー定義型の名前に設定し、この型のインスタンスをビジネス オブジェクトのデータ メソッドに渡すことはできます。ユーザー定義オブジェクトをデータ ソース オブジェクトに渡す場合は、次の条件を満たす必要があります。

  • ユーザー定義型には、パラメータを受け取らない既定のコンストラクタが必要です。

  • ユーザー定義型には、GridViewDetailsView などのデータ バインド コントロールからデータ ソース コントロールに渡される辞書エントリに名前が一致するパブリック プロパティを定義する必要があります。辞書の詳細については、「データ ソース コントロールとパラメータの使用」を参照してください。

  • データ ソース オブジェクトのパブリック プロパティは、get アクセサと set アクセサを公開する必要があります。

EmployeeLogic というビジネス オブジェクトの UpdateEmployeeInfo メソッドを呼び出して更新操作を実行する ObjectDataSource コントロールの例を次に示します。ObjectDataSource コントロールは、NorthwindEmployee クラスのインスタンスを更新メソッドに渡すように構成されています。

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

ビジネス オブジェクト メソッドは、複数のパラメータの複合型を含むパラメータ リストを持つ場合もあります。そのような場合にも ObjectDataSource コントロールを使用できますが、プログラムによって ObjectDataSource コントロールにパラメータを追加する必要があります。そのためには、データ操作を実行する前に発生する InsertingUpdatingDeleting などのイベントを処理し、ObjectDataSourceMethodEventArgs クラスが公開する InputParameters コレクションに値を設定します。

参照

参照

ObjectDataSource Web サーバー コントロールの概要

ObjectDataSource

Parameter