Framework 2.0中,对于数据表现控件和数据操作有很大改善。常见采用表现层控件邦定数据源控件实现。
最简单的一个数据操作方案可以采用SqlDataSource 控件与 GridView 。但是在实际应用中,较复杂的项目通常是多层的结构,直接用表现层控件(如GridView)操作数据层是不现实的。
因此,在多层结构应用中,通常要使用ObjectDataSource实现数据操作。ObjectDataSource可以面向一个类,通过反射调用类中的方法,实现通过中间层对数据的操作。
我们在这里设想您需要创建一个用于显示 Products 数据库表的内容的 Web 页面。再进一步设想您的某个现有业务组件包含了一种用于检索此数据的方法。
例如,清单 1 中的组件包含了一个名为 GetProducts 的方法,此方法返回一个 DataReader 来表示 Products 数据库表的内容。
清单 1: ProductInfo.cs (C#)
using System;
using System.Data;
using System.Data.SqlClient;
public class ProductInfo
{
const string conString = "Server=localhost;Trusted_Connection=true;Database=Northwind";
public static SqlDataReader GetProducts() //使用DataSet具有同样效果
{
SqlConnection con = new SqlConnection(conString);
string selectString = "SELECT * FROM Products";
SqlCommand cmd = new SqlCommand(selectString, con);
con.Open();
SqlDataReader dtr = cmd.ExecuteReader(CommandBehavior.CloseConnection);
return dtr;
}
}ShowProducts.aspx
<html><head>
<title>Show Products</title></head>
<body>
<form id="form1" runat="server">
<asp:GridView ID="GridView1" DataSourceID="ObjectDataSource1" Runat="Server" />
<asp:ObjectDataSource ID="ObjectDataSource1" TypeName="ProductInfo" SelectMethod="GetProducts" Runat="Server" />
</form></body></html>如果SelectMethod需要参数,可以设置SelectParameters。
数据的修改和删除,ObjectDataSource 控件包含 4 个重要属性:SelectMethod 属性、UpdateMethod 属性、InsertMethod 属性和 DeleteMethod 属性。综合利用这些属性,您能够指定执行标准数据库操作所需的所有方法。
ProductInfo3.cs
using System;
using System.Data;
using System.Data.SqlClient;
public class ProductInfo3
{
const string conString ="Server=localhost;Trusted_Connection=true;Database=Northwind";
public static SqlDataReader GetProducts()
{
SqlConnection con = new SqlConnection(conString);
string selectString = "SELECT ProductId,ProductName, " + "UnitPrice FROM Products ORDER BY ProductId";
SqlCommand cmd = new SqlCommand(selectString, con);
con.Open();
SqlDataReader dtr =cmd.ExecuteReader(CommandBehavior.CloseConnection);
return dtr;
}
public static void UpdateProduct(int original_productId, string productName, decimal unitPrice)
{
SqlConnection con = new SqlConnection(conString);
string updateString = "UPDATE Products SET " + "ProductName=@ProductName,UnitPrice=@UnitPrice " + "WHERE ProductID=@ProductID";
SqlCommand cmd = new SqlCommand(updateString, con);
cmd.Parameters.AddWithValue("@ProductName", productName);
cmd.Parameters.AddWithValue("@UnitPrice", unitPrice);
cmd.Parameters.AddWithValue("@ProductId", original_productId);
con.Open();
cmd.ExecuteNonQuery();
con.Close();
}
public static void DeleteProduct(int original_productId)
{
SqlConnection con = new SqlConnection(conString);
string deleteString = "DELETE Products " + "WHERE ProductID=@ProductID";
SqlCommand cmd = new SqlCommand(deleteString, con);
cmd.Parameters.AddWithValue("@ProductId", original_productId);
con.Open();
cmd.ExecuteNonQuery();
con.Close();
}
}ShowProducts3.aspx
<html><head>
<title>Show Products</title></head><body>
<form id="form1" runat="server">
<asp:GridView ID="GridView1" DataSourceID="ObjectDataSource1" DataKeyNames="ProductId" AutoGenerateColumns="false" AutoGenerateEditButton="true" AutoGenerateDeleteButton="true" Runat="Server">
<Columns><asp:BoundField DataField="ProductName"/>
<asp:BoundField DataField="UnitPrice" DataFormatString="{0:c}"/> </Columns>
</asp:GridView>
<asp:ObjectDataSource ID="ObjectDataSource1" TypeName="ProductInfo3" SelectMethod="GetProducts" UpdateMethod="UpdateProduct" DeleteMethod="DeleteProduct" Runat="Server">
<UpdateParameters>
<asp:Parameter Name="original_productId" Type="Int32" />
<asp:Parameter Name="productName" />
<asp:Parameter Name="unitPrice" Type="Decimal"/>
</UpdateParameters>
</asp:ObjectDataSource>
</form></body></html>



浙公网安备 33010602011771号