实现MapQuest 功能中的ADO.NET应用

实现MapQuest 功能中的ADO.NET应用_第1张图片

 
最近做一个关于MapQuest的功能模块,首先介绍一下MapQuest,它是一家资深的帮助客户在地图上定位的公司,比如说根据业务需求,在地图上显示我要关注的地点;我的合作伙伴和员工的地点;在指定地区显示所有的超市,银行等等。

 我的这个模块需求是,在地图上显示离指定的一个Job地点最近的五个承包商或者技术员工的地点,并用不同的图标显示出来。我想要总结的有几点。

1.  存储员工或者承包商的坐标字段(Longitude, Latitude)有可能为null,所以在通过MapQuest用WebService获取经纬度值后需要存储到数据库,方便以后直接从数据库中读出,而不是调用WebService向MapQuest请求坐标信息。当从数据库Fill进一个DataTable, 名为dtTechnicians, 再将此DataTable引用传入一个GeoCode函数,此函数检查DataTable, 如果DataRow里的Longitude和Latitude 为null,就调用WebService索取坐标值赋值给两个字段。怎么将开始坐标为空的记录保存回数据库呢?如果一次全部将DataTable里的记录update一下显然不是最好的方法,因为有的记录已经有了坐标值。经过思考,发现DataRow有个RowState属性,当用适配器Fill进DataTable时,每个DataRow的RowState为DataRowState.Unchanged,经过GeoCode函数所更改过的DataRow,其RowState为DataRowState.Modified,所以可以遍历DataTable,检查DataRow的RowState,如果是DataRowState.Modified就可以保存到数据库了。

2.  当做好显示指定位置所要的准备工作后, 即拥有一个DataTable,客户还要求只显示 150英里 以内的位置。我在DataTable里定义了一个Distance字段存储到指定Job的距离, 因此可以用到DataView,因为DataView和DataTable就像数据库里的视图和物理表的关系.

可以这么做:

Dim dv as DataView = dtMap.DefaultView
dv.RowFilter = "Distance < 150"
dv.Sort = "Distance asc"

最后将这个DataView赋值给MapQuest。

总结:

1. DataRow里的RowState很重要, 它是DataAdapter做Update的关键所在。

如果RowState为DataRowState.Added, DataAdapter就用你的更新逻辑向数据库插入记录;
如果RowSate为DataRowState.Deleted,DataAdapter就用你的更新逻辑向数据库删除记录;
如果RowSate为DataRowState.Modified,DataAdapter就用你的更新逻辑向数据库更改记录;

2. DataView经常和DataTable结合使用。

你可能感兴趣的:(.net)