ObjectDataSource コントロールにおけるパラメータの使用
更新 : 2007 年 11 月
ObjectDataSource コントロールは、SelectMethod、InsertMethod、UpdateMethod、または 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 コントロールは、InsertParameters、UpdateParameters、および 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 クラスなどのカスタムのユーザー定義型の名前に設定し、この型のインスタンスをビジネス オブジェクトのデータ メソッドに渡すことはできます。ユーザー定義オブジェクトをデータ ソース オブジェクトに渡す場合は、次の条件を満たす必要があります。
ユーザー定義型には、パラメータを受け取らない既定のコンストラクタが必要です。
ユーザー定義型には、GridView、DetailsView などのデータ バインド コントロールからデータ ソース コントロールに渡される辞書エントリに名前が一致するパブリック プロパティを定義する必要があります。辞書の詳細については、「データ ソース コントロールとパラメータの使用」を参照してください。
データ ソース オブジェクトのパブリック プロパティは、get アクセサと set アクセサを公開する必要があります。
EmployeeLogic というビジネス オブジェクトの UpdateEmployeeInfo メソッドを呼び出して更新操作を実行する ObjectDataSource コントロールの例を次に示します。ObjectDataSource コントロールは、NorthwindEmployee クラスのインスタンスを更新メソッドに渡すように構成されています。
<asp:objectdatasource
runat="server"
id="ObjectDataSource1"
typename="EmployeeLogic"
selectmethod="GetAllEmployees"
updatemethod="UpdateEmployeeInfo"
dataobjecttypename="NorthwindEmployee" />
ビジネス オブジェクト メソッドは、複数のパラメータの複合型を含むパラメータ リストを持つ場合もあります。そのような場合にも ObjectDataSource コントロールを使用できますが、プログラムによって ObjectDataSource コントロールにパラメータを追加する必要があります。そのためには、データ操作を実行する前に発生する Inserting、Updating、Deleting などのイベントを処理し、ObjectDataSourceMethodEventArgs クラスが公開する InputParameters コレクションに値を設定します。