好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

C#连接PostgreSql数据的操作帮助类

C#连接PostgreSql数据的操作帮助类

using Npgsql;

using System;

using NpgsqlTypes;

using System.Data;

using System.Collections.Generic;

using System.Reflection;

using System.Configuration;

using swapCommon;

namespace PgSqlHelper

{

    public  class PgSqlDbHelper

    { 

        private static string ConnectionString = ConfigCommon.GetConfig("ConnectionStrings:postgerSqlDbContext");  

        /// <summary>

        /// 将参数中null值转换为DBNull --OK 

        /// </summary>

        /// <param name="param"></param>

        public static void SetParmDBNull(NpgsqlParameter[] param)

        { 

            foreach (var p in param)

            {

                if (p.Value == null)

                {

                    p.Value = DBNull.Value;

                }

            }

        }

        /// <summary>

        /// 查询 postgre 数据库,返回 DataTable 数据

        /// </summary>

        /// <param name="sqlText">sql查询语句</param>

        /// <returns></returns>

        public static DataTable ExecuteQuery(string sqlText)

        {

            return ExecuteQuery(sqlText, null);

        }

        /// <summary>

        /// 查询 postgre 数据库,返回 DataTable 数据--OK

        /// </summary>

        /// <param name="sqlText">sql查询语句</param>

        /// <param name="param">参数集合</param>

        /// <returns></returns>

        public static DataTable ExecuteQuery(string sqlText, NpgsqlParameter[] param)

        {

            using (NpgsqlConnection con = new NpgsqlConnection(ConnectionString))

            {

                using (NpgsqlCommand cmd = new NpgsqlCommand(sqlText, con))

                {

                    if (param != null)

                    {

                        SetParmDBNull(param);

                        cmd.Parameters.AddRange(param);

                    }

                    con.Open();

                    NpgsqlDataReader reader = cmd.ExecuteReader();

                    DataTable datatable = new DataTable();

                    // 添加DataTable列

                    for (int i = 0; i < reader.FieldCount; i++)

                    {

                        DataColumn myDataColumn = new DataColumn();

                        myDataColumn.DataType = reader.GetFieldType(i);

                        myDataColumn.ColumnName = reader.GetName(i);

                        datatable.Columns.Add(myDataColumn);

                    }

                    // 添加DataTable数据

                    while (reader.Read())

                    {

                        //var n1 = reader.GetInt32(0);   // 第一列值

                        //var n2 = reader.GetString(1);  // 第二列值

                        DataRow myDataRow = datatable.NewRow();

                        for (int i = 0; i < reader.FieldCount; i++)

                        {

                            myDataRow[i] = reader[i].ToString();

                        }

                        datatable.Rows.Add(myDataRow);

                    }

                    reader.Close();

                    cmd.ExecuteReader(System.Data.CommandBehavior.CloseConnection);  // 关闭关联的connection 

                    return datatable;

                }

            }

        } 

        /// <summary>

        /// 增删改 postgre 数据库,返回是否成功标识--ok

        /// </summary>

        /// <param name="sqlText"></param>

        /// <param name="param">参数集合</param>

        /// <returns></returns>

        public static int ExecuteCommand(string sqlText, NpgsqlParameter[] param)

        { 

            using (NpgsqlConnection con = new NpgsqlConnection(ConnectionString))

            {

                using (NpgsqlCommand cmd = new NpgsqlCommand(sqlText, con))

                {

                    if (param != null)

                    {

                        SetParmDBNull(param);

                        cmd.Parameters.AddRange(param);

                    }

                    con.Open();

                    int cc = cmd.ExecuteNonQuery();

                    con.Close();

                    return cc;

                }

            } 

        }

        /// <summary>

        /// 返回第一行第一列的值 object -- ok

        /// </summary>

        /// <param name="sql"></param>

        /// <param name="ps"></param>

        /// <returns></returns>

        public static object ExecuteScalar(string sql, params NpgsqlParameter[] param)

        {

            using (NpgsqlConnection con = new NpgsqlConnection(ConnectionString))

            {

                using (NpgsqlCommand cmd = new NpgsqlCommand(sql, con))

                {

                    if (param != null)

                    {

                        SetParmDBNull(param);

                        cmd.Parameters.AddRange(param);

                    }

                    con.Open();//打开数据库

                    object cc = cmd.ExecuteScalar();

                    con.Close();

                    return cc;

                }

            }

        }

        #region 事务

        /// <summary>

        /// 返回的是受影响的行数-事务

        /// </summary>

        /// <param name="sql">多个sql</param>

        /// <param name="ps">指定类型的参数</param>

        /// <returns></returns>

        public static int ExecuteNonQueryTrans(List<PgTansSql> tansSqls)

