Npgsql使用入门(二)【实用助手类】
2017-06-06 20:43
344 查看
数据库映射的实体类:
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;
运行结果如图:
相关文章推荐
- Npgsql使用入门(二)【实用助手类】
- 学习maven的使用实用的入门教程
- 图解CodeSmith使用和实用教程一 - 入门和生成MIS项目实体层代码
- 学习maven的使用实用的入门教程 转
- 学习maven的使用实用的入门教程
- Android Studio使用技巧---良心推荐的实用功能 Android Studio打包全攻略---从入门到精通
- Npgsql使用入门(三)【批量导入数据】
- 记性不可靠,纸头最重要,Excel VBA(宏)入门实用--Like 使用
- Npgsql使用入门(一)【搭建环境】
- Npgsql使用入门(三)【批量导入数据】
- 最近发布了1个手机软件 《网站监测助手 KJAVA手机版 (站长实用工具) 》,欢迎大家使用
- solr最实用入门使用手册
- Npgsql使用入门(一)【搭建环境】
- Linux下实用功能make的使用入门
- Eclipse使用入门
- 【MasterPages实用技巧】使用MasterPages实现Web窗体模板
- Eclipse使用入门 (1)
- 通过几个非常实用的例子了解asp中使用正则表达式
- .Net中的反射使用入门
- make使用入门