C#-操作PostgreSQL-数据库

2024-05-25 23:32

本文主要是介绍C#-操作PostgreSQL-数据库,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一、第三方类库

Npgsql提供 .NET 操作postgreSQL数据库的相关类。支持postgreSQL7.x 及以上版本。

二、自定义接口及操作类

2.1接口类

public interface IDBHelper{/// <summary>/// 执行 Transact-SQL 语句并返回受影响的行数。/// </summary>int ExecuteNonQuery(string connectionString, System.Data.CommandType cmdType, string cmdText, params System.Data.Common.DbParameter[] cmdParms);/// <summary>/// 在事务中执行 Transact-SQL 语句并返回受影响的行数。/// </summary>int ExecuteNonQuery(System.Data.Common.DbTransaction trans, System.Data.CommandType cmdType, string cmdText, params System.Data.Common.DbParameter[] cmdParms);/// <summary>/// 在事务中执行查询,返回DataSet/// </summary>DataSet ExecuteQuery(System.Data.Common.DbTransaction trans, System.Data.CommandType cmdType, string cmdText, params System.Data.Common.DbParameter[] cmdParms);/// <summary>/// 执行查询,返回DataSet/// </summary>DataSet ExecuteQuery(string connectionString, System.Data.CommandType cmdType, string cmdText, params System.Data.Common.DbParameter[] cmdParms);/// <summary>/// 在事务中执行查询,返回DataReader/// </summary>DbDataReader ExecuteReader(System.Data.Common.DbTransaction trans, System.Data.CommandType cmdType, string cmdText, params System.Data.Common.DbParameter[] cmdParms);/// <summary>/// 执行查询,返回DataReader/// </summary>DbDataReader ExecuteReader(string connectionString, System.Data.CommandType cmdType, string cmdText, params System.Data.Common.DbParameter[] cmdParms);/// <summary>/// 在事务中执行查询,并返回查询所返回的结果集中第一行的第一列。忽略其他列或行。/// </summary>object ExecuteScalar(System.Data.Common.DbTransaction trans, System.Data.CommandType cmdType, string cmdText, params System.Data.Common.DbParameter[] cmdParms);/// <summary>/// 执行查询,并返回查询所返回的结果集中第一行的第一列。忽略其他列或行。/// </summary>object ExecuteScalar(string connectionString, System.Data.CommandType cmdType, string cmdText, params System.Data.Common.DbParameter[] cmdParms);/// <summary>/// 得到数据条数/// </summary>/// <param name="tblName">表名</param>/// <param name="condition">条件(不需要where)</param>/// <returns>数据条数</returns>int GetCount(string connectionString, string tblName, string condition);}

2.2 操作类

/// <summary>/// 数据库操作基类(for PostgreSQL)/// </summary>public class PostgreHelper : IDBHelper{/// <summary>/// 得到数据条数/// </summary>public int GetCount(string connectionString, string tblName, string condition){StringBuilder sql = new StringBuilder("select count(*) from " + tblName);if (!string.IsNullOrEmpty(condition))sql.Append(" where " + condition);object count = ExecuteScalar(connectionString, CommandType.Text, sql.ToString(), null);return int.Parse(count.ToString());}/// <summary>/// 执行查询,返回DataSet/// </summary>public DataSet ExecuteQuery(string connectionString, CommandType cmdType, string cmdText,params DbParameter[] cmdParms){using (NpgsqlConnection conn = new NpgsqlConnection(connectionString)){using (NpgsqlCommand cmd = new NpgsqlCommand()){PrepareCommand(cmd, conn, null, cmdType, cmdText, cmdParms);using (NpgsqlDataAdapter da = new NpgsqlDataAdapter(cmd)){DataSet ds = new DataSet();da.Fill(ds, "ds");cmd.Parameters.Clear();return ds;}}}}/// <summary>/// 在事务中执行查询,返回DataSet/// </summary>public DataSet ExecuteQuery(DbTransaction trans, CommandType cmdType, string cmdText,params DbParameter[] cmdParms){NpgsqlCommand cmd = new NpgsqlCommand();PrepareCommand(cmd, trans.Connection, trans, cmdType, cmdText, cmdParms);NpgsqlDataAdapter da = new NpgsqlDataAdapter(cmd);DataSet ds = new DataSet();da.Fill(ds, "ds");cmd.Parameters.Clear();return ds;}/// <summary>/// 执行 Transact-SQL 语句并返回受影响的行数。/// </summary>public int ExecuteNonQuery(string connectionString, CommandType cmdType, string cmdText,params DbParameter[] cmdParms){NpgsqlCommand cmd = new NpgsqlCommand();using (NpgsqlConnection conn = new NpgsqlConnection(connectionString)){PrepareCommand(cmd, conn, null, cmdType, cmdText, cmdParms);int val = cmd.ExecuteNonQuery();cmd.Parameters.Clear();return val;}}/// <summary>/// 在事务中执行 Transact-SQL 语句并返回受影响的行数。/// </summary>public int ExecuteNonQuery(DbTransaction trans, CommandType cmdType, string cmdText,params DbParameter[] cmdParms){NpgsqlCommand cmd = new NpgsqlCommand();PrepareCommand(cmd, trans.Connection, trans, cmdType, cmdText, cmdParms);int val = cmd.ExecuteNonQuery();cmd.Parameters.Clear();return val;}/// <summary>/// 执行查询,返回DataReader/// </summary>public DbDataReader ExecuteReader(string connectionString, CommandType cmdType, string cmdText,params DbParameter[] cmdParms){NpgsqlCommand cmd = new NpgsqlCommand();NpgsqlConnection conn = new NpgsqlConnection(connectionString);try{PrepareCommand(cmd, conn, null, cmdType, cmdText, cmdParms);NpgsqlDataReader rdr = cmd.ExecuteReader(CommandBehavior.CloseConnection);cmd.Parameters.Clear();return rdr;}catch{conn.Close();throw;}}/// <summary>/// 在事务中执行查询,返回DataReader/// </summary>public DbDataReader ExecuteReader(DbTransaction trans, CommandType cmdType, string cmdText,params DbParameter[] cmdParms){NpgsqlCommand cmd = new NpgsqlCommand();PrepareCommand(cmd, trans.Connection, trans, cmdType, cmdText, cmdParms);NpgsqlDataReader rdr = cmd.ExecuteReader(CommandBehavior.CloseConnection);cmd.Parameters.Clear();return rdr;}/// <summary>/// 执行查询,并返回查询所返回的结果集中第一行的第一列。忽略其他列或行。/// </summary>public object ExecuteScalar(string connectionString, CommandType cmdType, string cmdText,params DbParameter[] cmdParms){NpgsqlCommand cmd = new NpgsqlCommand();using (NpgsqlConnection connection = new NpgsqlConnection(connectionString)){PrepareCommand(cmd, connection, null, cmdType, cmdText, cmdParms);object val = cmd.ExecuteScalar();cmd.Parameters.Clear();return val;}}/// <summary>/// 在事务中执行查询,并返回查询所返回的结果集中第一行的第一列。忽略其他列或行。/// </summary>public object ExecuteScalar(DbTransaction trans, CommandType cmdType, string cmdText,params DbParameter[] cmdParms){NpgsqlCommand cmd = new NpgsqlCommand();PrepareCommand(cmd, trans.Connection, trans, cmdType, cmdText, cmdParms);object val = cmd.ExecuteScalar();cmd.Parameters.Clear();return val;}/// <summary>/// 生成要执行的命令/// </summary>/// <remarks>参数的格式:冒号+参数名</remarks>private static void PrepareCommand(DbCommand cmd, DbConnection conn, DbTransaction trans, CommandType cmdType,string cmdText, DbParameter[] cmdParms){if (conn.State != ConnectionState.Open)conn.Open();cmd.Connection = conn;cmd.CommandText = cmdText.Replace("@", ":").Replace("?", ":").Replace("[", "\"").Replace("]", "\"");if (trans != null)cmd.Transaction = trans;cmd.CommandType = cmdType;if (cmdParms != null){foreach (NpgsqlParameter parm in cmdParms){parm.ParameterName = parm.ParameterName.Replace("@", ":").Replace("?",":");cmd.Parameters.Add(parm);}}}}

三、数据库操作实例

写入实例:

IDBHelper dbHelper = new PostgreHelper();
string connectionString = "User ID=postgres;Password=admin;Server=192.168.0.226;Port=5432;Database=MonitorDB;";
string sql = "insert into [RawLog]([ProjectID],[File],[Note]) values('项目编号',@file,'备注')";string file = this.textBox1.Text;
if (!File.Exists(file)) return;//获取文件二进制流
System.IO.FileStream fs = new System.IO.FileStream(file, System.IO.FileMode.Open);
BinaryReader br = new BinaryReader(fs);
byte[] b = br.ReadBytes((int)fs.Length);
br.Close();fs.Close();int r = dbHelper.ExecuteNonQuery(connectionString, CommandType.Text,sql,new Npgsql.NpgsqlParameter("@file",raw_log.File));

注意:

1.查询语句中表名、字段名需用中括号[ ] 封起来,在操作类中会统一替换为双引号。

2.命令语句中的参数名格式为:@或?+ 参数名,在操作类中为统一替换为冒号。

3.对于二进制流、日期等特殊类型需采用2中的参数形式

4.经多次测试postgreSQL数据库只直接支持(冒号+参数名)的参数方式


这篇关于C#-操作PostgreSQL-数据库的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1002921

相关文章

Linux下MySQL数据库定时备份脚本与Crontab配置教学

《Linux下MySQL数据库定时备份脚本与Crontab配置教学》在生产环境中,数据库是核心资产之一,定期备份数据库可以有效防止意外数据丢失,本文将分享一份MySQL定时备份脚本,并讲解如何通过cr... 目录备份脚本详解脚本功能说明授权与可执行权限使用 Crontab 定时执行编辑 Crontab添加定

C#使用Spire.Doc for .NET实现HTML转Word的高效方案

《C#使用Spire.Docfor.NET实现HTML转Word的高效方案》在Web开发中,HTML内容的生成与处理是高频需求,然而,当用户需要将HTML页面或动态生成的HTML字符串转换为Wor... 目录引言一、html转Word的典型场景与挑战二、用 Spire.Doc 实现 HTML 转 Word1

C#实现一键批量合并PDF文档

《C#实现一键批量合并PDF文档》这篇文章主要为大家详细介绍了如何使用C#实现一键批量合并PDF文档功能,文中的示例代码简洁易懂,感兴趣的小伙伴可以跟随小编一起学习一下... 目录前言效果展示功能实现1、添加文件2、文件分组(书签)3、定义页码范围4、自定义显示5、定义页面尺寸6、PDF批量合并7、其他方法

Java实现在Word文档中添加文本水印和图片水印的操作指南

《Java实现在Word文档中添加文本水印和图片水印的操作指南》在当今数字时代,文档的自动化处理与安全防护变得尤为重要,无论是为了保护版权、推广品牌,还是为了在文档中加入特定的标识,为Word文档添加... 目录引言Spire.Doc for Java:高效Word文档处理的利器代码实战:使用Java为Wo

C#下Newtonsoft.Json的具体使用

《C#下Newtonsoft.Json的具体使用》Newtonsoft.Json是一个非常流行的C#JSON序列化和反序列化库,它可以方便地将C#对象转换为JSON格式,或者将JSON数据解析为C#对... 目录安装 Newtonsoft.json基本用法1. 序列化 C# 对象为 JSON2. 反序列化

如何通过try-catch判断数据库唯一键字段是否重复

《如何通过try-catch判断数据库唯一键字段是否重复》在MyBatis+MySQL中,通过try-catch捕获唯一约束异常可避免重复数据查询,优点是减少数据库交互、提升并发安全,缺点是异常处理开... 目录1、原理2、怎么理解“异常走的是数据库错误路径,开销比普通逻辑分支稍高”?1. 普通逻辑分支 v

Python与MySQL实现数据库实时同步的详细步骤

《Python与MySQL实现数据库实时同步的详细步骤》在日常开发中,数据同步是一项常见的需求,本篇文章将使用Python和MySQL来实现数据库实时同步,我们将围绕数据变更捕获、数据处理和数据写入这... 目录前言摘要概述:数据同步方案1. 基本思路2. mysql Binlog 简介实现步骤与代码示例1

C#文件复制异常:"未能找到文件"的解决方案与预防措施

《C#文件复制异常:未能找到文件的解决方案与预防措施》在C#开发中,文件操作是基础中的基础,但有时最基础的File.Copy()方法也会抛出令人困惑的异常,当targetFilePath设置为D:2... 目录一个看似简单的文件操作问题问题重现与错误分析错误代码示例错误信息根本原因分析全面解决方案1. 确保

sysmain服务可以禁用吗? 电脑sysmain服务关闭后的影响与操作指南

《sysmain服务可以禁用吗?电脑sysmain服务关闭后的影响与操作指南》在Windows系统中,SysMain服务(原名Superfetch)作为一个旨在提升系统性能的关键组件,一直备受用户关... 在使用 Windows 系统时,有时候真有点像在「开盲盒」。全新安装系统后的「默认设置」,往往并不尽编

基于C#实现PDF转图片的详细教程

《基于C#实现PDF转图片的详细教程》在数字化办公场景中,PDF文件的可视化处理需求日益增长,本文将围绕Spire.PDFfor.NET这一工具,详解如何通过C#将PDF转换为JPG、PNG等主流图片... 目录引言一、组件部署二、快速入门:PDF 转图片的核心 C# 代码三、分辨率设置 - 清晰度的决定因