[转]一步一步学习ObjectDataSource
ASP.NET2.0给出了ObjectDataSource控件,结果使得Code变成了属性的设置,本文一步一步介绍ObjectDataSource的使用
1)基本使用
绑定到数据访问层
数据访问层组件封装 ADO.NET 代码以通过 SQL 命令查询和修改数据库。它通常提炼创建 ADO.NET 连接和命令的详细信息,并通过可使用适当的参数调用的方法公开这些详细信息。典型的数据访问层组件可按如下方式公开:
和上面方法相对应, ObjectDataSource提供了四个属性来设置该控件引用的数据处理,可以按照如下方式关联到该类型,代码如下
同样依次类推,UpdateMethod/DeleteMethod/InsertMethod分别对应的是UpdateRecord
/DeleteRecord/InsertRecord方法。
在上面GetRecords()的定义时,可以看到该方法返回的类型是DataView,由于ObjectDataSource将来需要作为绑定控件的数据来源,所以它的返回类型必须如下的返回类型之一:
Ienumerable、DataTable、DataView、DataSet或者Object。
在这段代码里,定义了GetEmployees方法来获取所有员工级别信息,UpdateEmployee方法更新员工的基本资料,DeleteEmployee方法用来删除员工资料,这样就可以在ObjectDataSource1.aspx里使用如下代码调用业务逻辑的处理,如下
既然FistName、LastName、Title等并没有更新,为什么不将UpdateEmployee写成如下方式呢?
提示错误为:ObjectDataSource1找不到一个包含Address,City,LastName,Firstname,Title,Region,PostalCode和Employee参数的非泛型方法(具体原因我还没有进行验证,我的感觉是ObjectDataSource是根据Select语句自动生成Delete/Insert/Update等的,所以在更新时,同样需要该参数,你可以到如下MSDN查看SelectMethod的说明:
http://msdn2.microsoft.com/en-us/library/system.web.ui.webcontrols.objectdatasource.selectmethod(VS.80).aspx
)。
而我看到的例子,大多都是如下写法:
1)基本使用
绑定到数据访问层
数据访问层组件封装 ADO.NET 代码以通过 SQL 命令查询和修改数据库。它通常提炼创建 ADO.NET 连接和命令的详细信息,并通过可使用适当的参数调用的方法公开这些详细信息。典型的数据访问层组件可按如下方式公开:
public class MyDataBllLayer {
public DataView GetRecords();
public int UpdateRecord(int recordID, String recordData);
public int DeleteRecord(int recordID);
public int InsertRecord(int recordID, String recordData);
}
通常是在业务逻辑访问层定义对数据库里记录的操作,上面就定义了GetRecords、UpdateRecord、DeleteRecord和InsertRecord四个方法来读取、更新、删除和插入数据库里的数据,这些方法基本上是根据SQL里的Select、Update、Delete和Insert语句而定义。public DataView GetRecords();
public int UpdateRecord(int recordID, String recordData);
public int DeleteRecord(int recordID);
public int InsertRecord(int recordID, String recordData);
}
和上面方法相对应, ObjectDataSource提供了四个属性来设置该控件引用的数据处理,可以按照如下方式关联到该类型,代码如下
<asp:ObjectDataSource TypeName="MyDataLayer" runat="server"
SelectMethod="GetRecords"
UpdateMethod="UpdateRecord"
DeleteMethod="DeleteRecord"
InsertMethod="InsertRecord" />
这里的SelectMethon设置为MyDataBllLayer里的GetRecords()方法,在使用时需要注意ObjectDataSource旨在以声明的方式简化数据的开发,所以这里设置SelectMethod的值为GetRecords而不是GetRecords()。SelectMethod="GetRecords"
UpdateMethod="UpdateRecord"
DeleteMethod="DeleteRecord"
InsertMethod="InsertRecord" />
同样依次类推,UpdateMethod/DeleteMethod/InsertMethod分别对应的是UpdateRecord
/DeleteRecord/InsertRecord方法。
在上面GetRecords()的定义时,可以看到该方法返回的类型是DataView,由于ObjectDataSource将来需要作为绑定控件的数据来源,所以它的返回类型必须如下的返回类型之一:
Ienumerable、DataTable、DataView、DataSet或者Object。
除此以外,ObjectDataSource还有一个重要的属性TypeName,ObjectDataSource控件使用反射技术来从来从业务逻辑程序层的类对象调用相应的方法,所以TypeName的属性值就是用来标识该控件工作时使用的类名称,下面的例子演示了ObjectDataSource的基本使用。
在该例子里定义了一个数据业务逻辑层来处理数据库链接和业务逻辑,这些处理都是有App_Code文件夹下的NorthwndDB.cs文件完成,先大致浏览一下该文件里定义的方法:
using System;
using System.Configuration;
using System.Data;
using System.Data.SqlClient;
using System.Collections.Generic;
using System.Web.UI;
using System.Web.UI.WebControls;
public class EmployeeInfo
{
private string _connectionString;
public EmployeeInfo()
{ _connectionString =
ConfigurationManager.ConnectionStrings["Northwind"].ConnectionString;
}
public SqlDataReader GetEmployees()
{
SqlConnection con = new SqlConnection(_connectionString);
string selectString = "SELECT EmployeeID,LastName,Firstname,Title,Address,City,Region,PostalCode FROM Employees ORDER BY EmployeeID";
SqlCommand cmd = new SqlCommand(selectString, con);
con.Open();
SqlDataReader dtr =
cmd.ExecuteReader(CommandBehavior.CloseConnection);
return dtr;
}
public void UpdateEmployee(int EmployeeId, string LastName, string Firstname, string Title, string Address, string City, String Region, string PostalCode)
{
SqlConnection con = new SqlConnection(_connectionString);
string updateString = "UPDATE Employees SET Address=@Address,City=@City WHERE EmployeeID=@EmployeeID";
SqlCommand cmd = new SqlCommand(updateString, con);
cmd.Parameters.AddWithValue("@Address", Address);
cmd.Parameters.AddWithValue("@City", City);
cmd.Parameters.AddWithValue("@EmployeeID", EmployeeId);
con.Open();
cmd.ExecuteNonQuery();
con.Close();
}
public void DeleteEmployee(int EmployeeId)
{
SqlConnection con = new SqlConnection(_connectionString);
string deleteString = "DELETE Employees WHERE EmployeeID=@EmployeeID";
SqlCommand cmd = new SqlCommand(deleteString, con);
cmd.Parameters.AddWithValue("@EmployeeId", EmployeeId);
con.Open();
cmd.ExecuteNonQuery();
con.Close();
}
}
using System.Configuration;
using System.Data;
using System.Data.SqlClient;
using System.Collections.Generic;
using System.Web.UI;
using System.Web.UI.WebControls;
public class EmployeeInfo
{
private string _connectionString;
public EmployeeInfo()
{ _connectionString =
ConfigurationManager.ConnectionStrings["Northwind"].ConnectionString;
}
public SqlDataReader GetEmployees()
{
SqlConnection con = new SqlConnection(_connectionString);
string selectString = "SELECT EmployeeID,LastName,Firstname,Title,Address,City,Region,PostalCode FROM Employees ORDER BY EmployeeID";
SqlCommand cmd = new SqlCommand(selectString, con);
con.Open();
SqlDataReader dtr =
cmd.ExecuteReader(CommandBehavior.CloseConnection);
return dtr;
}
public void UpdateEmployee(int EmployeeId, string LastName, string Firstname, string Title, string Address, string City, String Region, string PostalCode)
{
SqlConnection con = new SqlConnection(_connectionString);
string updateString = "UPDATE Employees SET Address=@Address,City=@City WHERE EmployeeID=@EmployeeID";
SqlCommand cmd = new SqlCommand(updateString, con);
cmd.Parameters.AddWithValue("@Address", Address);
cmd.Parameters.AddWithValue("@City", City);
cmd.Parameters.AddWithValue("@EmployeeID", EmployeeId);
con.Open();
cmd.ExecuteNonQuery();
con.Close();
}
public void DeleteEmployee(int EmployeeId)
{
SqlConnection con = new SqlConnection(_connectionString);
string deleteString = "DELETE Employees WHERE EmployeeID=@EmployeeID";
SqlCommand cmd = new SqlCommand(deleteString, con);
cmd.Parameters.AddWithValue("@EmployeeId", EmployeeId);
con.Open();
cmd.ExecuteNonQuery();
con.Close();
}
}
在这段代码里,定义了GetEmployees方法来获取所有员工级别信息,UpdateEmployee方法更新员工的基本资料,DeleteEmployee方法用来删除员工资料,这样就可以在ObjectDataSource1.aspx里使用如下代码调用业务逻辑的处理,如下
<asp:GridView
ID="GridView1"
DataSourceID="ObjectDataSource1"
DataKeyNames="EmployeeId"
AutoGenerateColumns="true"
AutoGenerateEditButton="True"
AutoGenerateDeleteButton="True"
Runat="Server" CellPadding="4" Font-Names="Verdana" Font-Size="X-Small" ForeColor="#333333" GridLines="None">
… …
</asp:GridView>
<asp:ObjectDataSource
ID="ObjectDataSource1"
TypeName="EmployeeInfo"
SelectMethod="GetEmployees"
UpdateMethod="UpdateEmployee"
DeleteMethod="DeleteEmployee"
Runat="Server">
<UpdateParameters>
<asp:Parameter Name="EmployeeId" Type="Int32" />
<asp:Parameter Name="Address" />
<asp:Parameter Name="City" />
</UpdateParameters>
</asp:ObjectDataSource>
ID="GridView1"
DataSourceID="ObjectDataSource1"
DataKeyNames="EmployeeId"
AutoGenerateColumns="true"
AutoGenerateEditButton="True"
AutoGenerateDeleteButton="True"
Runat="Server" CellPadding="4" Font-Names="Verdana" Font-Size="X-Small" ForeColor="#333333" GridLines="None">
… …
</asp:GridView>
<asp:ObjectDataSource
ID="ObjectDataSource1"
TypeName="EmployeeInfo"
SelectMethod="GetEmployees"
UpdateMethod="UpdateEmployee"
DeleteMethod="DeleteEmployee"
Runat="Server">
<UpdateParameters>
<asp:Parameter Name="EmployeeId" Type="Int32" />
<asp:Parameter Name="Address" />
<asp:Parameter Name="City" />
</UpdateParameters>
</asp:ObjectDataSource>
上面使用了GrieView控件后面会有专门介绍,这里我们专注ObjectDataSource控件的使用,在该控件里设置 TypeName为"EmployeeInfo"表示将来调用的类名称为EmployeeInfo,调用SelectMethond/UpdateMethod/DeleteMethod调用的的方法分别是EmployeeInfo类里的GetEmployees/UpdateEmployee/DeleteEmployee方法。
具体运行可以自己试验。从运行结果里单击“Edit”可以更新员工的资料,单击“Delete”将删除员工的资料。
在运行上面的例子里,可能看到UpdateEmployee的定义如下:
public void UpdateEmployee(int EmployeeId, string LastName, string Firstname, string Title, string Address, string City, String Region, string PostalCode)
{
cmd.Parameters.AddWithValue("@Address", Address);
cmd.Parameters.AddWithValue("@City", City);
cmd.Parameters.AddWithValue("@EmployeeID", EmployeeId);
}
这段代码表示更新员工资料时,其实只更新了员工的地址(Address)和所在的程序(City),而对于姓名(FirstName,LastName)、职称(Title)等并没有更新。{
cmd.Parameters.AddWithValue("@Address", Address);
cmd.Parameters.AddWithValue("@City", City);
cmd.Parameters.AddWithValue("@EmployeeID", EmployeeId);
}
既然FistName、LastName、Title等并没有更新,为什么不将UpdateEmployee写成如下方式呢?
public void UpdateEmployee(int EmployeeId string Address, string City,)
{
cmd.Parameters.AddWithValue("@Address", Address);
cmd.Parameters.AddWithValue("@City", City);
cmd.Parameters.AddWithValue("@EmployeeID", EmployeeId);
}
也就是只保留需要的三个参数而将其它变量不写,如果这样做将发生错误如下:{
cmd.Parameters.AddWithValue("@Address", Address);
cmd.Parameters.AddWithValue("@City", City);
cmd.Parameters.AddWithValue("@EmployeeID", EmployeeId);
}
提示错误为:ObjectDataSource1找不到一个包含Address,City,LastName,Firstname,Title,Region,PostalCode和Employee参数的非泛型方法(具体原因我还没有进行验证,我的感觉是ObjectDataSource是根据Select语句自动生成Delete/Insert/Update等的,所以在更新时,同样需要该参数,你可以到如下MSDN查看SelectMethod的说明:
http://msdn2.microsoft.com/en-us/library/system.web.ui.webcontrols.objectdatasource.selectmethod(VS.80).aspx
)。
而我看到的例子,大多都是如下写法:
public void UpdateEmployee(int EmployeeId, string LastName, string Firstname, string Title, string Address, string City, String Region, string PostalCode)
{
UpdateEmployee(EmployeeId,Address,City)
}
public void UpdateEmployee(int EmployeeId, string Address, string City )
{
SqlConnection con = new SqlConnection(_connectionString);
string updateString = "UPDATE Employees SET Address=@Address,City=@City WHERE EmployeeID=@EmployeeID";
SqlCommand cmd = new SqlCommand(updateString, con);
cmd.Parameters.AddWithValue("@Address", Address);
cmd.Parameters.AddWithValue("@City", City);
cmd.Parameters.AddWithValue("@EmployeeID", EmployeeId);
con.Open();
cmd.ExecuteNonQuery();
con.Close();
}
{
UpdateEmployee(EmployeeId,Address,City)
}
public void UpdateEmployee(int EmployeeId, string Address, string City )
{
SqlConnection con = new SqlConnection(_connectionString);
string updateString = "UPDATE Employees SET Address=@Address,City=@City WHERE EmployeeID=@EmployeeID";
SqlCommand cmd = new SqlCommand(updateString, con);
cmd.Parameters.AddWithValue("@Address", Address);
cmd.Parameters.AddWithValue("@City", City);
cmd.Parameters.AddWithValue("@EmployeeID", EmployeeId);
con.Open();
cmd.ExecuteNonQuery();
con.Close();
}
通过重载UpdateEmployee方法,便于数据的扩展和维护。