zoukankan      html  css  js  c++  java
  • O/R Mapping 工具介绍 LLBLgen控件(转)

    LLBLgen控件 ,可以使用Google搜索到他的官方网站,下载最新试用版,另完全破解国内版本还没有出现.最新的是2.6版,内容不断更新中.

    声明:部分资源来源于网络,具体地址实在想不起来,英文代码基本上是从google搜索的,国内很少有这个工具的帮助,如果真的是抄袭勿怪! 同时,欢迎转载!

    软件使用:

    root namespace 是指定的编译成project的命名空间名称

    template group 是指编译模式,一般如果不需要自定义配置的话 可以选择 selfservicing模式。

    如果选择adapter 则会从编译所在目录的app。config 文件中 获取相应配置再生成project,具体配置选项请参考llblgen自带帮助文件。

    store procedure 存储过程,function 的使用

    在左边菜单store procedure  call中,右键retrieval 。。。出现 add ... 即表示添加db中的存储过程到工程中,并且会自动生成同名方法,以后只需要修改db中的 store procedure 不需要再次编译 即可达到改变的目的。

    function 则右键 action stored... 出现add 。。。  步骤类似 store procedure。同时支持out 参数。

    最牛逼的地方:

    个人认为llbl 作为数据库中间件最牛比的地方 就能是把数据库中的外键都有效整合起来,并且能够在程序中自由调用。

    如上图,作为role 角色 ,分别与 role function功能与角色关系表, user role 用户与角色关系表进行关联,在对role 进行实例化时,如   RoleEntity  objRole=new  RoleEntity(); 则可以由objRole  直接带出 ROLEFUNCTION中的对应function 。如 objRole.RoleFunction.属性。

    同时作为复杂查询时,可以通过相关联表的条件 查询出符合的记录,当然 更新和删除也能使用此功能。

    注意: 如果关联到同一个表多次的话,需要修改field maped(图中未给出)名称,以达到区分的目的。

    以下是引用其基本用法

    1.Entity用法   自动生成的实体类

    InspectorToJobEntity objEntity = new InspectorToJobEntity(keyID);

     if(objEntity.IsNew)  //判断为新增

      { 

    objEntity.EmployeeName="jimmy"; objEntity.Save();

      } 

    else  //更新

    {

      objEntity.EmployeeName="jimmy"; objEntity.Save(); 

    }

    2. Collection用法  实体类的集合,


                    InspectorToJobCollection collection = new InspectorToJobCollection();

                    collection.GetMulti(InspectorToJobFields.JobId == CurrentJobID);

                  1)返回 collection 是一个  InspectorToJobEntity的 collection 数据源集合,可以直接bind 到grid datalist等 

    2) 提供批量修改功能。 collection.UpdateMulti(new InspectorToJobEntity(),InspectorToJobFields.EmployeeName="jimmy") (将所有名称EmployeeName 是 jimmy的人都更新为new InspectorToJobEntity(。。。。) 中的具体信息 )

    3)批量删 除:  collection.DeleteMulti(InspectorToJobFields.EmployeeName=="jimmy",InspectorToJobEntity.Relations.JobEntityUsingJobId) (将EmployeeName名称为jimmy,并且符合条件JobEntityUsingJobId的记录删除,不会删除其他表,只删除本身表,删除条 件也可以增加其他相关联的数据表的条件 )

     3. 查询到表DataSet

     可参考 下面第31点,查询指定字段到DataSet中,

    或者如下:

               var collection = new IMS.Data.CollectionClasses.FunctionCollection();
                collection.GetMulti(null);
                DataSet ds = new DataSet();
                collection.CreateHierarchicalProjection(ds);

    基础语法使用:

    1、CustomerEntity customer = new CustomerEntity();定义一个空新实体

    CustomerEntity customer = new CustomerEntity("SOLDES");定义一个主键值为"SOLDES"的新实体

    2、DataAccessAdapter adapter = new DataAccessAdapter();CustomerEntity customer = new CustomerEntity("CHOPS");

    adapter.FetchEntity(customer);

    直接从数据库中取一条主键为"CHOPS"的记录。它不会存在cache中。

    相当于SQL: select * from customers where customerID='CHOPS'

    根据主键来返回一条记录

    3、DataAccessAdapter adapter = new DataAccessAdapter(tr);OrderEntity order = new OrderEntity(10254);

    adapter.FetchEntity(order);

    order.Customer = (CustomerEntity)adapter.FetchNewEntity(new CustomerEntityFactory(),order.GetRelationInfoCustomer());

    adapter.CloseConnection();

    相当于SQL: Select * from customers where CustomerID= (select CustomerID from orders where OrderID=10254)

    在这里,order为customer的子表,先从order表中取一条OrderID=10254的记录,然后再取与这一条记录相关联的Customer的记录。

    4、DataAccessAdapter adapter = new DataAccessAdapter();CustomerEntity customer = new CustomerEntity();customer.CompanyName = "Chop-sy Chinese";adapter.FetchEntityUsingUniqConstraint(customer, customer.Constr tFilterFor CompanyName());相当于SQL: select * from customerS where CompanyName ='Chop-sy Chinese'但是这里CompanyName必须也是唯一的5、CustomerEntity customer = new CustomerEntity("CHOPS");DataAccessAdapter adapter = new DataAccessAdapter(tr);adapter.FetchEntity(customer);customer.Phone = "(605)555-4321";adapter.SaveEntity(customer);adapter.CloseConnection();相 当于SQL: update customerS set phone='(605)555-4321'

    where customerID='Chop-sy Chinese'      更新一条记录的一个字段6、RelationPredicateB ket b ket = new RelationPredicateB ket();b ket.PredicateExpression.Add(Prod tFields.CategoryId == 3);Prod tEntity updateValsProd t = new Prod tEntity();updateValsProd t.Discontind=tr;DataAccessAdapter adapter = new DataAccessAdapter();int amountUpdated = adapter.UpdateEntitiesDirectly(updateValsProd t, b ket);      相当于SQL: update prod ts set Discontind=1 where CategoryId = 3  更新CategoryId = 3的所有记录7、PrefetchPath2 path = new PrefetchPath2((int)EntityType.OrderEntity);path.Add(OrderEntity.PrefetchPathCustomer);

    OrderEntity myOrder = new OrderEntity(10254);

    adapter.FetchEntity(myOrder, path);           

    myOrder.Customer = null;

    adapter.save(myOrder);

    相当于SQL: Update Orders  set CustomerID=NULL  where  OrderID=10254

    8、DataAccessAdapter adapter = new DataAccessAdapter(tr);CustomerEntity customer = new CustomerEntity("CHOPS");

    adapter.DeleteEntity(customer);

    adapter.CloseConnection();

    相当于SQL: Delete customers where customerID='CHOPS'

    9、OrderEntity order = new OrderEntity(10254);

    DataAccessAdapter adapter = new DataAccessAdapter();

    adapter.FetchEntity(order);

    order.SetNewFieldVal((int)OrderFieldIndex.ShippingDate, null);

    adapter.SaveEntity(order);

    相当于SQL: Update Orders Set ShippedDate=null  Where OrderID=10254

         这种写法将不会执行数据验证,使用时要注意这个问题!

           也可以这样写:

          OrderEntity order = new OrderEntity(10254);DataAccessAdapter adapter = new DataAccessAdapter();

    adapter.FetchEntity(order);

    order.ShippingDate = null;

    adapter.SaveEntity(order);

    10、CustomerEntity customer = new CustomerEntity("CHOPS");customer.SetNewFieldVal((int)CustomerFieldIndex.ContactTitle, null);

    customer.TestCurrentFieldValForNull(CustomerFieldIndex.ContactTitle);

    // returns tr

    检测一个字段值是否为NULL

    11、CustomerEntity customer = new CustomerEntity("CHOPS");DataAccessAdapter Adapter = new DataAccessAdapter();

    EntityCollection orders = customer.Orders;

    Adapter.FetchEntityCollection(orders, customer.GetRelationInfoOrders());

    相当于SQL: Select * from  Orders where CustomerID='CHOPS'

    通过主表的一个主键值查找与这个主键相关联的子表的记录

    以下这种办法也可以:

    CustomerEntity customer = new CustomerEntity("CHOPS");DataAccessAdapter Adapter = new DataAccessAdapter();

    Adapter.FetchEntityCollection

    (customer.orders, customer.GetRelationInfoOrders());

    12、 EntityCollection<CustomerEntity> customers =         new EntityCollection<CustomerEntity>(new CustomerEntityFactory());DataAccessAdapter adapter = new DataAccessAdapter();adapter.FetchEntityCollection(customers, null);

    customers.Sort((int)CustomerFieldIndex.CompanyName, ListSortDirection.Descending);

    相当于SQL:  Select * From Customers Order By CompanyName desc

    IPredicate filter = (CustomerFields.Country == "UK");ArrayList indexes = myCustomers.FindMatches(filter);

    这样只在前面的myCustomers 中查找Country == "UK"的记录,不会去数据库中查找。

    13、EntityCollection<CustomerEntity> customers = new EntityCollection<CustomerEntity>();PrefetchPath2 path = new PrefetchPath2(EntityType.CustomerEntity);path.Add(CustomerEntity.PrefetchPathOrders).S Path.Add(OrderEntity.PrefetchPathEmployees);using(DataAccessAdapter adapter = new DataAccessAdapter()){           adapter.FetchEntityCollection(customers, null, path);}这里一共取了三个表的数据,主表为customers及其的子表Orders及Orders的主表Employess。

    14、using (DataAccessAdapter adapter = new DataAccessAdapter())

                {

                    DataTable table = new DataTable();

                    table.Columns.Add("CustomerId", typeof(string));

                    table.Columns.Add("CompanyName", typeof(string));

                    table.Columns.Add("OrderId", typeof(string));

                    ResultsetFields fields = new ResultsetFields(3);

                    fields[0] = CustomersFields.CustomerId;

                    fields[1] = CustomersFields.CompanyName;

                    fields[2] = OrdersFields.OrderId;

                    RelationPredicateB ket filter = new RelationPredicateB ket(CustomersFields.Country == "Germany");

                    filter.Relations.Add(CustomersEntity.Relations.OrdersEntityUsingCustomerId);

                    IDataReader reader = adapter.FetchDataReader(fields, filter, CommandBehavior.CloseConnection, 0, tr);

                    while (reader.Read())

                    {

                        table.Rows.Add(reader.GetVal(0).ToString(), reader.GetVal(1).ToString(), reader.GetVal(2).ToString());

                    }

                    reader.Close();

               }

    这是同时从两个表中查找记录的办法

    相当于SQL:  select customers.customerid,customers.CompanyName from customers

                      where  customers.Country = 'USA'

    15、EntityCollection employees = new EntityCollection(new EmployeesEntityFactory());

            IPrefetchPath2 prefetchPath = new PrefetchPath2((int)EntityType.EmployeesEntity);

            ISortExpression sorter = new SortExpression();

            sorter.Add(OrdersFields.OrderDate | SortOperator.Descending);

            prefetchPath.Add(EmployeesEntity.PrefetchPathOrders, 10, null, null, sorter);

            DataAccessAdapter adapter = new DataAccessAdapter();

         adapter.FetchEntityCollection(employees,null, prefetchPath);

    相当于SQL: select * from employees  假设第一条记录的employeeid=1

     select top 10 * from  orders where employeeid=1 order by orderid desc

    16、Excl?Incl?FieldsList excl?dFields = new Excl?Incl?FieldsList();excl?dFields.Add(CustomerFields.ContactName);

    excl?dFields.Add(CustomerFields.Country);

    EntityCollection customers = new EntityCollection

     (new EmployeesEntityFactory());

    SortExpression sorter =

            new SortExpression(CustomersFields.CustomerId | SortOperator.Descending);

    using(DataAccessAdapter adapter = new DataAccessAdapter())

    {

            adapter.FetchEntityCollection(customers, null, 0, sorter, null, excl?dFields);

    }

    相当于SQL:

    Select ContactName,Country from customers order by CustomerId  desc

    CustomersEntity c = new CustomersEntity("CHOPS");

    using(DataAccessAdapter adapter = new DataAccessAdapter())

    {

            adapter.FetchEntity(c, null, null, excl?dFields);

    }

    相当于SQL:

    Select ContactName,Country from customers Where CustomerId ='CHOPS'

    using(DataAccessAdapter adapter = new DataAccessAdapter())

    {

            adapter.FetchExcl?dFields(customers, excl?dFields);

            adapter.FetchExcl?dFields(c, excl?dFields);

    }

    也可以这样写

    17、Excl?Incl?FieldsList excl?dFields = new Excl?Incl?FieldsList();

         excl?dFields.Add(OrdersFields.OrderDate);

         PrefetchPath2 path = new PrefetchPath2(EntityType.CustomersEntity);

         path.Add(CustomersEntity.PrefetchPathOrders, excl?dFields);

         EntityCollection customers = new EntityCollection(new CustomersEntityFactory());

         using (DataAccessAdapter adapter = new DataAccessAdapter())

             {

                   adapter.FetchEntityCollection(customers, null, 25, null, path);

           }

    18、 DataAccessAdapter adapter = new DataAccessAdapter();

         // 开始一个事务

         adapter.StartTransaction(IsolationLevel.ReadCommitted, "TwoUpates");

              try

                {

                    CustomersEntity customer = new CustomersEntity("CHOPS");

                    OrdersEntity order = new OrdersEntity(10254);

                    adapter.FetchEntity(customer);

                    adapter.FetchEntity(order);

                    // 修改字段

                    customer.Fax = "12345678";

                    order.Freight = 12;

                    // 保存

                    adapter.SaveEntity(customer);

                    adapter.SaveEntity(order);

                    // 提交

                    adapter.Commit();

                }

             catch

                {

                    //出错回滚

                    adapter.Rollback();

                    throw;

                }

            finally

                {

                    // 销毁

                    adapter.Dispose();

              }

    19、以下是一个更好的方法

    DataAccessAdapter adapter = new DataAccessAdapter();

                try

                {

                    adapter.StartTransaction(IsolationLevel.ReadCommitted, "SavepointRollback");

                    AddressEntity newAddress = new AddressEntity();

                    adapter.SaveEntity(newAddress, tr);

                    adapter.SaveTransaction("SavepointAddress");

                    CustomersEntity newCustomer = new CustomersEntity();

                    newCustomer.VisitingAddress = newAddress;

                    newCustomer.BillingAddress = newAddress;

                    try

                    {

                        adapter.SaveEntity(newCustomer, tr);

                    }

                    catch (Exception ex)

                    {

                        adapter.Rollback("SavepointAddress");

                    }

                    adapter.Commit();

                }

                catch

                {

                    adapter.Rollback();

                    throw;

                }

                finally

                {

                    adapter.Dispose();

              }

    21、IRelationPredicateB ket filter = new RelationPredicateB ket();

        filter.PredicateExpression.Add(CustomersFields.Country == "France");

        filter.Relations.Add(OrdersEntity.Relations.CustomersEntityUsingCustomerId);

        DataAccessAdapter adapter = new DataAccessAdapter();

      int amount = (int)adapter.GetDbCount(new

    OrdersEntityFactory().CreateFields(), filter, null, false);

    相当于SQL:

    Select count (*) from orders,customers Where Country = 'France'  and customers.customerID=ORDERS.customerID

    22、protected override void SerializeOwnedData(SerializationWriter writer, object context)

            {

                base.SerializeOwnedData(writer, context);

                writer.WriteOptimized(this.OrderId);

            }

    protected override void DeserializeOwnedData(SerializationReader reader,

     object context)

            {

                base.DeserializeOwnedData(reader, context);

                this.OrderId = reader.ReadOptimizedInt32();

       }

    23、PredicateExpression filter = new PredicateExpression();

                filter.Add(new FieldBetweenPredicate(OrdersFields.OrderDate,null, new DateTime(1996, 8, 1), new DateTime(1996, 8, 12)));

                RelationPredicateB ket b ket = new RelationPredicateB ket();

                b ket.PredicateExpression.Add(filter);

                EntityCollection customers = new EntityCollection(new OrdersEntityFactory());

                using (DataAccessAdapter adapter = new DataAccessAdapter())

                {

                    adapter.FetchEntityCollection(customers, b ket);

                }

     相当于SQL:

    Select * from orders  where orderdate between '1996-08-01' and '1996-08-12'

    24、EntityCollection Orders= new EntityCollection(new OrdersEntityFactory());

         RelationPredicateB ket b ket = new RelationPredicateB ket();

       b ket.PredicateExpression.Add(OrdersFields.ShippedDate==System.DBNull.Val);

                using (DataAccessAdapter adapter = new DataAccessAdapter())

                {

                    adapter.FetchEntityCollection(Orders, b ket);

                }

    相当于SQL: select * from orders where shippeddate is null

    也可以这样写:

    b ket.PredicateExpression.Add(new FieldCompareNullPredicate(OrdersFields.ShippedDate,null ,false));

    25、EntityCollection customers = new EntityCollection(new OrdersEntityFactory());

        RelationPredicateB ket b ket = new RelationPredicateB ket();

        DateTime[] vals = new DateTime[3] { new DateTime(1998,04,8), new DateTime(1998,4,13), new DateTime(1998,4,21)};

        b ket.PredicateExpression.Add(new FieldCompareRangePredicate(OrdersFields.OrderDate,null, vals));

        using (DataAccessAdapter adapter = new DataAccessAdapter())

           {

                 adapter.FetchEntityCollection(customers, b ket);

           }

    相当于SQL:

     select * from orders where OrderDate in ('1998-04-08' ,'1998-04-13','1998-04-21')

    也可以这样写:

    b ket.PredicateExpression.Add(OrderFields.OrderDate == vals);//里面是数组

    26、EntityCollection customers = new EntityCollection(new CustomersEntityFactory());

        RelationPredicateB ket b ket = new RelationPredicateB ket();

        b ket.Relations.Add(CustomersEntity.Relations.OrdersEntityUsingCustomerId);

        b ket.PredicateExpression.Add(new FieldCompareSetPredicate(

     CustomersFields.CustomerId,null, OrdersFields.CustomerId,null,

                                    SetOperator.In, (OrdersFields.EmployeeId == 9)));

        using (DataAccessAdapter adapter = new DataAccessAdapter())

           {

               adapter.FetchEntityCollection(customers, b ket);

           }

    相当于SQL:

    select * from customers where   Customers.CustomerID IN (SELECT CustomerID FROM Orders WHERE Employeeid=9)

    27、EntityCollection customers = new EntityCollection(new CustomersEntityFactory());

        RelationPredicateB ket b ket = new RelationPredicateB ket();

        b ket.PredicateExpression.Add(new FieldLikePredicate (CustomersFields.CompanyName ,null, "%n"));

        using (DataAccessAdapter adapter = new DataAccessAdapter())

            {

                adapter.FetchEntityCollection(customers, b ket);

            }

    相当于SQL:

    select * from customers where companyname like '%n'

    也可以这样写:

    b ket.PredicateExpression.Add(CustomersFields.CompanyName % "%n");

    28、ResultsetFields fields = new ResultsetFields(2);

        fields.DefineField(CustomersFieldIndex.Country, 0, "Country");

        fields.DefineField(CustomersFieldIndex.CustomerId, 1, "AmountCustomers");

        fields[1].AggregateFunctionToApply = AggregateFunction.CountDistinct;

        DataAccessAdapter adp = new DataAccessAdapter();

        DataTable table = new DataTable();

        IGroupByCollection groupByClause = new GroupByCollection();

        groupByClause.Add(fields[0]);

        groupByClause.Add(fields[1]);

    adp.FetchTypedList(fields, table, null, 0, null, false, groupByClause);

    29、DataAccessAdapter adapter = new DataAccessAdapter();

        decimal orderPrice = (decimal)adapter.GetScalar(OrderDetailsFields.OrderId,

                        (OrderDetailsFields.Q ntity * OrderDetailsFields.UnitPrice), AggregateFunction.Sum, (OrderDetailsFields.OrderId == 10254));

    相当于SQL:

        select sum(unitprice*q ntity) from [Order Details] where orderid=10254

    30、ResultsetFields fields = new ResultsetFields(3);

        fields.DefineField(OrderDetailsFields.OrderId, 0);

        fields.DefineField(OrderDetailsFields.Prod tId, 1);

        fields.DefineField(new EntityField2("RowTotal",

                    (OrderDetailsFields.UnitPrice * OrderDetailsFields.Q ntity)), 2);

        DataTable results = new DataTable();

        DataAccessAdapter adapter = new DataAccessAdapter();

        adapter.FetchTypedList(fields, results, null);

    相当于SQL:

    SELECT OrderID,Prod tID,(UnitPrice * Q ntity) AS RowTotal FROm [Order Details]

    31、ResultsetFields fields = new ResultsetFields(2);

        fields.DefineField(CustomersFields.CustomerId, 0);

        fields.DefineField(new EntityField2("NumberOfOrders", new

    ScalarQryExpression(OrdersFields.OrderId.SetAggregateFunction

    (AggregateFunction.Count),

           (CustomersFields.CustomerId == OrdersFields.CustomerId))), 1);

        DataTable results = new DataTable();

        DataAccessAdapter adapter = new DataAccessAdapter();

        adapter.FetchTypedList(fields, results, null);

    相当于SQL:

    SELECT CustomerID,(SELECT COUNT(*) FROM Orders   WHERE CustomerID = Customers.CustomerID) AS NumberOfOrders FROM Customers

    不容易啊 终于写到这了,现在就把该工具的key贴出来,仅供研究,不得作为任何商业行为谋取暴利。。

    O/R Mapping工具, 针对LLBLgen 使用,可以使用起demo版本, 有效期是30天,

    另外 配置项地址:

    C:\Documents and Settings\user name\Application Data\LLBLGen Pro\ 目录,这个目录中的文件必须<=当天

  • 相关阅读:
    算法提高 道路和航路
    奇偶剪枝
    二分求值
    并查集--路径压缩
    Oracle数据库导入导出DMP文件
    Spring IoC的实现与思考(一)
    sql基础拾遗
    jquery事件函数的使用之focus
    Java动态代理之cglib
    Java se之动态代理
  • 原文地址:https://www.cnblogs.com/Byrd/p/2099735.html
Copyright © 2011-2022 走看看