创建 ObjectDataSource 控件源对象
更新:2007 年 11 月
ObjectDataSource 控件的源对象根据 ObjectDataSource 控件的请求在基础数据源中检索数据并执行更新。ObjectDataSource 控件的源对象可以是 ObjectDataSource 控件可创建其实例的任何类,或者是公开 ObjectDataSource 控件可调用的公共 static(在 Microsoft Visual Basic 中为 Shared)方法的任何类。
有关源对象和包含使用该源对象的 ObjectDataSource 控件的 ASP.NET 页的示例,请参见 ObjectDataSource 源对象示例 或 ObjectDataSource 强类型源对象示例。
对象创建
ObjectDataSource 控件将创建源对象的实例,调用指定的方法并释放位于单个请求范围内的所有对象实例(如果对象具有实例方法而不是 static 方法,在 Visual Basic 中则为 Shared)。因此,对象必须是无状态的。也就是说,源对象应获取并释放单个请求范围内所有必需的资源。
您可以通过处理 ObjectDataSource 控件的 ObjectCreating 事件来控制源对象的创建方式。您可以创建源对象的实例,然后将 ObjectDataSourceEventArgs 类的 ObjectInstance 属性设置为该实例。ObjectDataSource 控件将使用在 ObjectCreating 事件中创建的实例,而不是自己创建实例。
指定类构造函数
如果 ObjectDataSource 控件的源对象公开可调用的公共 static 方法(在 Visual Basic 中为 Shared)来检索和修改数据,则 ObjectDataSource 控件将直接调用这些方法。如果 ObjectDataSource 控件必须创建源对象的实例才能执行方法调用,则该对象必须包含一个不带参数的公共构造函数。ObjectDataSource 控件在创建源对象的新实例时将调用此构造函数。
如果源对象不包含不带参数的公共构造函数,则可以按照本主题前面“对象创建”中的讨论在 ObjectCreating 事件中创建 ObjectDataSource 控件要使用的源对象的实例。
指定对象方法
ObjectDataSource 控件的源对象可以包含任意数量的用于选择、插入、更新或删除数据的方法。ObjectDataSource 控件根据方法的名称(使用 ObjectDataSource 控件的 SelectMethod、InsertMethod、UpdateMethod 或 DeleteMethod 属性以及选定操作的相关参数集合中的参数名称进行标识)调用这些方法。有关详细信息,请参见 对 ObjectDataSource 控件使用参数。
此外,源对象还可以包含可选的 SelectCount 方法(由 ObjectDataSource 控件使用 SelectCountMethod 属性进行标识),该方法返回数据源中对象总数的计数。ObjectDataSource 控件在调用 Select 方法后将调用 SelectCount 方法,以在数据源中检索在分页时使用的总记录数。
说明: |
---|
如果您的对象支持分页,则强烈建议您实现 SelectCount 方法。这样将最大程度地降低数据绑定控件(例如 GridView 控件)为检索数据页而必须请求的记录数。如果源数据对象提供了总行数,则对于每一页,数据绑定控件仅需一次请求一页中的行。如果未提供总行数,则数据绑定控件必须请求数据源中的所有行(从请求的数据页的第一行开始)并丢弃不在当前页中的所有行。 |
使用强类型对象
源对象可以根据数据源中的数据返回和接收强类型对象。ObjectDataSource 控件使用 DataObjectTypeName 属性标识这些对象的类型。在此方案中,不是向方法传递一个或多个参数,而是传递一个聚合所有参数值的对象。有关如何将特定的对象类型作为源对象方法的参数传递的更多信息,请参见 对 ObjectDataSource 控件使用参数。
当 ObjectDataSource 控件的 ConflictDetection 属性设置为 CompareAllValues 值,并且 OldValuesParameterFormatString 属性设置为一个将原始值的参数与当前值的参数区分开的值时,ObjectDataSource 将执行以下操作:
在同时采用当前值和原始值的参数的源对象中调用 Update 方法。
在采用原始值的参数的源对象中调用 Delete 方法。
在使用强类型对象时,ObjectDataSource 控件将从同时采用以当前值填充的强类型对象和以原始值填充的强类型对象的源对象中调用 Update 方法。但是,在 ObjectDataSource 控件调用 Delete 方法并传递一个强类型对象时,无论 ConflictDetection 或 OldValuesParameterFormatString 设置如何,该控件都调用采用一个强类型对象作为参数的方法。如果 ConflictDetection 属性设置为 OverwriteChanges 值,则传递给 Delete 方法的对象只以当前主键值填充(该对象的其他属性为 null)。如果 ConflictDetection 属性设置为 CompareAllValues 值,则传递给 Delete 方法的对象以原始主键值以及该对象其余属性的原始值填充。
使用设计器
或者,可以向源对象应用一些属性,这些属性在设计器(如 Microsoft Visual Web Developer Web 开发工具)中将源对象描述为数据对象。由于这可以明确标识将对象的哪些方法用于选择、插入、更新和删除操作,因此可以改善使用设计器的开发人员的体验。
若要将某个对象标识为 ObjectDataSource 控件的源对象,请使用 DataObjectAttribute 属性,如下面的示例所示。
<DataObject(True)> _
Public Class NorthwindEmployee
[DataObject(true)]
public class NorthwindEmployee
若要将某个方法标识为数据对象方法,请使用 DataObjectMethodAttribute 属性。在应用 DataObjectMethodAttribute 属性时,应包括 DataObjectMethodType 枚举值之一以标识方法类型(select、insert、update 或 delete)。下面的代码示例使用 DataObjectMethodAttribute 属性将某个方法标识为 Delete 方法。
<DataObjectMethod(DataObjectMethodType.Delete)> _
Public Shared Function DeleteEmployee(EmployeeID As Integer) As Boolean
If Not _initialized Then Initialize()
Dim conn As SqlConnection = New SqlConnection(_connectionString)
Dim cmd As SqlCommand = New SqlCommand("DELETE FROM Employees WHERE EmployeeID = @EmployeeID", conn)
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.Delete)]
public static bool DeleteEmployee(int EmployeeID)
{
if (!_initialized) { Initialize(); }
SqlConnection conn = new SqlConnection(_connectionString);
SqlCommand cmd = new SqlCommand("DELETE FROM Employees WHERE EmployeeID = @EmployeeID", conn);
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;
}