在ASP.NET中使用ObjectDataSource数据控件和GridView操作数据

通过前两次的内容我们已经实现了带有分页和排序的显示数据,那么我们如何用ObjectDataSource来帮助我们实现删改

还是老办法我们先实现DAL层和BLL层当中的操作数据的方法

        [DataObjectMethod(DataObjectMethodType.Insert)]

        public static void InserUserInfo(UserInfo info)

        {

            DAL.UserInfoDAL.InsertUserInfo(info);

        }



        [DataObjectMethod(DataObjectMethodType.Update)]

        public static void UpdateUserInfo(UserInfo info)

        {

            DAL.UserInfoDAL.UpdateUserInfo(info);

        }



        [DataObjectMethod(DataObjectMethodType.Delete)]

        public static void DeleteUserInfo(UserInfo info)

        {

            DAL.UserInfoDAL.DeleteUserInfo(info);

        }

 

这里我们可以发现我这里传递的都是UserInfo对象了.至于好处嘛,我认为你在赋值的时候通过属性对其处理安全性更好一些.反正我总觉得比传一大堆的变量过来要好.所以这里采用这个方式.

如果你要采用我这种方式那么就需要注意你的ObjectDataSource中的一个属性是否正确设置了

image

这里我设置为我查询出的对象UserInfo

image

这样你就可以来实现删除和修改了.有些人就问呀!我没有像以前那样设置传递的参数啊.^_^

这里当你设置了ObjectDataSource的DataObjectTypeName,当你执行相关操作的时候ObjectDataSource就会自动生成一个你设置的对象并且将行内的值一一对应的传入到你的这个对象.然后直接将这个对象传入到你的BLL中的方法.但是要注意,这里还是有很多陷阱的

第一个陷阱 由数据冲突引起的问题image
在ObjectDataSource中有个属性↑

这里属性来设置如何处理是否新旧值一起处理

MSDN上的描述为:获取或设置一个值,该值确定是仅将新值传递给 Update 方法,还是将旧值和新值都传递给 Update 方法。

当这里使用默认的OverwriteChanges的时候传递的值内容为你更改后值.这里传递是我们修改后的对象值.所以默认状态下你的更新是没有问题的.

但如果你要处理新旧值的时候就需要设置到CompareAllValues.但是这时你再更新数据的时候就会报错了.

为什么会这样呢?原来当你设置为CompareAllValues的时候他需要给你BLL层传递过两个对象,一个是原来的UserInfo一个是你修改后的Userinfo.

所以你的方法需要改成这样

        [DataObjectMethod(DataObjectMethodType.Update)]

        public static void UpdateUserInfo(UserInfo info,UserInfo original_info)

        {

            ......

        }
这里发现我们的更新方法多了后面的一个参数叫original_info,这样才能将我们的修改后的内容正确更新回数据库,而且这里的original_这个前缀可以通过修改 image

来实现.

陷阱二,键字段的问题.

那当我们ConflicDetection使用默认的OverwriteChanges值的时候我们进行删除操作.发现没有删除了我们想要操作的那条记录.然后通过监视可以发现传递到BLL中的UserInfo对象虽不为空.但是里面属性的值都为默认值

image

那为什么会出现这个问题呢?我认为是,删除操作并没有修改我GridView中的记录所以在ConflicDetection使用默认的OverwriteChanges值的时候传递过的对象里要是有值只能是修改后的值.所以这里你要通过id来删除则只能删除记录为0的了.^_^

所以通常来说删除不了你想要的内容,但是不出错.

那怎么办呢?这里因为我们使用的是集合所以在编写GridView的时候少设置了一个属性,那就是image

这里我们添加上键字段id.再来看看效果

image

这次发现,虽然这里没有吧UserInfo对象完整的传递过来.但是我们想要的id值过来了.^_^

你可能感兴趣的:(dataSource)