【笔记】.NET开发环境下使用PostgreSQL+Oracle_fdw 实现两个数据库之间数据交互操作(二)
一 新的可视化工具
因为前文所提到的,看不到外部服务器和外部表的问题,我更换了可视化工具。
好用的新工具PostgreSQL Maestro!
当然如此好用的工具不是免费的,如果想免费使用还请自己去找,本文不提供此类下载。
1.1 这里发现的问题是,postgreSql查询的字段如果是大写,那必须要加双引号,不然无法查询到该字段,例如:
表a字段名为大写的ID,NAME,TYPE,REMARK,
查询
- select ID,NAME,TYPE,REMARK from a
是会说没有ID这个字段的,
要改为
- select "ID","NAME","TYPE","REMARK" from a
才可以正常执行。所以建议外部表可以把字段名改为全小写。但在使用全小写字段时,语句字段使用大写不加双引号却是可以执行的!运行创建表字段的脚本时,字段大写但不加双引号,添加的字段名会是全小写!还真挺绕的。
1.2还有一个问题是,在执行为字段添加注释的脚本时,由于是中文,在PostgreSQL Maestro工具中某些中文会引起报错。
而在pgAdmin中执行就没有问题,也是有点神奇的现象。初步推测是PostgreSQL Maestro编码的问题,有待以后研究考证。
二 在.NET项目中访问postgreSql数据库
2.1 第三方类库
Npgsql提供 .NET 操作postgreSQL数据库的相关类。支持postgreSQL7.x 及以上版本。
2.2 PostgreSQLHelper类
综合了网上其大佬的一些写法,再模仿oracle已经写好的helper文件,自己简单写了一些常用的访问数据库方法。如下:
- public static string connectionString = PubConstant.PgConnectionString;//获得配置文件中的链接字符串
- public MyDbHelperPgsql()
- {
- }
- /// <summary>
- /// 执行SQL语句,返回查询的唯一值记录
- /// </summary>
- /// <param name="SQLString">SQL语句</param>
- /// <returns>查询的唯一值记录</returns>
- public static int ExecuteSql(string SQLString)
- {
- using (NpgsqlConnection conn = new NpgsqlConnection(connectionString))
- {
- try
- {
- conn.Open();
- NpgsqlCommand objCommand = new NpgsqlCommand(SQLString, conn);
- int count = Convert.ToInt32(objCommand.ExecuteScalar());
- return count;
- }
- finally
- {
- conn.Close();
- }
- }
- }
- /// <summary>
- /// 执行SQL语句,返回影响的记录数
- /// </summary>
- /// <param name="SQLString">SQL语句</param>
- /// <returns>返回影响的记录数</returns>
- public static int ExecuteNonQuery(string SQLString)
- {
- NpgsqlCommand cmd = new NpgsqlCommand();
- using (NpgsqlConnection conn = new NpgsqlConnection(connectionString))
- {
- PrepareCommand(cmd, conn, null, SQLString, null);
- int val = cmd.ExecuteNonQuery();
- cmd.Parameters.Clear();
- return val;
- }
- }
- /// <summary>
- /// 在事务中执行 Transact-SQL 语句并返回受影响的行数。
- /// </summary>
- public static int ExecuteNonQuery(string cmdText,params DbParameter[] cmdParms)
- {
- using (NpgsqlConnection conn = new NpgsqlConnection(connectionString))
- {
- try
- {
- conn.Open();
- NpgsqlCommand cmd = new NpgsqlCommand();
- cmd.Connection = conn;
- NpgsqlTransaction tx = conn.BeginTransaction();
- cmd.Transaction = tx;
- PrepareCommand(cmd, tx.Connection, tx, cmdText, cmdParms);
- int val = cmd.ExecuteNonQuery();
- cmd.Parameters.Clear();
- return val;
- }
- finally
- {
- conn.Close();
- }
- }
- }
- /// <summary>
- /// 执行查询语句,返回DataSet
- /// </summary>
- /// <param name="SQLString">查询语句</param>
- /// <returns>DataSet</returns>
- public static DataSet Query(string SQLString)
- {
- using (NpgsqlConnection conn = new NpgsqlConnection(connectionString))
- {
- DataSet ds = new DataSet();
- try
- {
- conn.Open();
- using (NpgsqlCommand command = new NpgsqlCommand(SQLString, conn))
- {
- using (NpgsqlDataAdapter da = new NpgsqlDataAdapter(command))
- {
- da.Fill(ds, "ds");
- return ds;
- }
- }
- }
- finally
- {
- conn.Close();
- }
- }
- }
- /// <summary>
- /// 执行查询语句,返回DataSet
- /// </summary>
- /// <param name="cmdText">查询语句</param>
- /// <param name="cmdParms">参数</param>
- /// <returns>DataSet</returns>
- public static DataSet ExecuteQuery(string cmdText, params DbParameter[] cmdParms)
- {
- using (NpgsqlConnection conn = new NpgsqlConnection(connectionString))
- {
- using (NpgsqlCommand cmd = new NpgsqlCommand())
- {
- PrepareCommand(cmd, conn, null, cmdText, cmdParms);
- using (NpgsqlDataAdapter da = new NpgsqlDataAdapter(cmd))
- {
- DataSet ds = new DataSet();
- da.Fill(ds, "ds");
- cmd.Parameters.Clear();
- return ds;
- }
- }
- }
- }
- /// <summary>
- /// 生成要执行的命令
- /// </summary>
- /// <remarks>参数的格式:冒号+参数名</remarks>
- private static void PrepareCommand(DbCommand cmd, DbConnection conn, DbTransaction trans, 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 = CommandType.Text;
- if (cmdParms != null)
- {
- foreach (NpgsqlParameter parm in cmdParms)
- {
- parm.ParameterName = parm.ParameterName.Replace("@", ":").Replace("?", ":");
- cmd.Parameters.Add(parm);
- }
- }
- }
Web.config中设置sql链接
- <add key="PgConnectionString" value="Server=192.xxx.xxx.xxx;Port=5432;User Id=用户名;Password=密码;Database=数据库名;"/>
其中事务的用法还没有研究明白,NpgsqlTransaction 还没有弄懂要怎么使用。以后将补充。
三 远程连接postgreSql数据库
之前提到的,整个系统调通后,要把数据库迁移到服务器上。这时本机访问远程数据库就要在服务器上进行一系列配置了。
作者:
JerryAndTom
链接:https://www.imooc.com/article/12444
来源:慕课网
作者:
JerryAndTom
链接:https://www.imooc.com/article/12444
来源:慕课网
在\PostgreSQL\data 找到配置文件pg_hba.conf,修改如下:
- # IPv4 local connections:
- host all all 127.0.0.1/32 md5
- host all all 192.xxx.xxx.1/24 md5
- # IPv6 local connections:
- #host all all ::1/128 md5
- # Allow replication connections from localhost, by a user with the
- # replication privilege.
- #host replication postgres 127.0.0.1/32 md5
- #host replication postgres ::1/128 md5
添加红色部分,xxx是自己所需要允许访问的ip段。
作者:
JerryAndTom
链接:https://www.imooc.com/article/12444
来源:慕课网
作者:
JerryAndTom
链接:https://www.imooc.com/article/12444
来源:慕课网
【笔记】.NET开发环境下使用PostgreSQL+Oracle_fdw 实现两个数据库之间数据交互操作(二)的更多相关文章
- 【应用笔记】【AN001】VC#开发环境下基于以太网的4-20mA电流采集(基于modbus tcp 协议)
版本:第一版 作者:毛鹏 杨帅 日期:20151108 简介 4-20mA电流环具有广泛的应用前景,在许多行业中都发挥着重要作用.本文主要介绍了以太网接口的4-20mA电流采集模块在VC#环境下进行温 ...
- 【应用笔记】【AN005】Qt开发环境下基于RS485的4-20mA电流采集
简介 4-20mA电流环具有广泛的应用前景,在许多行业中都发挥着重要作用.本文主要介绍在Qt开发环境下基于RS485实现4-20mA电流采集,实现WINDOWS平台对数据的采集.分析及显示. 系统组成 ...
- Django:学习笔记(1)——开发环境配置
Django:学习笔记(1)——开发环境配置 Django的安装与配置 安装Django 首先,我们可以执行python -m django --version命令,查看是否已安装django. 如果 ...
- iOS系统提供开发环境下命令行编译工具:xcodebuild
iOS系统提供开发环境下命令行编译工具:xcodebuild[3] xcodebuild 在介绍xcodebuild之前,需要先弄清楚一些在XCode环境下的一些概念[4]: Workspace:简单 ...
- Ubuntu 12.04环境下配置Postgresql和phppgadmin
Ubuntu 12.04环境下配置Postgresql 9.1 和phppgadmin 本系列文章由ex_net(张建波)编写,转载请注明出处. http://blog.csdn.net/zjianb ...
- [评测]低配环境下,PostgresQL和Mysql读写性能简单对比(欢迎大家提出Mysql优化意见)
[评测]低配环境下,PostgresQL和Mysql读写性能简单对比 原文链接:https://www.cnblogs.com/blog5277/p/10658426.html 原文作者:博客园--曲 ...
- spark最新源码下载并导入到开发环境下助推高质量代码(Scala IDEA for Eclipse和IntelliJ IDEA皆适用)(以spark2.2.0源码包为例)(图文详解)
不多说,直接上干货! 前言 其实啊,无论你是初学者还是具备了有一定spark编程经验,都需要对spark源码足够重视起来. 本人,肺腑之己见,想要成为大数据的大牛和顶尖专家,多结合源码和操练编程. ...
- angular 4 开发环境下打包文件过大
angular 4本地开发环境下,ng server -- port 8080 -o 之后在在浏览器中查看数据请求,其中vendor.bundle.js有8.3mb,而整个传输数据大小为16.3mb ...
- jdk1.8源码包下载并导入到开发环境下助推高质量代码(Eclipse、MyEclipse和Scala IDEA for Eclipse皆适用)(图文详解)
不多说,直接上干货! jdk1.8 源码, Linux的同学可以用的上. 由于源码JDK是前版本的超集, 所以1.4, 1.5, 1.6, 1.7都可以用的上. 其实大家安装的jdk路径下,这 ...
随机推荐
- time 与 datetime 模块的常用方法
时间格式 一个名词: UTC(Coordinated Universal Time):格林威治天文时,世界标准时间.中国为东八区 UTC+8 在编程的世界中,一定要了解的几种时间格式: 1.时间戳 从 ...
- android使用smack实现简单登录功能
android端采用xmpp协议实现即时通讯,在最开始的登录功能就遇到了不少障碍.首先在官网(https://www.igniterealtime.org/projects/openfire/)下载o ...
- WDA基础十五:POPUP WINDOW
1.组件控制器定义属性: 2.实现popup方法: METHOD stock_popup . DATA: l_cmp_api TYPE REF TO if_wd_component, l_window ...
- python 几分钟前,几小时前,几天前转为时间戳
一开始我是这么做的 import time import datetime def conv_time(t): min = re.findall('\d+', t)[0] if u'分钟' in t: ...
- EasyUI的textbox的disable ,readonly 用法
EasyUI的textbox,如果用了disable, 那么提交时,后台mvc controller是取不到值的, 如果用了Readonly, textbox的样式又没有变化, 让人一眼就感知到哪些是 ...
- python3安装docx模块出现Import Error: No module named 'exceptions'
x首先 pip3 install docx 显示已经安装,但是 No module named 'exceptions' 网上查的资料命令行下载的docx安装包还没有完全兼容python3,第三方库应 ...
- spark streamingcontext
一个StreamingContext定义之后,必须做以下几件事情:1.通过创建输入DStream来创建输入数据源.2.通过对DStream定义transformation和output算子操作,来定义 ...
- python day1 之三级菜单的正确姿势
看了几个同学有关三级菜单的实现,都是通过一级一级输出,是较为过程的实现.另外如果菜单(树形结构)更多级这样处理起来就比较麻烦了. 可以使用python强大的列表和字典,实现的更优美或简洁一些: 注:复 ...
- C# WPF上位机实现和下位机TCP通讯
下位机使用北京大华程控电源DH1766-1,上位机使用WPF.实现了电压电流实时采集,曲线显示.上午在公司调试成功,手头没有程控电源,使用TCP服务端模拟.昨天写的TCP服务端正好排上用场. 界面如下 ...
- mysql密码遗失
仅以本地数据库测试 本地数据库密码遗失,百度上的方法很麻烦,想着没有用的一个本地库(localhost),就想删库重建,navicat上点击数据库,删除链接.然后在新建库,同名同端口的,此时密码已经制 ...