zoukankan      html  css  js  c++  java
  • PDF.NET数据开发框架操作MySQL实体类操作实例

    在我们最近的项目中,SQL-MAP使用较多,但是实体类用的很少,实际上,“PDF.NET数据开发框架”的实体类相当强大,下面的测试程序是在MySQL中操作的实例。

    1,首先在App.config文件中配置数据库连接字符串:

    <?xml version="1.0" encoding="utf-8" ?>
    <configuration>
      <connectionStrings>
        <add name ="default" connectionString ="server=192.168.XX.XX;User Id=root;password=XXXX;database=test" providerName="PWMIS.DataProvider.Data.MySQL,PWMIS.MySqlClient"/>
      </connectionStrings>
    </configuration>
    

    2,然后定义一个“用户”实体类:

    /*
     * PDF.NET 数据开发框架
     * http://www.pwmis.com/sqlmap
     */
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using PWMIS.DataMap.Entity;
    
    namespace TestMySqlEntity
    {
        class User:EntityBase 
        {
            public User()
            {
                TableName = "tb_user";
                PrimaryKeys.Add("ID");//主键
                IdentityName = "ID";//标识,自增
                PropertyNames = new string[] {"ID","Name","Age" };
                PropertyValues = new object[PropertyNames.Length];
    
            }
    
            public int ID
            {
                get { return getProperty<int>("ID"); }
                set { setProperty("ID", value); }
            }
    
            public int Age
            {
                get { return getProperty<int>("Age"); }
                set { setProperty("Age", value); }
            }
    
            public string Name
            {
                get { return getProperty<string>("Name"); }
                set { setProperty("Name", value,50); }
            }
        }
    }
    
    

    3,根据这个实体类,我们去MySQL定义一个用户表:tb_user,具体过程省略。

    (此目的也是为了先有实体再有数据表,以便大家领略ORM的正真含义)

    4,编写ORM实体类操作的测试代码:

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using PWMIS.DataMap.Entity;

    namespace TestMySqlEntity
    {
        
    class Program
        {
            
    static void Main(string[] args)
            {
                User u 
    = new User();

                
    //*************构建 OQL 查询表达式 ******* begin ************
                
    //查询实体集合
                
    //使用 OQLCompare 对象作为条件
                
    //OQL q = OQL.From(u).Select().Where(new OQLCompare(u).Comparer(u.Age, OQLCompare.CompareType.NoSmaller, 15)).END ;

                OQL q 
    = new OQL(u);
                
    //使用OQL2 作为条件对象
                q.Select().Where(q.Condition.AND(u.Age, ">="15)).OrderBy (u.Age ,"asc");
                
    //使用 QueryParameter 数组作为条件,适合于多个并列的And条件
                
    //q.Select().Where(new QueryParameter[] { new QueryParameter("Age", PWMIS.Common.enumCompare.NoSmaller, 15) }).OrderBy(u.Age, "asc"); 
                Console.WriteLine("OQL to SQL:\r\n"+q.ToString ());

                
                
    //*************构建 OQL 查询表达式 ******* end ************

                
    //查询实体列表
                var result = EntityQuery<User>.QueryList(q);
                Console.WriteLine(
    "查询实体集合成功,数量:"+result .Count );

                Console.WriteLine(
    "\r\nExecuted SQL Text:\r\n{0}\r\n", PWMIS.DataProvider.Data.CommandLog.Instance.CommandText);

                
    //查询单个实体
                u.Name = "zhang san";
                q.Select().Where(u.Name);
                Console.WriteLine(
    "OQL to SQL:\r\n" + q.ToString());
                User u1 
    = EntityQuery<User>.QueryObject(q);
                
    if (u1 != null)
                    Console.WriteLine(
    "查询单个实体成功!");

                Console.WriteLine(
    "\r\nExecuted SQL Text:\r\n{0}\r\n", PWMIS.DataProvider.Data.CommandLog.Instance.CommandText);


                
    //直接使用EntityQuery<T>.Instance 属性的插入、修改、删除方法
                u.Name = "li si3";
                u.Age 
    = 15;
                
    if (EntityQuery<User>.Instance.Insert(u) > 0)
                    Console.WriteLine(
    "插入实体成功!"); //将自动为ID属性赋值

                Console.WriteLine(
    "\r\nExecuted SQL Text:\r\n{0}\r\n", PWMIS.DataProvider.Data.CommandLog.Instance.CommandText);

                u.Age 
    = 25;
                
    if (EntityQuery<User>.Instance.Update (u) > 0)
                    Console.WriteLine(
    "修改实体成功!");

                Console.WriteLine(
    "\r\nExecuted SQL Text:\r\n{0}\r\n", PWMIS.DataProvider.Data.CommandLog.Instance.CommandText);

                User u2 
    = new User();
                u2.Name 
    = "wang wu";
                u2.Age 
    = 20;

                
    //使用EntityQuery<T> 的实例对象方法更新实体
                
    //只会更新赋值过的属性值
                EntityQuery<User> eq = new EntityQuery<User>(u2);
                
    if (eq.SaveAllChanges() > 0)
                    Console.WriteLine(
    "更新实体成功!");

                Console.WriteLine(
    "\r\nExecuted SQL Text:\r\n{0}\r\n", PWMIS.DataProvider.Data.CommandLog.Instance.CommandText);

                Console.Read();
            }
        }
    }
     

    5,编译运行,得到下面的结果:

    OQL to SQL:
    SELECT [ID],[Name],[Age]
     FROM [tb_user]
       Where  [Age] >= @Age0
            Order by [Age] asc
    查询实体集合成功,数量:23

    Executed SQL Text:
    SELECT `ID`,`Name`,`Age`
     FROM `tb_user`
       Where  `Age` >= @Age0
            Order by `Age` asc

    OQL to SQL:
    SELECT [ID],[Name],[Age]
     FROM [tb_user]
       Where Name=@Name

    查询单个实体成功!

    Executed SQL Text:
    SELECT `ID`,`Name`,`Age`
     FROM `tb_user`
       Where Name=@Name


    插入实体成功!

    Executed SQL Text:
    INSERT INTO `tb_user`(`Name`,`Age`) VALUES (@P0,@P1)

    修改实体成功!

    Executed SQL Text:
    UPDATE `tb_user` SET `Age`=@P0 WHERE `ID`=@P1

    更新实体成功!

    Executed SQL Text:
    INSERT INTO `tb_user`(`Name`,`Age`) VALUES (@P0,@P1)

     

    6,结果说明

    我们看到整个操作都成功了,特别注意这个:

    UPDATE `tb_user` SET `Age`=@P0 WHERE `ID`=@P1
    
    

    当时我们只给Age属性重新赋值了,所以生成的更新语句也仅仅更新了该字段。

    实体类查询OQL表达式可以有多种Where条件构造方式,具体请看上面的代码。

  • 相关阅读:
    'IDataObject': ambiguous symbol的解决方法
    捕获windows系统的sleep或hibernate状态
    CallingConvention理解
    Exception from HRESULT: 0x8001010D (RPC_E_CANTCALLOUT_ININPUTSYNCCALL))
    .Net Managed C++如何获取当前线程id和当前进程id
    div垂直居中于div中
    父级是relative,子级为absolute的情况下,子级宽度自适应
    background-img高度固定,图片自适应
    如何让两个input紧挨着.
    C# 调用百度短链接api
  • 原文地址:https://www.cnblogs.com/bluedoctor/p/2015195.html
Copyright © 2011-2022 走看看