讲解对Entity Framework数据转换层通用类知识

在实现基础的三层开发的时候,大家时常会在数据层对每个实体进行CRUD的操作,其中存在相当多的重复代码。为了减少重复代码的出现,健康知识平台重庆妇科医院哪家好,通常都会定义一个共用类,实现相似的操作,下面为大家介绍一下Entity Framework时常用到的通用类。         首先在数据库建立起几个关联表:Person、Company、Position,三个实体之间通过导航属性进行相互引用。

    下面为大家分别介绍以泛型实现的 Create、Read、Update、Delete 操作:     1. Create     在ObjectContext类之中,早已经为大家预定了一个Create 的操作 AddObject:     void ObjectContext.AddObject(entitySetName string,object entity)     void ObjectSet<T>.AddObject(T entity)     1         public int Add<T>(T entity) where T : EntityObject     2         {     3             int changedCount = 0;     4             using (TransactionScope scope = new TransactionScope(TransactionScopeOption.Required))     5             {     6                 try     7                 {     8                     using (BasicArchitectureEntities context = new BasicArchitectureEntities())     9                     {     10                         context.AddObject(typeof(T)。Name, entity);     11                         changedCount = context.SaveChanges();     12                         if (changedCount > 0)     13                             context.AcceptAllChanges();     14                         scope.Complete();     15                     }     16                 }     17                 catch (Exception ex)     18                 { …… }     19             }     20             return changedCount;     21         }     从下面的测试可以看到,ObjectContext.AddObject(entitySetName string,object entity)已相当成熟,它不但可以加入单个实体,也可通过导航属性,一次性加入多个关联实体。     1         static void Main(string[] args)     2         {     3             BaseCommand command = new BaseCommand();     4             //建立关联实体     5             Company company = new Company() { CompanyName = "Sun" ,Address="Beijing",Telephone="010-87654321"};     6             Position position = new Position() { PositionName = "Project Manager", Salary = 15000.00, Company = company };     7             //通过Add<T>同时加入实体对象company与position     8             int n=command.Add<Position>(position);     9     10             Console.ReadKey();     11         } 若要使用批量插入,只要在AddObject方法前多加一个重复语言即可,在此就不再多作解释了。     1         public int AddList<T>(List<T> entityList) where T : EntityObject     2         {     3             int changedCount = 0;     4             using (TransactionScope scope = new TransactionScope(TransactionScopeOption.Required))     5             {     6                 try     7                 {     8                     using (BasicArchitectureEntities context = new BasicArchitectureEntities())     9                     {     10                         foreach (T entity in entityList)     11                             context.AddObject(typeof(T)。Name, entity);     12                         changedCount = context.SaveChanges();     13                         if (changedCount > 0)     14                             context.AcceptAllChanges();     15                         scope.Complete();     16                     }     17                 }     18                 catch (Exception ex)     19                 { …… }     20             }     21             return changedCount;     22         }     2. Delete     同样地,ObjectContext 类当中也存在方法 ObjectContext.DeleteObject(object entity)用于删除实体。     首先通过输入的参数 id 建立起EntityKey对象,然后在ObjectContext查找此实体,若实体存在则使用ObjectContext.DeleteObject(object entity)方法把此实体删除 .     1         public int Delete<T>(int id) where T : EntityObject     2         {     3             int changedCount = 0;     4             using (TransactionScope scope = new TransactionScope(TransactionScopeOption.Required))     5             {     6                 try     7                 {     8                     using (BasicArchitectureEntities context = new BasicArchitectureEntities())     9                     {     10                         //建立EntityKey对象     11                         EntityKey entityKey = new EntityKey("BasicArchitectureEntities." + typeof(T)。Name, "Id", id);     12                         //通过EntityKey找到实体     13                         var objResult = context.GetObjectByKey(entityKey);     14                         //若实体存在则删除实体     15                         if (objResult != null)     16                             context.DeleteObject(objResult);     17                         changedCount = context.SaveChanges();     18                         if (changedCount > 0)     19                             context.AcceptAllChanges();     20     21                         scope.Complete();     22                     }     23                 }     24                 catch (Exception ex)     25                 { …… }     26             }     27             return changedCount;     28         }     ObjectContext.DeleteObject(object entity)与ObjectContext.AddObject(entitySetName string,object entity)相同,可以通过导航属性,一次性删除多个关联实体。但如果数据库中存在下面的数据     Company表:     Position表:     此时使用此 int Delete<Company>(2) 方法删除Company对象,系统将会报错。这是由于导航属性在默认情况下具有延时加载的特性,在系统使用ObjectContext.GetObjectByKey(entityKey)方法加载实体时,它的导航属性不会马上加载到上下文当中。而是在调用该导航属性时,对象才会被加载。     因而系统通过ObjectContext.GetObjectByKey(2)获取Company对象时,对应的Position对象并未被加载到上下文当中,所以当删除Company对象时,Position对象不能被同步删除,因而造成逻辑上的错误。为解决这一问题,可以利用RelatedEnd.Load()方法提前加载导航属性。     RelatedEnd是EntityCollection<TEntity> 、EntityReference的父类,它们是特定实体类型的对象集合,该实体类型表示一对多、多对一、多对多的关系。而RelatedEnd.Load()方法,可以将一个或多个相关对象提前加载到相关实体当中。     首先通过ObjectContext.GetObjectByKey(entityKey)方法找到Company对象,然后利用反射属性PropertyInfo类获取导航属性Position,最后使用RelatedEnd.Load()方法,把导航属性加载到当前上下文中。此时使用Delete<Company,Position>(2)方法删除Company对象时,系统将能正常运行,并把对应的Position对象一并删除。     1         public int Delete<PKEntity, FKEntity>(int id)     2             where PKEntity : EntityObject     3             where FKEntity : EntityObject     4         {     5             int changedCount = 0;     6             using (TransactionScope scope = new TransactionScope(TransactionScopeOption.Required))     7             {     8                 try     9                 {     10                     using (BasicArchitectureEntities context = new BasicArchitectureEntities())     11                     {     12                         //根据软件Id建立EntityKey对象     13                         EntityKey entityKey = new EntityKey("BasicArchitectureEntities." + typeof(PKEntity)。Name, "Id", id);     14                         //根据EntityKey查找对应对象     15                         PKEntity objResult = context.GetObjectByKey(entityKey) as PKEntity;     16                         //根据FKEntity加载导航属性     17                         PropertyInfo propertyInfo = typeof(PKEntity)。GetProperty(typeof(FKEntity)。Name);     18                         EntityCollection<FKEntity> FKEntityList = propertyInfo.GetValue(objResult, null)     19                             as EntityCollection<FKEntity>;     20     21                         if (FKEntityList != null)     22                             FKEntityList.Load();     23     24                         if (objResult != null)     25                             context.DeleteObject(objResult);     26                         changedCount = context.SaveChanges();     27     28                         if (changedCount > 0)     29                             context.AcceptAllChanges();     30     31                         scope.Complete();     32                     }     33                 }     34                 catch (Exception ex)     35                 { …… }     36             }     37             return changedCount;     38         } 通过下面的方法也可根据输入的委托predicate,批量删除有关的数据。     1         public int Delete<T>(Func<T,bool> predicate) where T: EntityObject     2         {     3             int changedCount = 0;     4             using (TransactionScope scope = new TransactionScope(TransactionScopeOption.Required))     5             {     6                 try     7                 {     8                     using (BasicArchitectureEntities context = new BasicArchitectureEntities())     9              更多http://lailjiaaie.blog.51cto.com       {     10                         //根据输入的委托查找数据     11                         var list = context.CreateObjectSet<T>()。Where(predicate);     12                         //若存在数据,删除有关数据     13                         if (list.Count() > 0)     14                             foreach (var obj in list)     15                                 context.DeleteObject(obj);     16     17                         changedCount = context.SaveChanges();     18                         if (changedCount > 0)     19                             context.AcceptAllChanges();     20     21                         scope.Complete();     22                     }     23                 }     24                 catch (Exception ex)     25                 { …… }     26             }     27             return changedCount;     28         }     与前面的例子相同,当使用 Delete<Company>(x=>x.Id==2) 方法删除 Company 对象时,由于导航属性 Position 处于延迟加载的状态,以致系统无法实现同步删除,从而令数据出现逻辑性的错误。     此时使用类似的方法,利用 RelatedEnd.Load() 把导航属性提前加入到上下文中,再删除Company对象时,系统就可以把对应 Position 对象一并删除。     1         public int Delete<PKEntity, FKEntity>(Func<PKEntity,bool> predicate)     2             where PKEntity : EntityObject     3             where FKEntity : EntityObject     4         {     5             int changedCount = 0;     6             using (TransactionScope scope = new TransactionScope(TransactionScopeOption.Required))     7             {     8                 try     9                 {     10                     using (BasicArchitectureEntities context = new BasicArchitectureEntities())     11                     {     12                         //根据输入的委托查找数据     13                         var list = context.CreateObjectSet<PKEntity>()。Where(predicate);     14                         //若数目大于0,删除有关数据     15                         if (list.Count() > 0)     16                         {     17                             foreach (var obj in list)     18                             {     19                                 //在删除前加载其导航属性     20                                 PropertyInfo propertyInfo = typeof(PKEntity)。GetProperty(typeof(FKEntity)。Name);     21                                 EntityCollection<FKEntity> FKEntityList = propertyInfo.GetValue(obj, null)     22                                     as EntityCollection<FKEntity>;     23                                 if (FKEntityList.Count > 0)     24                                     FKEntityList.Load();     25     26                                 context.DeleteObject(obj);     27                             }     28                         }     29     30                         changedCount = context.SaveChanges();     31     32                         if (changedCount > 0)     33                             context.AcceptAllChanges();     34     35                         scope.Complete();     36                     }     37                 }     38                 catch (Exception ex)     39                 { …… }     40             }     41             return changedCount;     42         }     此时使用Delete<Company,Position>(x=>x.Id==2),这样就可以把Company对象和相关的Position对象同时删除。     3. Update     ObjectContext 中存在方法 ObjectContext.ApplyCurrentValues<TEntity> 和 ObjectContext.ApplyOriginalValues<TEntity>,用于把将标量值从实体复制到 ObjectContext 中具有相同主键的对象集中。     注意:在调用此方法前必须把实体预先加载到当前上下文当中,要不然系统将会显示  "objectstatemanager 无法跟踪具有相同键的多个对象" 的错误。     由于DAL层的对象大部分使用单体模式进行开发,而BaseCommand是一个共用对象,在共同操作时,Create、Delete、Read 等操作一般不会对实体造成逻辑性的影响。但如果有多个实体同时调用 Update 操作,就有可能对实体造成逻辑性影响。为了避免这一事件的发生,此处使用方法锁定的模式,以 lock(object) 锁定某一对象,以确保在同一时间内只会对一个实体进行更新。     首先通过反射方式获取对象的Id,然后通过 ObjectContext.GetObjectByKey(entityKey) 方法把实体加载到当前上下文当中,最后利用 ObjectContext.ApplyCurrentValues<TEntity> 方法,把新加入的实体的属性复制当前上下文。     1     public class BaseCommand     2     {     3         private object o = new object();     4     5         public int Update<T>(T entity) where T : EntityObject     6         {     7             lock (o)     8             {     9                 int changedCount = 0;     10                 Type type = typeof(T);     11     12                 using (TransactionScope scope = new TransactionScope(TransactionScopeOption.Required))     13                 {     14                     try     15                     {     16                         using (BasicArchitectureEntities context = new BasicArchitectureEntities())     17                         {     18                             //获取实体的Id属性     19                             PropertyInfo property = type.GetProperty("Id");     20                             object id = property.GetValue(entity, null);     21                             //根据Id获取上下文中的对应实体     22                             EntityKey entityKey = new EntityKey("BasicArchitectureEntities."     23                                   + type.Name, "Id", id);     24                             var objResult = context.GetObjectByKey(entityKey);     25                             //更新实体属性     26                             if (objResult != null)     27                                 context.ApplyCurrentValues<T>(type.Name, entity);     28     29                             changedCount = context.SaveChanges();     30                             if (changedCount > 0)     31                                 context.AcceptAllChanges();     32     33                             scope.Complete();     34                         }     35                     }     36                     catch (Exception ex)     37                     { … }     38                 }     39                 return changedCount;     40             }     41         }     42     }     在一对多,多对一关系时,也可以使用以下方法进行导航属性的同步更新。首先通过反射获取主实体的主键Id,然后建立EntityKey对象,再通过ObjectContext.GetObjectByKey(entityKey)方法在当前上下文当中获取此实体,最后通过 ObjectContext.ApplyCurrentValues<TEntity> 方法,把新加入的实体的属性复制当前上下文。 下一步就是对导航属性进行更新,首先通过反射获取外键属性,然后对一对多,多对一的关系进行分别处理。在一对多关系时,把导航属性转换成EntityCollection<T2>对象集合,然后通过 ObjectContext.ApplyCurrentValues<TEntity> 方法对集合中的每个对象进行逐个更新。     在多对一关系时,直接把导航属性转换成T2类型的对象进行更新。     1         public int Update<T1, T2>(T1 entity)     2             where T1 : EntityObject     3             where T2 : EntityObject     4         {     5             lock (o)     6             {     7                 int changedCount = 0;     8                 Type typeT1 = typeof(T1);     9                 Type typeT2 = typeof(T2);     10     11                 using (TransactionScope scope = new TransactionScope(TransactionScopeOption.Required))     12                 {     13                     try     14                     {     15                         using (BasicArchitectureEntities context = new BasicArchitectureEntities())     16                         {     17                             PropertyInfo property = typeT1.GetProperty("Id");     18                             object id = property.GetValue(entity, null);     19     20                             //根据软件Id建立EntityKey对象 www.2cto.com     21                             EntityKey entityKey = new EntityKey("BasicArchitectureEntities."     22                                  + typeT1.Name, "Id", id);     23                             //根据EntityKey查找对应对象     24                             T1 objT1 = context.GetObjectByKey(entityKey) as T1;     25                             //在上下文中更新当前对象     26                             if (objT1 != null)     27                                 context.ApplyCurrentValues<T1>(typeT1.Name, entity);     28     29                             //获取外键属性     30                             PropertyInfo propertyInfo = typeT1.GetProperty(typeT2.Name);     31     32                             //在一对多关键时更新导航属性     33                             var T2List = propertyInfo.GetValue(entity, null)     34                                    as EntityCollection<T2>;     35                             if (T2List != null)     36                             {     37                                 foreach (var obj in T2List.ToList())     38                                 {     39                                     var oldEntity = context.GetObjectByKey(obj.EntityKey);     40                                     if (oldEntity != null)     41                                         context.ApplyCurrentValues<T2>(typeT2.Name, obj);     42                                 }     43                             }     44     45                             //在多对一,一对一关系时更新导航属性     46                             var objT2 = propertyInfo.GetValue(entity, null) as T2;     47                             if (objT2!= null)     48                             {     49                                 var oldEntity = context.GetObjectByKey(objT2.EntityKey);     50                                 if (oldEntity != null)     51                                     context.ApplyCurrentValues<T2>(typeT2.Name, objT2);     52                             }     53     54                             changedCount = context.SaveChanges();     55                             if (changedCount > 0)     56                                 context.AcceptAllChanges();     57     58                             scope.Complete();     59                         }     60                     }     61                     catch (Exception ex)     62                     { …… }     63                 }     64                 return changedCount;     65             }     66         }     通过此方法,无论你要通过Company同步更新Position,还是反过来通过Position同步更新Company,系统也能正常运行。     4. Read     Read 是CRUD中最常见的,下面就为大家介绍最通用的几种方法     4.1 通过Id获取单个实体     1         public T GetObject<T>(int id) where T : EntityObject     2         {     3             try     4             {     5                 using (BasicArchitectureEntities context = new BasicArchitectureEntities())     6                 {     7                     EntityKey entityKey = new EntityKey("BasicArchitectureEntities."     8                           + typeof(T)。Name, "Id", id);     9                     var objResult = context.GetObjectByKey(entityKey);     10                     return objResult as T;     11                 }     12             }     13             catch (Exception ex)     14             {     15                 return null;     16             }     17         }     4.2 通过输入的Func<T,bool>委托获取对象     1         public T GetObject<T>(Func<T,bool> predicate) where T : EntityObject     2         {     3             try     4             {     5                 using (BasicArchitectureEntities context = new BasicArchitectureEntities())     6                 {     7                     var objectSet = context.CreateObjectSet<T>()。Where(predicate);     8                     if (objectSet.Count() > 0)     9                         return objectSet.First();     10                     else     11                         return null;     12                 }     13             }     14             catch (Exception ex)     15             {     16                 return null;     17             }     18         }     4.3通过输入的Func<T,bool>委托获取对象,并同时加载单个导航属性     1         public T GetObject<T>(Func<T, bool> predicate,string includePath)     2             where T : EntityObject     3         {     4             try     5             {     6                 using (BasicArchitectureEntities context = new BasicArchitectureEntities())     7                 {     8                     var objectQuery = context.CreateObjectSet<T>()     9                         .Include(includePath)     10                         .Where(predicate);     11     12                     if (objectQuery.Count() > 0)     13                         return objectQuery.First();     14                     else     15                         return null;     16                 }     17             }     18             catch (Exception ex)     19             {     20                 return null;     21             }     22         }     4.4通过输入的Func<T,bool>委托获取对象,并同时加载多个导航属性     1         public T GetObject<T>(Func<T, bool> predicate, string[] includePath)     2              where T : EntityObject     3         {     4             try     5             {     6                 using (BasicArchitectureEntities context = new BasicArchitectureEntities())     7                 {     8                     var list = context.CreateObjectSet<T>()。Where("1==1");     9     10                     foreach (var path in includePath)     11                         list=list.Include(path);     12     13                     var returnValue = list.Where(predicate)。ToList();     14     15                     if (returnValue.Count() > 0)     16                         return returnValue.First();     17                     else     18                         return null;     19                 }     20             }     21             catch (Exception ex)     22             {     23                 return null;     24             }     25         } 4.5 通过输入的Func<T,bool>委托获取对象集合     1         public IList<T> GetList<T>(Func<T,bool> func) where T:EntityObject     2         {     3             try     4             {     5                 using (BasicArchitectureEntities context = new BasicArchitectureEntities())     6                 {     7                     ObjectSet<T> objectSet = context.CreateObjectSet<T>();     8                     IList<T> list = objectSet.Where(func)。ToList();     9                     return list;     10                 }     11             }     12             catch (Exception ex)     13             {     14                 return null;     15             }     16         }     4.6通过输入的Func<T,bool>委托获取对象集合,并同时加入单个导航属性     1         public IList<T> GetList<T>(Func<T, bool> func,string includePath)     2              where T : EntityObject     3         {     4             try     5             {     6                 using (BasicArchitectureEntities context = new BasicArchitectureEntities())     7                 {     8                     ObjectSet<T> objectSet = context.CreateObjectSet<T>();     9                     IList<T> list = objectSet.Include(includePath)。Where(func)。ToList();     10                     return list;     11                 }     12             }     13             catch (Exception ex)     14             {     15                 return null;     16             }     17         }     4.7通过输入的Func<T,bool>委托获取对象集合,并同时加入多个导航属性     1         public IList<T> GetList<T>(Func<T, bool> func, string[] includePath)     2             where T : EntityObject     3         {     4             try     5             {     6                 using (BasicArchitectureEntities context = new BasicArchitectureEntities())     7                 {     8                     var list = context.CreateObjectSet<T>()。Where("1==1");     9                     foreach (var path in includePath)     10                         list = list.Include(path);     11                     return list.Where(func)。ToList();     12                 }     13             }     14             catch (Exception ex)     15             {     16                 return null;     17             }     18         }     4.8 通过原始的SqlCommandText获取对象集     1         public IList<T> GetList<T>(string commandText)     2         {     3             try     4             {     5                 using (BasicArchitectureEntities context = new BasicArchitectureEntities())     6                 {     7                     IList<T> list = context.ExecuteStoreQuery<T>(commandText)。ToList();     8                     return list;     9                 }     10             }     11             catch (Exception ex)     12             {     13                 return null;     14             }     15         }     只能完成这一个DAL层的通用类以后,您就可在CompanyDAL、PersonDAL、PositionDAL …… 等多个类中调用这个通用类,轻松地完成各项CRUD的操作。     1     public class CompanyDAL:ICompanyDAL     2     {     3         private BaseCommand command = new BaseCommand();     4     5         public int AddCompany(Company company)     6         {     7             return command.Add<Company>(company);     8         }     9     10         public int DeleteCompany(int id)     11         {     12             return command.Delete<Company>(id);     13         }     14     15         public int UpdateComapny(Company company)     16         {     17             return command.Update<Company>(company);     18         }     19         ……     20     }     相比起以往的SqlCommand操作,Entity Framework更体现出映射的灵活性。以往的操作中,即使开发出一个通用类,CommandText 通常都需要使用手工输入,特别是重复的Update命令操作中,往往令人不厌其烦。通过Entity Framework可以把CRUD更高度地集中在一个通用类,令开发变得更加简单。     希望本篇文章对您的系统开发有所帮助。

------7 ASP.Net之Datalist详解 aspx界面         <html xmlns="http://www.w3.org/1999/xhtml">         <head runat="server">         <title>DataList控件删除操作(支持批量删除)</title>         <script type="text/javascript">         function CheckAll(Obj) {         var AllObj = document.all;         if (Obj.checked)//全选         {         for (var i = 0; i < AllObj.length; i++) {         if (AllObj[i].type == "checkbox") {         AllObj[i].checked = true;         }         }         }   else//反选         {         for (var i = 0; i < AllObj.length; i++) {         if (AllObj[i].type == "checkbox") {         AllObj[i].checked = false;         }         }         }         }         </script>         </head>         <body>         <form id="form1" runat="server">         <div>         <fieldset style="text-align: center; width: 540px;">         <legend style=" text-align:center; ">使用Datalist删除数据(支持批量删除)</legend>         <asp:DataList ID="DataList1" runat="server"         onitemcommand="DataList1_ItemCommand" DataKeyField="id">         <HeaderTemplate>         <div style="text-align:center">         <table border = "1" cellpadding="0" cellspacing="0"  style=" font-size:12; width:500px"  >         <tr>         <td style="width:100px">全选/反选<input id="Checkbox1" type="checkbox" name="全选" value="全选" onclick="return CheckAll(this)" title="全选" /></td>         <td style="width:100px">用户编号</td>         <td style="width:100px">用户昵称</td>         <td style="width:100px">个性签名</td>         <td style="width:100px">删除</td>         </tr>         </table>         </div>         </HeaderTemplate>         <ItemTemplate>         <div style="text-align:center">         <table border = "1" cellpadding="0" cellspacing="0"  style=" font-size:12; width:500px"  >         <tr>         <td style="width:100px"> <asp:CheckBox ID="CheckBox2" runat="server" /></td>         <td style="width:100px"><asp:Label ID="Label1" runat="server" Text='<%# Eval("id") %>'></asp:Label></td>         <td style="width:100px"><asp:Label ID="Label2" runat="server" Text='<%# Eval("bg_name") %>'></asp:Label></td>         <td style="width:100px"><asp:Label ID="Label3" runat="server" Text='<%# Eval("bg_p_autograph") %>'></asp:Label></td>         <td style="width:100px"><asp:Button ID="btnDelete" runat="server" Text="删除"  CommandName="delete"         BorderStyle="None" onclientclick="return confirm(&quot;确认删除?&quot;);" /></td><%--请注意此处的CommandName命令--%>         </tr>         </table>         </div>         </ItemTemplate>         <FooterTemplate>         <div style="text-align:center">         <table border="1" cellpadding="0" cellspacing="0" style="font-size:12px; width:100%">         <tr>         <td style="width:100%; text-align:center">         <asp:Button ID="btnPLDelete" runat="server" Text="批量删除"  CommandName="pldelete" BorderStyle="None" onclientclick="return confirm(&quot;确认删除?&quot;);"  /></td>         </tr>         </table>         </div>         </FooterTemplate>         </asp:DataList>         </fieldset>         </div>         </form>         </body>         </html>         .cs界面         using System;         using System.Collections.Generic;         using System.Linq;         using System.Web;         using System.Web.UI;         using System.Web.UI.WebControls;         using System.Data;         using System.Data.SqlClient;         using System.Configuration;         public partial class _Default : System.Web.UI.Page         {         ////得到Web.config 中的连接放在变量中         SqlConnection con = new SqlConnection(ConfigurationManager.ConnectionStrings["connStr"].ConnectionString);         protected void Page_Load(object sender, EventArgs e)         {         if (!IsPostBack)         {         //调用自定义方法绑定数据到控件(为以后做MVC打下基础)         BindDataList();         }         }         //对datelist进行数据绑定         private void BindDataList()         {         //定义查询语句,这里最好将SQL语句在SQL中写好并验证正确确在复制粘贴过来(在对数据查询时最好只查所需的一些不需要的数据就不要取出,这样可以提高运行的效率)         string strSql = "SELECT * FROM bg_spatial";//定义一条SQL语句         SqlDataAdapter sda = new SqlDataAdapter(strSql, con);         DataSet ds = new DataSet();         sda.Fill(ds);//把执行得到的数据放在数据集中         DataList1.DataSource = ds;         DataList1.DataBind();         }         protected void DataList1_ItemCommand(object source, DataListCommandEventArgs e)         {         switch (e.CommandName)     {         //单条数据删除操作         case "delete":         //取得当前Datalist控件列         int id = int.Parse(DataList1.DataKeys[e.Item.ItemIndex].ToString());         string strSQL = "delete from bg_spatial where id='" + id + "'";         if (con.State.Equals(ConnectionState.Closed))         {         con.Open();//打开数据库         }         SqlCommand cmd = new SqlCommand(strSQL, con);         if (Convert.ToInt32(cmd.ExecuteNonQuery())>0)         {         Response.Write("<script>alert('删除成功!')</script>");         BindDataList();         }         else         {         Response.Write("<script>alert('删除失败!请查找原因')</script>");         }         con.Close();//关闭连接         break;         //批量数据删除操作         case "pldelete":         if (con.State.Equals(ConnectionState.Closed))         {         con.Open();//打开数据库         }         DataListItemCollection dlic = DataList1.Items;//创建一个DataList列表项集合对象         //执行一个循环删除所选中的信息         for (int i = 0; i < dlic.Count; i++)         {         if (dlic[i].ItemType == ListItemType.AlternatingItem||dlic[i].ItemType == ListItemType.Item)         {         CheckBox cbox = (CheckBox)dlic[i].FindControl("CheckBox2");         if (cbox.Checked)         {         int p_id = int.Parse(DataList1.DataKeys[dlic[i].ItemIndex].ToString());         SqlCommand p_cmd = new SqlCommand("delete from bg_spatial where id=" + p_id , con);         p_cmd.ExecuteNonQuery();         }         }         }         con.Close();         BindDataList();         break;         }         }         }    

-------8 VB.NET标记语句具体使用方式解析 VB.NET编程语言中有一种比较常用的方法就是标记语句。那么我们应该如何正确看待这一应用,如何适当的在程序中使用它来帮助我们完成程序的开发呢?这些问题将会在本文中一一给出,帮助大家解决VB.NET标记语句使用中出现的一些问题。         语句块由冒号分隔的代码行组成。标识字符串或整数后的代码行称为"已标记".语句标签用来标记要标识的代码行,便于与 On Error Goto 之类的语句一起使用。         标签既可以是有效的 Visual Basic 2005 标识符(如标识编程元素的标识符),也可以是整数。标签必须出现在源代码行的行首,之后必须有冒号,无论在同一行内它后面有无语句。         编译器通过检查行首是否与任何已定义的标识符匹配来标识标签。如果不匹配,编译器假定它是一个标签。         标签具有自己的声明空间,并不影响其他标识符。标签的范围是方法的主体。标签声明在任何模糊环境中都有优先权。         注意         标签只能用于方法内的可执行语句中。         VB.NET标记语句标记代码行         将标识符放在源代码行的行首,后面加上冒号。         例如,下列代码行分别标记为 Jump 和 120:         Visual Basic  Jump: FileOpen(1, "testFile", OpenMode.Input)  ' …  120: FileClose(1)         VB.NET标记语句的具体应用方式就为大家介绍到这里。

posted on 2012-07-21 08:44  时代先进程序  阅读(148)  评论(0)    收藏  举报