C# 操作PostgreSQL 数据库的示例代码
什么是PostgreSQL?
PostgreSQL是一个功能强大的开源对象关系数据库管理系统(ORDBMS)。用于安全地存储数据;支持最佳做法,并允许在处理请求时检索它们。
PostgreSQL(也称为Post-gress-Q-L)由PostgreSQL全球开发集团(全球志愿者团队)开发。它不受任何公司或其他私人实体控制。它是开源的,其源代码是免费提供的。
PostgreSQL是跨平台的,可以在许多操作系统上运行,如Linux,FreeBSD,OSX,Solaris和MicrosoftWindows等。
PostgreSQL的特点如下
- PostgreSQL可在所有主要操作系统(即Linux,UNIX(AIX,BSD,HP-UX,SGIIRIX,MacOSX,Solaris,Tru64)和Windows等)上运行。
- PostgreSQL支持文本,图像,声音和视频,并包括用于C/C++,Java,Perl,Python,Ruby,Tcl和开放数据库连接(ODBC)的编程接口。
- PostgreSQL支持SQL的许多功能,例如复杂SQL查询,SQL子选择,外键,触发器,视图,事务,多进程并发控制(MVCC),流式复制(9.0),热备(9.0))。
- 在PostgreSQL中,表可以设置为从“父”表继承其特征。
- 可以安装多个扩展以向PostgreSQL添加附加功能。
PostgreSQL工具
有一些开放源码以及付费工具可用作PostgreSQL的前端工具。这里列出几个被广泛使用的工具:
1.psql:
它是一个命令行工具,也是管理PostgreSQL的主要工具。
pgAdmin是PostgreSQL的免费开源图形用户界面管理工具。
2.phpPgAdmin:
它是用PHP编写的PostgreSQL的基于Web的管理工具。它基于phpMyAdmin工具管理MySQL功能来开发。它可以用作PostgreSQL的前端工具。
3.pgFouine:
它是一个日志分析器,可以从PostgreSQL日志文件创建报告。专有工具有-
LightningAdminforPostgreSQL,BorlandKylix,DBOne,DBToolsManagerPgManager,Rekall,DataArchitect,SyBasePowerDesigner,MicrosoftAccess,eRWin,DeZignforDatabases,PGExplorer,CaseStudio2,pgEdit,RazorSQL,MicroOLAPDatabaseDesigner,AquaDataStudio,Tuples,EMSDatabaseManagementToolsforPostgreSQL,Navicat,SQLMaestroGroupproductsforPostgreSQL,DatanamicDataDiffforPostgreSQL,DatanamicSchemaDiffforPostgreSQL,DBMultiRunPostgreSQLEdition,SQLPro,SQLImageViewer,SQLDataSets等等。
Npgsql
提供.NET操作postgreSQL数据库的相关类。支持postgreSQL7.x及以上版本。
自定义接口及操作类
接口类
publicinterfaceIDBHelper { //////执行Transact-SQL语句并返回受影响的行数。 /// intExecuteNonQuery(stringconnectionString,System.Data.CommandTypecmdType,stringcmdText,paramsSystem.Data.Common.DbParameter[]cmdParms); //////在事务中执行Transact-SQL语句并返回受影响的行数。 /// intExecuteNonQuery(System.Data.Common.DbTransactiontrans,System.Data.CommandTypecmdType,stringcmdText,paramsSystem.Data.Common.DbParameter[]cmdParms); //////在事务中执行查询,返回DataSet /// DataSetExecuteQuery(System.Data.Common.DbTransactiontrans,System.Data.CommandTypecmdType,stringcmdText,paramsSystem.Data.Common.DbParameter[]cmdParms); //////执行查询,返回DataSet /// DataSetExecuteQuery(stringconnectionString,System.Data.CommandTypecmdType,stringcmdText,paramsSystem.Data.Common.DbParameter[]cmdParms); //////在事务中执行查询,返回DataReader /// DbDataReaderExecuteReader(System.Data.Common.DbTransactiontrans,System.Data.CommandTypecmdType,stringcmdText,paramsSystem.Data.Common.DbParameter[]cmdParms); //////执行查询,返回DataReader /// DbDataReaderExecuteReader(stringconnectionString,System.Data.CommandTypecmdType,stringcmdText,paramsSystem.Data.Common.DbParameter[]cmdParms); //////在事务中执行查询,并返回查询所返回的结果集中第一行的第一列。忽略其他列或行。 /// objectExecuteScalar(System.Data.Common.DbTransactiontrans,System.Data.CommandTypecmdType,stringcmdText,paramsSystem.Data.Common.DbParameter[]cmdParms); //////执行查询,并返回查询所返回的结果集中第一行的第一列。忽略其他列或行。 /// objectExecuteScalar(stringconnectionString,System.Data.CommandTypecmdType,stringcmdText,paramsSystem.Data.Common.DbParameter[]cmdParms); //////得到数据条数 /// ///表名 /// 条件(不需要where) /// 数据条数 intGetCount(stringconnectionString,stringtblName,stringcondition); }
操作类
//////数据库操作基类(forPostgreSQL) /// publicclassPostgreHelper:IDBHelper { //////得到数据条数 /// publicintGetCount(stringconnectionString,stringtblName,stringcondition) { StringBuildersql=newStringBuilder("selectcount(*)from"+tblName); if(!string.IsNullOrEmpty(condition)) sql.Append("where"+condition); objectcount=ExecuteScalar(connectionString,CommandType.Text,sql.ToString(),null); returnint.Parse(count.ToString()); } //////执行查询,返回DataSet /// publicDataSetExecuteQuery(stringconnectionString,CommandTypecmdType,stringcmdText, paramsDbParameter[]cmdParms) { using(NpgsqlConnectionconn=newNpgsqlConnection(connectionString)) { using(NpgsqlCommandcmd=newNpgsqlCommand()) { PrepareCommand(cmd,conn,null,cmdType,cmdText,cmdParms); using(NpgsqlDataAdapterda=newNpgsqlDataAdapter(cmd)) { DataSetds=newDataSet(); da.Fill(ds,"ds"); cmd.Parameters.Clear(); returnds; } } } } //////在事务中执行查询,返回DataSet /// publicDataSetExecuteQuery(DbTransactiontrans,CommandTypecmdType,stringcmdText, paramsDbParameter[]cmdParms) { NpgsqlCommandcmd=newNpgsqlCommand(); PrepareCommand(cmd,trans.Connection,trans,cmdType,cmdText,cmdParms); NpgsqlDataAdapterda=newNpgsqlDataAdapter(cmd); DataSetds=newDataSet(); da.Fill(ds,"ds"); cmd.Parameters.Clear(); returnds; } //////执行Transact-SQL语句并返回受影响的行数。 /// publicintExecuteNonQuery(stringconnectionString,CommandTypecmdType,stringcmdText, paramsDbParameter[]cmdParms) { NpgsqlCommandcmd=newNpgsqlCommand(); using(NpgsqlConnectionconn=newNpgsqlConnection(connectionString)) { PrepareCommand(cmd,conn,null,cmdType,cmdText,cmdParms); intval=cmd.ExecuteNonQuery(); cmd.Parameters.Clear(); returnval; } } //////在事务中执行Transact-SQL语句并返回受影响的行数。 /// publicintExecuteNonQuery(DbTransactiontrans,CommandTypecmdType,stringcmdText, paramsDbParameter[]cmdParms) { NpgsqlCommandcmd=newNpgsqlCommand(); PrepareCommand(cmd,trans.Connection,trans,cmdType,cmdText,cmdParms); intval=cmd.ExecuteNonQuery(); cmd.Parameters.Clear(); returnval; } //////执行查询,返回DataReader /// publicDbDataReaderExecuteReader(stringconnectionString,CommandTypecmdType,stringcmdText, paramsDbParameter[]cmdParms) { NpgsqlCommandcmd=newNpgsqlCommand(); NpgsqlConnectionconn=newNpgsqlConnection(connectionString); try { PrepareCommand(cmd,conn,null,cmdType,cmdText,cmdParms); NpgsqlDataReaderrdr=cmd.ExecuteReader(CommandBehavior.CloseConnection); cmd.Parameters.Clear(); returnrdr; } catch { conn.Close(); throw; } } //////在事务中执行查询,返回DataReader /// publicDbDataReaderExecuteReader(DbTransactiontrans,CommandTypecmdType,stringcmdText, paramsDbParameter[]cmdParms) { NpgsqlCommandcmd=newNpgsqlCommand(); PrepareCommand(cmd,trans.Connection,trans,cmdType,cmdText,cmdParms); NpgsqlDataReaderrdr=cmd.ExecuteReader(CommandBehavior.CloseConnection); cmd.Parameters.Clear(); returnrdr; } //////执行查询,并返回查询所返回的结果集中第一行的第一列。忽略其他列或行。 /// publicobjectExecuteScalar(stringconnectionString,CommandTypecmdType,stringcmdText, paramsDbParameter[]cmdParms) { NpgsqlCommandcmd=newNpgsqlCommand(); using(NpgsqlConnectionconnection=newNpgsqlConnection(connectionString)) { PrepareCommand(cmd,connection,null,cmdType,cmdText,cmdParms); objectval=cmd.ExecuteScalar(); cmd.Parameters.Clear(); returnval; } } //////在事务中执行查询,并返回查询所返回的结果集中第一行的第一列。忽略其他列或行。 /// publicobjectExecuteScalar(DbTransactiontrans,CommandTypecmdType,stringcmdText, paramsDbParameter[]cmdParms) { NpgsqlCommandcmd=newNpgsqlCommand(); PrepareCommand(cmd,trans.Connection,trans,cmdType,cmdText,cmdParms); objectval=cmd.ExecuteScalar(); cmd.Parameters.Clear(); returnval; } //////生成要执行的命令 /// ///参数的格式:冒号+参数名 privatestaticvoidPrepareCommand(DbCommandcmd,DbConnectionconn,DbTransactiontrans,CommandTypecmdType, stringcmdText,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(NpgsqlParameterparmincmdParms) { parm.ParameterName=parm.ParameterName.Replace("@",":").Replace("?",":"); cmd.Parameters.Add(parm); } } } }
数据库操作实例
写入实例:
IDBHelperdbHelper=newPostgreHelper(); stringconnectionString="UserID=postgres;Password=admin;Server=192.168.0.226;Port=5432;Database=MonitorDB;"; stringsql="insertinto[RawLog]([ProjectID],[File],[Note])values('项目编号',@file,'备注')"; stringfile=this.textBox1.Text; if(!File.Exists(file))return; //获取文件二进制流 System.IO.FileStreamfs=newSystem.IO.FileStream(file,System.IO.FileMode.Open); BinaryReaderbr=newBinaryReader(fs); byte[]b=br.ReadBytes((int)fs.Length); br.Close();fs.Close(); intr=dbHelper.ExecuteNonQuery(connectionString,CommandType.Text,sql,newNpgsql.NpgsqlParameter("@file",raw_log.File));
注意:
1.查询语句中表名、字段名需用中括号[]封起来,在操作类中会统一替换为双引号。
2.命令语句中的参数名格式为:@或?+参数名,在操作类中为统一替换为冒号。
3.对于二进制流、日期等特殊类型需采用2中的参数形式
4.经多次测试postgreSQL数据库只直接支持(冒号+参数名)的参数方式
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。