2.Web 编程技巧
1)运用ado.net中的dataview对已存在结果集进行再查询
在cart类的AddItem方法中我们可看到源码:
public void AddItem(int itemId,
String itemDescription, Decimal itemPrice)
{
DataTable itemTable = OrderItems;
DataView itemSource = new DataView(itemTable);
//search for item,
//check to see if the item has already been ordered
//通过itemid查找item,检查是否已预定该item,
//利用DataView的RowFilter属性,设置其过滤条件。
//接下来用DataView的count属性执行查询并返回满足条件的记录数
itemSource.RowFilter = "ItemNumber = " + itemId.ToString();
//如果已经订了该书,增加数量
if (itemSource.Count > 0)
{
DataRowView sourceRow = itemSource[0];
short count = (short)(sourceRow[OrderData.QUANTITY_FIELD]);
//maximum allowed for any specific item is 50
//每种书最多允许订50本
if (count < 50)
{
//bump the quantity by one
//订购书本的数量加一,更新orderdata对象(数量,总价)
count += 1;
sourceRow[OrderData.QUANTITY_FIELD] = count;
sourceRow[OrderData.EXTENDED_FIELD] =
(Decimal)sourceRow[OrderData.PRICE_FIELD] * count;
}
}
//先前没有订该书
else
{
//It's a new item
//在orderdata里面新增一条记录
DataRow itemRow = itemTable.NewRow();
itemRow[OrderData.ITEM_NUMBER_FIELD] = itemId;
itemRow[OrderData.QUANTITY_FIELD] = 1;
itemRow[OrderData.DESCRIPTION_FIELD] = itemDescription;
itemRow[OrderData.PRICE_FIELD] = itemPrice;
itemRow[OrderData.EXTENDED_FIELD] = itemPrice;
//Add it to the table
itemTable.Rows.Add(itemRow);
}
}
3.其它
1)对象的序列化
在cart类中,我们可以看到该类实现了Iserializable接口,首先我们了解一下什么是序列化,我以前也没有接触过,所以上网查了一下,在微软的网站中找到了这篇文章---.NET 中的对象序列化。为什么要使用序列化?最重要的两个原因是:将对象的状态保存在存储媒体中以便可以在以后重新创建出完全相同的副本;按值将对象从一个应用程序域发送至另一个应用程序域。例如,序列化可用于在 ASP.NET 中保存会话状态,以及将对象复制到 Windows 窗体的剪贴板中。它还可用于按值将对象从一个应用程序域远程传递至另一个应用程序域。
序列化是指将对象实例的状态存储到存储媒体(例如说硬盘)的过程。在此过程中,先将对象的公共字段和私有字段以及类的名称(包括类所在的程序集)转换为字节流,然后再把字节流写入数据流。在随后对对象进行反序列化时,将创建出与原对象完全相同的副本。
要实现 ISerializable,需要实现 GetObjectData 方法以及一个特殊的构造函数,在反序列化对象时要用到此构造函数。我们看看在眼里cart类的持殊的构造函数:
private Cart(SerializationInfo info,StreamingContext context)
{
try
{
cartOrderData = (Common.Data.OrderData)
info.GetValue(KEY_ORDERDATA, typeof(Common.Data.OrderData));
}
catch
{
// Leave cartOrderData null if it hasn't been serialized
}
}
这个构造函数在反序列化的时候被调用,用于从磁盘中获得OrderData对象。
再看看GetObjectData 方法的代码:
void ISerializable.GetObjectData
(SerializationInfo info, StreamingContext context)
{
if (cartOrderData != null)
{
info.AddValue(KEY_ORDERDATA, cartOrderData);
}
}
该方法把cartOrderData对象序列化,也就相同于把它存到磁盘了。在反序列化,也就是调用上面的那个构造函数,再把它从磁盘中取出来。