Npgsql使用入门(二)【实用助手类】

我正在说谎。——罗素


数据库映射的实体类:

public class Test
    {
        public long TestID { get; set; }
        public string Name { get; set; }
        public int Age { get; set; }
    }

 public class TestLink
    {
        public int TestLinkID { get; set; }
        public long TestID { get; set; }
        public string LinkName { get; set; }
    }

 public class customer
    {
        public long customer_id { get; set; }
        public int age { get; set; }
        public string name { get; set; }
    }

 public class order
    {
        public int order_id { get; set; }
        public int customer_id { get; set; }
        public string item { get; set; }
        public string shipping_address { get; set; }
    }

 /// <summary>
    /// 实体 company
    /// </summary>
    [Description("Primary:id")]
    [Serializable]
    public class Company
    {

        #region 私有变量
        private Int32 _id = Int32.MinValue;
        private string _name = null;
        private Int32 _age = Int32.MinValue;
        private string _address = null;
        private float _salary = float.MinValue;
        private DateTime _join_date = DateTime.MinValue;
        #endregion

        #region 公共属性
        /// <summary>
        /// 主键 id(NOT NULL)
        /// </summary>
        public Int32 id
        {
            set { _id = value; }
            get { return _id; }
        }
        /// <summary>
        /// name(NOT NULL)
        /// </summary>
        public string name
        {
            set { _name = value; }
            get { return _name; }
        }
        /// <summary>
        /// age(NOT NULL)
        /// </summary>
        public Int32 age
        {
            set { _age = value; }
            get { return _age; }
        }
        /// <summary>
        /// address
        /// </summary>
        public string address
        {
            set { _address = value; }
            get { return _address; }
        }
        /// <summary>
        /// salary
        /// </summary>
        public float salary
        {
            set { _salary = value; }
            get { return _salary; }
        }
        /// <summary>
        /// join_date
        /// </summary>
        public DateTime join_date
        {
            set { _join_date = value; }
            get { return _join_date; }
        }
        #endregion


    }

Program.cs代码:

 public class Program
    {
        static void Main(string[] args)
        {
            using (var dc = new NpgSqlDataContext("Host=localhost;Username=king;Password=wu12345;Database=dellstore").MapComposite<Company>("company"))
            {
                var r0 = dc.Query(@"SELECT * FROM company");
                PrintTable(r0);

                //-------------------------------------------------------------------------------------------------

                var r1 = dc.Query(@"SELECT * FROM company where id=@id", new NpgsqlParameter("id", 3));
                PrintTable(r1);
                //-------------------------------------------------------------------------------------------------

                // 使用表值参数
                // Postgres 没有tvp - 它们由正则或复合类型的数组
                var r3 = dc.Query(@" SELECT c.*   FROM company c  INNER JOIN UNNEST(@ageval_tvp) tvp ON  c.age = tvp", new NpgsqlParameter("ageval_tvp", new int[] { 1,3, 4}));
                PrintTable(r3);
                //-------------------------------------------------------------------------------------------------

                // 复合型tvp
                dc.MapComposite<Company>("company");
                var r4 = dc.Query(@" SELECT c.*  FROM company c  INNER JOIN UNNEST(@x_company) x ON  c.age = x.age AND  c.name = x.name",
                        new NpgsqlParameter(
                            "x_company",
                            new Company[] {
                                new Company() { name = "Paul", age = 32 },
                                new Company() { name = "Allen", age = 25 }
                            }
                        )
                    );
                PrintTable(r4);
                //-------------------------------------------------------------------------------------------------

                dc.MapComposite<order>("orders");
                var r6 = dc.Query(@"INSERT INTO orders (order_id,customer_id, item,shipping_address) SELECT order_id,customer_id, item,shipping_address from UNNEST(@x_orders) returning order_id",
                        new NpgsqlParameter(
                            "x_orders",
                            new order[] {
                                new order() {order_id=1, customer_id = 22, item = "cc",shipping_address="加利福尼亚硅谷1号" },
                                new order() {order_id=2,customer_id = 23, item = "dd",shipping_address="中国上海外滩18号" }
                            })
                        );
                PrintTable(r6);
                //-------------------------------------------------------------------------------------------------

                //Console.ReadKey();

                var r7 = dc.Execute(@"WITH customer as (insert into customers(name, age) values ('Ghan', 55) returning customer_id)INSERT INTO orders(customer_id, item)SELECT c.customer_id, x.item FROM customer c CROSS JOIN UNNEST(@x_orders) x
                ",
                    new NpgsqlParameter(
                        "x_orders",
                        new order[] {
                            new order() { item = "gg" },
                            new order() { item = "hh" }
                        }
                    )
                );
                Console.WriteLine("Inserted {0} rows", r7);

                //-------------------------------------------------------------------------------------------------


                //区分大小写的名称
                var query = @"
                            WITH Customer AS (INSERT INTO ""Test"" (""Name"", ""Age"")
                            SELECT ""Name"", ""Age""
                            FROM UNNEST(@TestItems) returning ""TestID"")
                            INSERT INTO ""TestLink"" (""TestID"") 
                            SELECT c.""TestID"" FROM Customer c
                            ";

               var query1 = @"
                            WITH Customer AS (INSERT INTO ""Test"" (""Name"", ""Age"")
                            SELECT ""Name"", ""Age""
                            FROM UNNEST(@TestItems) returning ""TestID"")
                            INSERT INTO ""TestLink"" (""TestID"", ""LinkName"") 
                            SELECT c.""TestID"", x.""LinkName"" FROM Customer c CROSS JOIN UNNEST (@TestLinkItems) x
                            ";

                var x = dc.Execute(query,new NpgsqlParameter("TestItems", new Test[] { new Test() { Name = "Sam", Age = 25 } }));

                Console.WriteLine("已插入行 {0}", x);
                //-------------------------------------------------------------------------------------------------

                var y = dc.Execute(query1,
                    new NpgsqlParameter(
                        "TestItems",
                        new Test[] { new Test() { Name = "Sam", Age = 25 } }),
                    new NpgsqlParameter(
                        "TestLinkItems",
                        new TestLink[]
                        {
                        new TestLink() {LinkName = "xxx"},
                        new TestLink() {LinkName = "yyy"}
                        }));

                Console.WriteLine("已插入行 {0}", y);

            }
            Console.ReadKey();
        }

        static void PrintTable(DataTable t)
        {
            foreach (var c in t.Columns.Cast<DataColumn>().Select(r => r.ColumnName))
                Console.Write("{0,12}", c);
            Console.WriteLine();

            foreach (var r in t.Rows.Cast<DataRow>())
            {
                foreach (var c in r.ItemArray)
                {
                    int length=c.ToString().Length;
                    Console.Write("{0,12}", length > 10 ? c.ToString().Substring(0, 10) : c.ToString());
                }

                Console.WriteLine();
            }
            Console.WriteLine("\n");
            Console.WriteLine("-----------------------------------------------------------------------------");
        }
    }

