C# 应用 - 封装类访问 Postgresql 数据库
- 引入库类
- 连接数据库
- 访问数据库
1)增删改数据库
2)查数据库 - 数据转换
- 事务
1. 引入库类
引入 Npgsql.dll
using Npgsql;
using NpgsqlTypes;
2. 连接数据库
/// <summary>
/// 使用固定连接进行数据库的操作,默认false,表示每次操作都使用新的连接,true,表示数据库操作都使用变量NpgsqlConn,设置为true时必须初始化NpgsqlConn
/// </summary>
public bool UseSpecifiedConn = false;
/// <summary>
/// 使用指定连接执行数据库操作时所用的数据库连接,使用前需设置UseSpecifiedConn,并且自行管理连接的打开和关闭
/// </summary>
public NpgsqlConnection NpgsqlConn;
using Npgsql;
using NpgsqlTypes;
...
public void SetConnectStr(string connStr)
{
SetConnectStr(connStr, false);
}
/// <summary>
/// 构造函数,如果固定连接,初始化 NpgsqlConn;如果不固定,只需要设置 ConnectionString 连接信息。当然,也可以不判断,直接执行。
/// </summary>
/// <param name="connStr"></param>
/// <param name="IsUseSpecifiedConn">是否使用固定连接,用于事务</param>
public void SetConnectStr(string connStr, bool IsUseSpecifiedConn)
{
if (IsUseSpecifiedConn)
{
UseSpecifiedConn = IsUseSpecifiedConn;
NpgsqlConn = new NpgsqlConnection(connStr);
}
else
{
ConnectionString = connStr;
}
}
/// <summary>
/// 关闭数据库连接
/// </summary>
/// <returns></returns>
public bool CloseConn()
{
try
{
NpgsqlConn.Close();
return NpgsqlConn.State == ConnectionState.Closed;
}
catch (Exception ex)
{
Common.WriteLog.Error("关闭数据库连接出错!", ex);
return false;
}
}
/// <summary>
/// 检查数据库连接是否正常
/// </summary>
/// <returns></returns>
public bool TryOpenConn()
{
bool result = false;
using (NpgsqlConnection NpgsqlConn = new NpgsqlConnection(ConnectionString))
{
try
{
NpgsqlConn.Open();
result = NpgsqlConn.State == ConnectionState.Open;
}
catch (Exception ex)
{
Common.WriteLog.Error("打开数据库连接出错!", ex);
}
}
return result;
}
3. 访问数据库
3.1 增删改数据库
3.1.1 返回 int
/// <summary>
/// 增删改 postgre 数据库,返回是否成功标识
/// </summary>
/// <param name="sqlText"></param>
/// <returns></returns>
public int ExecuteNonQuery(string sqlText)
{
return ExecuteNonQuery(sqlText, null);
}
/// <summary>
/// 增删改 postgre 数据库,返回是否成功标识
/// </summary>
/// <param name="sqlText"></param>
/// <param name="param">参数集合</param>
/// <returns></returns>
public int ExecuteNonQuery(string sqlText, NpgsqlParameter[] param)
{
int result = int.MinValue;
NpgsqlConnection conn = UseSpecifiedConn ? NpgsqlConn : new NpgsqlConnection(ConnectionString);
using (var nSqlCommand = new NpgsqlCommand(sqlText, conn))
{
try
{
if (conn.State != ConnectionState.Open)
{
conn.Open();
}
// 添加参数
if (param != null)
{
SetParmDBNull(param);
nSqlCommand.Parameters.AddRange(param);
}
// 执行查询并返回受影响的行数
result = nSqlCommand.ExecuteNonQuery();
}
catch (NpgsqlException ex)
{
Common.WriteLog.Error("执行数据库语句出错!执行语句:" + sqlText, ex);
if (ex != null)
{
result = ex.ErrorCode;
}
}
finally
{
if (!UseSpecifiedConn)
{
conn.Dispose();
}
}
}
return result;
}
/// <summary>
/// 将参数中null值转换为DBNull
/// </summary>
/// <param name="param"></param>
public void SetParmDBNull(NpgsqlParameter[] param)
{
foreach (var p in param)
{
if (p.Value == null)
{
p.Value = DBNull.Value;
}
}
}
3.1.2 增删改调用实例
/// <summary>
/// 插入xx
/// </summary>
/// <param name="cameraid">摄像头ID</param>
/// <param name="itag">标签</param>
/// <returns></returns>
public int InsertAXX(string cameraid, ExtendCustomTag itag)
{
if (string.IsNullOrEmpty(cameraid) || itag == null) return -1;
string sql = "insert into TableName(CameraID,TagLevel) values(@CameraID,@TagLevel)";
NpgsqlParameter[] param = new NpgsqlParameter[2];
param[0] = new NpgsqlParameter("@CameraID", NpgsqlDbType.Text) { Value = cameraid };
param[1] = new NpgsqlParameter("@TagLevel", NpgsqlDbType.Integer) { Value = itag.Level };
int result = ExecuteNonQuery(sql, param);
return result;
}
/// <summary>
/// 软删除xx
/// </summary>
/// <param name="presetId"></param>
/// <returns> 1 表示操作成功,-1 表示失败</returns>
public int DeleteAXX(string id)
{
int flag = -1;
if (!string.IsNullOrEmpty(id))
{
var deleteSql = string.Format("update tablename set status = false where id = '{0}'", id);
flag = this.ExecuteNonQuery(deleteSql);
}
return flag;
}
3.2 查数据库
3.2.1 返回 datatable
/// <summary>
/// 查询 postgre 数据库,返回 DataTable 数据
/// </summary>
/// <param name="sqlText">sql查询语句</param>
/// <returns></returns>
public DataTable ExecuteQuery(string sqlText)
{
return ExecuteQuery(sqlText, null);
}
/// <summary>
/// 查询 postgre 数据库,返回 DataTable 数据
/// </summary>
/// <param name="sqlText">sql查询语句</param>
/// <param name="param">参数集合</param>
/// <returns></returns>
public DataTable ExecuteQuery(string sqlText, NpgsqlParameter[] param)
{
var dt = new DataTable();
NpgsqlConnection conn = UseSpecifiedConn ? NpgsqlConn : new NpgsqlConnection(ConnectionString);
using (var nda = new NpgsqlDataAdapter(sqlText, conn))
{
try
{
if (param != null)
{
SetParmDBNull(param);
nda.SelectCommand.Parameters.AddRange(param);
}
var ds = new DataSet();
nda.Fill(ds);
dt = ds.Tables[0];
}
catch (Exception ex)
{
Common.WriteLog.Error("查询数据库出错!查询语句:" + sqlText, ex);
}
finally
{
if (!UseSpecifiedConn)
{
conn.Dispose();
}
}
}
return dt;
}
2.2.2 返回 int
/// <summary>
/// 查询唯一值(用来查总记录数等等..)
/// </summary>
/// <param name="sqlText"></param>
/// <returns></returns>
public int QueryOnly(string sqlText)
{
NpgsqlConnection conn = UseSpecifiedConn ? NpgsqlConn : new NpgsqlConnection(ConnectionString);
try
{
if (conn.State != ConnectionState.Open)
{
conn.Open();
}
NpgsqlCommand objCommand = new NpgsqlCommand(sqlText, conn);
//结果集中的第一行第一列
int count = Convert.ToInt32(objCommand.ExecuteScalar());
return count;
}
catch (Exception e)
{
Console.WriteLine(e.Message);
return 0;
}
finally
{
if (!UseSpecifiedConn)
{
conn.Dispose();
}
}
}
3.2.3 查数据库实例
/// <summary>
/// 获取指定摄像头的标签
/// </summary>
/// <param name="cameraid">摄像头编码</param>
/// <returns></returns>
public DataTable SelectTag(string cameraid)
{
string sql = "select CameraID,TagName,TagLevel,TagLink,TagPTStr,TagDirection from Tag where CameraID=@CameraID";
NpgsqlParameter[] param = new NpgsqlParameter[1];
param[0] = new NpgsqlParameter("@CameraID", NpgsqlDbType.Text) { Value = cameraid };
return ExecuteQuery(sql, param);
}
/// <summary>
/// 获取 xxx
/// </summary>
/// <param name="cameraEncode"></param>
/// <returns></returns>
public List<Preset> SelectPresetBy(string cameraEncode)
{
var list = new List<Preset>();
try
{
if (string.IsNullOrEmpty(cameraEncode))
{
throw new Exception("cameraId 为空");
}
string selectSql = string.Format("select * from preset where cameraencode = '{0}' order by id asc", cameraEncode);
var dt = this.ExecuteQuery(selectSql);
list = DataTableToList<Preset>(dt).ToList();
}
catch (Exception ex)
{
Common.WriteLog.Error("查找预置位列表出错!", ex);
}
return list;
}
public int CheckPoliceSchedule(DateTime checktime)
{
int res = -1;
try
{
var sqlText = string.Format("select COUNT(*) sum from xx where endtime>to_timestamp('{1}','yyyy-MM-dd HH24:MI:SS')", checktime.ToString("yyyy-MM-dd HH:mm:ss"));
res = QueryOnly(sqlText);
}
catch (Exception ex)
{
Common.WriteLog.Error("xx出错!", ex);
}
return res;
}
4. 将 datatable 转成对象
/// <summary>
/// DataTable转换List,反射机制
/// </summary>
/// <param name="dt"></param>
/// <returns></returns>
public 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 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;
}
5. 事务
public class PostgreSqlDao
{
/// <summary>
/// 打开数据库连接
/// </summary>
/// <returns></returns>
public bool OpenConn()
{
try
{
if (NpgsqlConn.State == ConnectionState.Open)
{
return true;
}
else
{
NpgsqlConn.Open();
return NpgsqlConn.State == ConnectionState.Open;
}
}
catch (Exception ex)
{
Common.WriteLog.Error("打开数据库连接出错!", ex);
return false;
}
}
...
}
// 事务使用
public bool Transaction()
{
bool res = false;
PostgreSqlDao pg = new PostgreSqlDao(Common.ConnectString, true);
if (pg.OpenConn())
{
// 新建一个事务
var trans = pg.NpgsqlConn.BeginTransaction();
try
{
foreach (var x in XX)
{
// 执行数据写入操作
}
// 提交事务
trans.Commit();
res = true;
}
catch (Exception ex)
{
// 回滚事务
trans.Rollback();
}
finally
{
// 关闭连接
pg.CloseConn();
}
}
return res;
}
/// <summary>
/// 执行多条SQL语句,实现数据库事务。
/// </summary>
/// <param name="SQLStringList">多条SQL语句</param>
public bool ExecuteTransSQL(List<String> SQLStringList)
{
using (NpgsqlConnection conn = UseSpecifiedConn ? NpgsqlConn : new NpgsqlConnection(ConnectionString))
{
if (conn.State != ConnectionState.Open)
conn.Open();
NpgsqlCommand cmd = new NpgsqlCommand();
cmd.Connection = conn;
NpgsqlTransaction tx = conn.BeginTransaction();
cmd.Transaction = tx;
try
{
int count = 0;
for (int n = 0; n < SQLStringList.Count; n++)
{
string strsql = SQLStringList[n];
if (strsql.Trim().Length > 1)
{
cmd.CommandText = strsql;
count += cmd.ExecuteNonQuery();
}
}
tx.Commit();
return true;
}
catch (Exception ex)
{
tx.Rollback();
return false;
}
finally
{
if (!UseSpecifiedConn)
{
conn.Dispose();
}
}
}
}
C# 应用 - 封装类访问 Postgresql 数据库的更多相关文章
- C#访问postgresql数据库
最近开始做C#的DotNet的工作,因为对PostgreSQL数据库比较有兴趣,所以自己研究了一下如何访问PostgreSQL的 数据库的问题. 1.为了访问PostgreSQL数据库,需要从pgfo ...
- C/C++访问PostgreSQL数据库
编号:1011时间:2016年5月17日09:46:01功能:Windows环境下C/C++访问PostgreSQL数据库https://segmentfault.com/a/119000000062 ...
- Postgresql ODBC驱动,用sqlserver添加dblink跨库访问postgresql数据库
在同样是SQLserver数据库跨库访问时,只需要以下方法 declare @rowcount int set @rowcount =(select COUNT(*) from sys.servers ...
- C#访问PostGreSQL数据库的方法 http://www.jb51.net/article/35643.htm
这次的项目中的一个环节要求我把PostGreSQL数据取出来,然后放到SqlServer里,再去处理分析. http://www.jb51.net/article/35643.htm - 我对Post ...
- C# 应用 - 封装类访问 Mysql 数据库
个人经历的项目主要都是用 Postgresql 或 Oracle 数据库,本文非原创,从他处整理而来. 1. 库类 mysql.data.dll using MySql.Data.MySqlClien ...
- 通过unixODBC访问PostgreSQL数据库
磨砺技术珠矶,践行数据之道,追求卓越价值回到上一级页面:PostgreSQL基础知识与基本操作索引页 回到顶级页面:PostgreSQL索引页[作者 高健@博客园 luckyjackgao@g ...
- 使用libpqxx访问PostgreSQL数据库(mingw编译libpqxx)
编译前准备 1. 安装mingw 安装mingw(不管是直接安装mingw还是其他如code::blocks附带安装的mingw),输入:gcc -v可显示如下图的版本信息,我的版本是mingw ...
- C# 应用 - 封装类访问 Oracle 数据库
1. 引入库类 Oracle.ManagedDataAccess.dll using Oracle.ManagedDataAccess.Client; 2. 粗暴封装 namespace xx { p ...
- 将gitlab中的postgresql数据库开通远程访问
postgresql数据库是gitlab的一个配置数据库,记录gitlab的一些配置信息. 我们访问gitlab中的postgresql数据有本地命令行访问和远程可视化软件访问2种方式. (一)本地命 ...
随机推荐
- Base64 编码原理
什么是 Base64 编码 Base64 编码是最常见的编码方式,基于 64 个可打印字符来表示任意二进制数据的方法,是从二进制转换到可见字符的过程. 使用场景 数据加密或签名通过 Base64 转换 ...
- 14. 从0学ARM-exynos4412-看门狗裸机程序编写
看门狗 一.概念 看门狗的简称是WDT(Watch Dog Timer),exynos4412scp中的看门狗定时器(WDT)是一种定时装置. 1. 工作原理 由(一般需要客户编写)软件读写定时器相关 ...
- k8s二进制部署 - dashboard安装
配置资源清单rbac.yaml apiVersion: v1 kind: ServiceAccount metadata: labels: k8s-app: kubernetes-dashboard ...
- 弹性计算服务(Elastic Compute Service) / 云服务器 ECS
计费方式选择 多种可选择计算费用的方式,可以包年包月,按流量计费,按资源规格计费(本文第四点)等等 地域位置选择 地域:地域指的是 ECS 实例所在的物理位置 地域位置如何选择: 根据访问业务的用户比 ...
- 微软大楼设计方案(中等) 推公式+RMQ问题
近日,微软新大楼的设计方案正在广泛征集中,其中一种方案格外引人注目.在这个方案中,大楼由 nn 栋楼组成,这些楼从左至右连成一排,编号依次为 11 到 nn,其中第 ii 栋楼有 h_ihi层. ...
- Kotlin & Android & Swift & Flutter & React Native
Kotlin & Android https://www.runoob.com/kotlin/kotlin-tutorial.html Swift 5 & iOS 12 https:/ ...
- dynamic creat svg in js
dynamic creat svg in js SVG title https://developer.mozilla.org/en-US/docs/Web/SVG/Element/title < ...
- better-scroll使用参考
************better-scroll是基于父元素固定高度,溢出才滚动的,所以父元素务必定高,否则无法滚动***************************************** ...
- 倒计时2天!2021 NGK新加坡区块链峰会与你不见不散!
1月31日14时,NGK将于新加坡召开"2021 NGK新加坡区块链峰会",并将在全球开启同步直播. 据了解,本次峰会将汇聚全球二十多位顶尖区块链专家学者,与NGK灵石技术团队 ...
- MFC多文档程序启动无子窗口的实现
刚学MFC的我们,肯定会从一个基本MFC程序开始. 而VC++6.0的MFC基础类提供了三种创建方式:单文档.多文档.对话框. 当我们创建多文档应用程序的时候,会自动启动一个子窗口. 在我们平时使用软 ...