C#访问PostGreSQL数据库的方法
我对postgresql只是一知半解,记录这个过程是希望如果以后微软技术方向的人遇到类似的需求,可以有个比较直接的的参考。
在不熟悉的知识领域里,总是有搜索引擎可以帮到我。
初步了解postgresql数据库及数据形态
首先我想看看postgresql的数据库以及我想要获取的数据形态是什么样子的,linux和postgresql这两个关键字我都不熟悉,搜了一下找到了一个可以连通postgresql数据库的windows客户端,叫pgadmin,我装的是iii版本,应该是比较新的,下载安装后看到界面:
点击那个电源插头的logo可以新建服务器连接
名称就是在pgadmin客户端的显示名,可以自定义。
ssl呢,有这么多选项,我不是很了解干什么用的,反正我选的允许。
端口号,默认postgresql的端口号是5432,当然可以被修改,自定义成别的端口号
全部填写完点击确定,就可以看到数据库了。
我不在客户现场,连不上postgresql的库,所以下面就不能截图了。
在pgadmin里,可以写查询语句,如果你有权限的话,可以看到返回的结果集。
我点开一个窗口,试着写了一条查询语句如下:
select top 10 * from tableobj
执行,发现结果集窗口提示语法错误,问下群里的兄弟们,得知,正确的写法应该是这样的:
select * from tableobj limit 5
语法规则跟sql语句还是有区别的。
执行,提示找不到对象“tableobj”找到tableobj的上一层容器“containerobj”,修改如下
select* from containerobj.tableobj limit 5
点击执行,终于看到了结果集。
相对sqlserver来说,pgadmin的结果集显示界面表头都有两行,一行是字段名,一行是字段的数据类型。这点很有爱。
在postgresql的查询语句中,大小写是不敏感的。
关于postgresql语法规则,在csdn上找到了《postgresql语法详细手册》,不过这家伙要三个资源分。
好了看到postgresql数据库了,下面我要尝试敲c#代码测试去取postgresql的数据。
c#连接postgresql数据库
有个东东,叫npgsql,是postgresql的一个.net数据提供程序。首先需要下载它,实际上我们只需要引用两个dll:
经过我的测试,如果只引用了npgsql.dll,那么你的程序运行起来之后会报错,提示找不到对mono.security.dll引用的依赖项。
引用了这两个dll,你还需要在你的代码中加上using。
using npgsql;
代码就很简单了。
写了个拼字符串的,比较二。txt什么什么的都是winform的textbox
///
/// 根据填写的信息拼数据库连接串
///
/// 数据库连接串
private string getconnectstr()
{
stringbuilder sb = new stringbuilder();
string str = string.empty;
sb.append("server=");
sb.append(txtserver.text);
sb.append(";port=");
sb.append(txtport.text);
sb.append(";user id=");
sb.append(txtuid.text);
sb.append(";password=");
sb.append(txtpassword.text);
sb.append(";database=");
sb.append(txtdb.text);
sb.append(";");
str = sb.tostring();
return str;
}
实际上数据库连接串就是这么样的一个格式
"server=192.168.1.100;port=5432;userid=mike;password=secret;database=mikedb;"
///
/// 测试连接postgresql数据库
///
/// success/failure
private string testconnection()
{
string str = getconnectstr();
string strmessage = string.empty;
try
{
npgsqlconnection conn = new npgsqlconnection(str);
conn.open();
strmessage = "success";
conn.close();
}
catch
{
strmessage = "failure";
}
return strmessage;
}
///
/// 测试获取数据(使用要加try、catch)
///
private void testgetdata()
{
idbconnection dbcon;
dbcon = newnpgsqlconnection(getconnectstr());
dbcon.open();
idbcommand dbcmd = dbcon.createcommand();
dbcmd.commandtext = " select * from containerobj.tableobj limit 5";
idatareader dr = dbcmd.executereader();
string strresult = string.empty;
while (dr.read())
{
stringstrrecord_time_int = dr[0].tostring();
stringstrip = dr[1].tostring();
stringstrfullpath = dr[2].tostring();
stringstrupload_size = dr[3].tostring();
stringstrdownload_size = dr[4].tostring();
strresult += "record_time_int: " + strrecord_time_int+ " | ip:" + strip + " | fullpath:" +strfullpath + " | upload_size:" +strupload_size + " | download_size:"+ strdownload_size + "\n";
}
dr.close();
dr = null;
lblres.text = strresult;
}
form很简单,只为测试功能。下面截图是之前在现场截的,处理了一下,隐去了一些信息。