一 新的可视化工具

    因为前文所提到的,看不到外部服务器和外部表的问题,我更换了可视化工具。

    好用的新工具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文件,自己简单写了一些常用的访问数据库方法。如下:

 

  1  public static string connectionString = PubConstant.PgConnectionString;//获得配置文件中的链接字符串
  2         public MyDbHelperPgsql()
  3         {            
  4         } 
  5 
  6         /// <summary>
  7         /// 执行SQL语句,返回查询的唯一值记录
  8         /// </summary>
  9         /// <param name="SQLString">SQL语句</param>
 10         /// <returns>查询的唯一值记录</returns>
 11         public static int ExecuteSql(string SQLString)
 12         {
 13             using (NpgsqlConnection conn = new NpgsqlConnection(connectionString))
 14             {
 15                 try
 16                 {
 17                     conn.Open();
 18                     NpgsqlCommand objCommand = new NpgsqlCommand(SQLString, conn);
 19                     int count = Convert.ToInt32(objCommand.ExecuteScalar());
 20                     return count;
 21                 }
 22                 finally
 23                 {
 24                     conn.Close();
 25                 }
 26             }
 27         }
 28 
 29         /// <summary>
 30         /// 执行SQL语句,返回影响的记录数
 31         /// </summary>
 32         /// <param name="SQLString">SQL语句</param>
 33         /// <returns>返回影响的记录数</returns>
 34         public static int ExecuteNonQuery(string SQLString)
 35         {
 36 
 37             NpgsqlCommand cmd = new NpgsqlCommand();
 38 
 39             using (NpgsqlConnection conn = new NpgsqlConnection(connectionString))
 40             {
 41                 PrepareCommand(cmd, conn, null, SQLString, null);
 42                 int val = cmd.ExecuteNonQuery();
 43                 cmd.Parameters.Clear();
 44                 return val;
 45             }  
 46         }
 47 
 48         /// <summary>  
 49         /// 在事务中执行 Transact-SQL 语句并返回受影响的行数。  
 50         /// </summary>  
 51         public static int ExecuteNonQuery(string cmdText,params DbParameter[] cmdParms)
 52         {
 53             
 54             using (NpgsqlConnection conn = new NpgsqlConnection(connectionString))
 55             {
 56                 try
 57                 {
 58                     conn.Open();
 59                     NpgsqlCommand cmd = new NpgsqlCommand();
 60                     cmd.Connection = conn;
 61                     NpgsqlTransaction tx = conn.BeginTransaction();
 62                     cmd.Transaction = tx;
 63                     PrepareCommand(cmd, tx.Connection, tx, cmdText, cmdParms);
 64                     int val = cmd.ExecuteNonQuery();
 65                     cmd.Parameters.Clear();
 66                     return val;
 67                 }
 68                 finally
 69                 {
 70                     conn.Close();
 71                 }
 72             }
 73         }  
 74 
 75         /// <summary>
 76         /// 执行查询语句,返回DataSet
 77         /// </summary>
 78         /// <param name="SQLString">查询语句</param>
 79         /// <returns>DataSet</returns>
 80         public static DataSet Query(string SQLString)
 81         {
 82             using (NpgsqlConnection conn = new NpgsqlConnection(connectionString))
 83             {
 84                 DataSet ds = new DataSet();
 85                 try
 86                 {
 87                     conn.Open();
 88                     using (NpgsqlCommand command = new NpgsqlCommand(SQLString, conn))
 89                     {
 90                         using (NpgsqlDataAdapter da = new NpgsqlDataAdapter(command))
 91                         {
 92                             da.Fill(ds, "ds");
 93                             return ds;
 94                         }
 95                     }
 96                 }
 97                 finally
 98                 {
 99 
100                     conn.Close();
101                 }
102                 
103             }
104         }
105 
106         /// <summary>
107         /// 执行查询语句,返回DataSet
108         /// </summary>
109         /// <param name="cmdText">查询语句</param>
110         /// <param name="cmdParms">参数</param>
111         /// <returns>DataSet</returns>
112         public static DataSet ExecuteQuery(string cmdText, params DbParameter[] cmdParms)
113         {
114             using (NpgsqlConnection conn = new NpgsqlConnection(connectionString))
115             {
116                 using (NpgsqlCommand cmd = new NpgsqlCommand())
117                 {
118                     PrepareCommand(cmd, conn, null, cmdText, cmdParms);
119                     using (NpgsqlDataAdapter da = new NpgsqlDataAdapter(cmd))
120                     {
121                         DataSet ds = new DataSet();
122                         da.Fill(ds, "ds");
123                         cmd.Parameters.Clear();
124                         return ds;
125                     }
126                 }
127             }
128         }
129 
130 
131 
132         /// <summary>  
133         /// 生成要执行的命令  
134         /// </summary>  
135         /// <remarks>参数的格式:冒号+参数名</remarks>  
136         private static void PrepareCommand(DbCommand cmd, DbConnection conn, DbTransaction trans, string cmdText, DbParameter[] cmdParms)
137         {
138             if (conn.State != ConnectionState.Open)
139                 conn.Open();
140 
141             cmd.Connection = conn;
142             cmd.CommandText = cmdText.Replace("@", ":").Replace("?", ":").Replace("[", "\"").Replace("]", "\"");
143 
144             if (trans != null)
145                 cmd.Transaction = trans;
146 
147             cmd.CommandType = CommandType.Text;
148 
149             if (cmdParms != null)
150             {
151                 foreach (NpgsqlParameter parm in cmdParms)
152                 {
153                     parm.ParameterName = parm.ParameterName.Replace("@", ":").Replace("?", ":");
154 
155                     cmd.Parameters.Add(parm);
156                 }
157             }
158         }  

    Web.config中设置sql链接

<add key="PgConnectionString" value="Server=192.xxx.xxx.xxx;Port=5432;User Id=用户名;Password=密码;Database=数据库名;"/>

    其中事务的用法还没有研究明白,NpgsqlTransaction 还没有弄懂要怎么使用。以后将补充

   

 三 远程连接postgreSql数据库

  之前提到的,整个系统调通后,要把数据库迁移到服务器上。这时本机访问远程数据库就要在服务器上进行一系列配置了。

PostgreSQLHelper类
作者: JerryAndTom
链接:https://www.imooc.com/article/12444
来源:慕课网
PostgreSQLHelper类
作者: 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段。

 

 

PostgreSQLHelper类
作者: JerryAndTom
链接:https://www.imooc.com/article/12444
来源:慕课网

 

PostgreSQLHelper类
作者: JerryAndTom
链接:https://www.imooc.com/article/12444
来源:慕课网