CaseSensitiveTranslator.cs代码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Npgsql;

namespace NpgSqlUtils
{
    public class CaseSensitiveTranslator : INpgsqlNameTranslator
    {
        public string TranslateMemberName(string clrName)
        {
            return clrName;
        }

        public string TranslateTypeName(string clrName)
        {
            return clrName;
        }
    }
}

INpgSqlDataContext.cs代码:

using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Npgsql;

namespace NpgSqlUtils
{
    public interface INpgSqlDataContext: IDisposable
    {
        INpgsqlNameTranslator Translator { get; }
        DataTable Query(string query, params NpgsqlParameter[] parameters);
        int Execute(string query, params NpgsqlParameter[] parameters);

        /// <summary>
        ///
        /// </summary>
        INpgSqlDataContext MapComposite<T>(string name) where T : new();
    }
}

NpgSqlDataContext.cs代码:

using Npgsql;
using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace NpgSqlUtils
{
    public class NpgSqlDataContext : INpgSqlDataContext
    {
        private NpgsqlConnection _connection;

        public INpgsqlNameTranslator Translator { get; set; }

        public NpgSqlDataContext(string connectionString, INpgsqlNameTranslator translator = null)
        {
            if (translator == null)
                translator = new CaseSensitiveTranslator();

            Translator = translator;

            _connection = new NpgsqlConnection(connectionString);
            _connection.Open();
        }

        public DataTable Query(string query, params NpgsqlParameter[] parameters)
        {
            DataTable result;
            using (NpgsqlCommand cmd = new NpgsqlCommand())
            {
                cmd.Connection = _connection;
                cmd.CommandText = query;
                cmd.Parameters.AddRange(parameters);

                using (var reader = cmd.ExecuteReader())
                {
                    result = new DataTable();
                    result.Load(reader);
                }
            }

            return result;
        }


        public int Execute(string query, params NpgsqlParameter[] parameters)
        {
            int result = -1;
            using (NpgsqlCommand cmd = new NpgsqlCommand())
            {
                cmd.Connection = _connection;
                cmd.CommandText = query;
                cmd.Parameters.AddRange(parameters);
                result = cmd.ExecuteNonQuery();
            }

            return result;
        }

        public void Dispose()
        {
            _connection.Dispose();
        }

        public INpgSqlDataContext MapComposite<T>(string name) where T : new()
        {
            _connection.MapComposite<T>(name, Translator);
            return this;
        }
    }
}

SQL脚本:

-- Table: public.company

-- DROP TABLE public.company;

CREATE TABLE public.company
(
    id integer NOT NULL,
    name text COLLATE pg_catalog."default" NOT NULL,
    age integer NOT NULL,
    address character(50) COLLATE pg_catalog."default",
    salary real,
    join_date date,
    CONSTRAINT company_pkey PRIMARY KEY (id)
)
WITH (
    OIDS = FALSE
)
TABLESPACE pg_default;

ALTER TABLE public.company
    OWNER to postgres;

-- Table: public.orders

-- DROP TABLE public.orders;

CREATE TABLE public.orders
(
    order_id integer NOT NULL,
    shipping_address text COLLATE pg_catalog."default",
    item text COLLATE pg_catalog."default",
    customer_id integer,
    CONSTRAINT orders_pkey PRIMARY KEY (order_id)
)
WITH (
    OIDS = FALSE
)
TABLESPACE pg_default;

ALTER TABLE public.orders
    OWNER to postgres;

运行结果如图:

这里写图片描述


这里写图片描述


这里写图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值