        {

            using (NpgsqlConnection con = new NpgsqlConnection(ConnectionString))

            {

                con.Open();

                using (NpgsqlTransaction trans = con.BeginTransaction())

                {

                    try

                    {

                        using (NpgsqlCommand cmd = new NpgsqlCommand())

                        {

                            int result = 0;

                            cmd.Connection = con;

                            cmd.Transaction = trans; 

                            foreach (var item in tansSqls)

                            {

                                cmd.CommandText = item.sql;

                                if (item.param != null)

                                {

                                    SetParmDBNull(item.param);

                                    cmd.Parameters.AddRange(item.param);

                                    result+= cmd.ExecuteNonQuery();

                                }

                            }

                            trans.Commit();

                            con.Close();

                            return result;

                        }

                    }

                    catch (Exception ex)

                    {

                        trans.Rollback();

                        con.Close();

                        con.Dispose();

                        throw ex;

                    }

                }

            }

        }

        #endregion

    }

    public class PgTansSql

    {

       public string sql { get; set; }

        public NpgsqlParameter[] param { get; set; }

    }

    public class DataTableToListHelper

    {

        /// <summary>

        /// DataTable转换List,反射机制

        /// </summary>

        /// <param name="dt"></param>

        /// <returns></returns>

        public static IList<T> DataTableToList<T>(DataTable dt) where T : new()

        {

            IList<T> list = new List<T>();// 定义集合

            Type type = typeof(T); // 获得此模型的类型

            var tempName = string.Empty;

            foreach (DataRow dr in dt.Rows)

            {

                T t = new T();

                PropertyInfo[] propertys = t.GetType().GetProperties();// 获得此模型的公共属性

                foreach (PropertyInfo pi in propertys)

                {

                    tempName = pi.Name;

                    if (dt.Columns.Contains(tempName))

                    {

                        if (!pi.CanWrite) continue;

                        object value = dr[tempName];

                        if (value != DBNull.Value)

                            pi.SetValue(t, value, null);

                    }

                }

                list.Add(t);

            }

            return list;

        }

        /// <summary>

        /// 确认 DataTable 里面最多只有一行数据,转成 Object,反射机制

        /// </summary>

        /// <param name="dt"></param>

        /// <returns></returns>

        public static T DataTableToObject<T>(DataTable dt) where T : new()

        {

            T t = new T();

            var tempName = string.Empty;

            if (dt.Rows == null || dt.Rows.Count == 0)

            {

                return t;

            }

            DataRow dr = dt.Rows[0];

            PropertyInfo[] propertys = t.GetType().GetProperties();// 获得此模型的公共属性

            foreach (PropertyInfo pi in propertys)

            {

                tempName = pi.Name;

                if (dt.Columns.Contains(tempName))

                {

                    if (!pi.CanWrite) continue;

                    object value = dr[tempName];

                    if (value != DBNull.Value)

                        pi.SetValue(t, value, null);

                }

            }

            return t;

        }

    }

}

using Microsoft.Extensions.Configuration;

using Newtonsoft.Json;

using PgSqlHelper;

using System; 

using Microsoft.Extensions.DependencyInjection;

using System.Collections.Generic;

using Npgsql;

namespace ConsoleApp1

{

    class Program

    {

        static void Main(string[] args)

        {

            List<PgTansSql> tansSqls = new List<PgTansSql>();

            NpgsqlParameter[] sqlPara = new NpgsqlParameter[2];

            //pgsql 的参数与SQL SERVER 的格式不一样

            sqlPara[0] = new NpgsqlParameter<DateTime>(":createtime", DateTime.Now); //注意:事务处理中,参数化的名字不能相同。下面采用的是createtime2

            sqlPara[1] = new NpgsqlParameter<int>(":sex",  -2);//注意:事务处理中,参数化的名字不能相同。下面采用的是 sex2

            tansSqls.Add(new PgTansSql() { sql = "update student set sex=:sex,createtime=:createtime where sname='陈'", param= sqlPara });

            NpgsqlParameter[] sqlPara2 = new NpgsqlParameter[3];

            sqlPara2[0] = new NpgsqlParameter<int>(":sex2", 4); //注意:事务处理中,参数化的名字不能相同。上面采用的是 :sex

            sqlPara2[1] = new NpgsqlParameter<string>(":sname","李四");

            sqlPara2[2] = new NpgsqlParameter<DateTime>(":createtime2", DateTime.Now.AddDays(1));//注意:事务处理中,参数化的名字不能相同。上面采用的是 :createtime

            tansSqls.Add(new PgTansSql() { sql = "update student set sex=:sex2,sname=:sname,createtime=:createtime2 where sname='李四'", param = sqlPara2 });

            var dt = PgSqlDbHelper.ExecuteNonQueryTrans(tansSqls);

            Console.WriteLine(JsonConvert.SerializeObject(dt));

            Console.ReadLine();

        }

    }

}


查看更多关于C#连接PostgreSql数据的操作帮助类的详细内容...

  阅读:12次