平时使用最多的就的数据库软件就是SQL Server 和MySQL,但是Sql Server用的一直都是破解版,哈哈,自己使用还好,商用的话,总感觉不太合适,所以,自己抽空研究了下PostgreSQL数据库,写了个小demo,可以实现数据库的连接和增删改查。
PostgreSQL是一个功能强大的开源对象关系数据库系统,经过30多年的积极开发,在可靠性,功能稳健性和性能方面赢得了良好的声誉。
有大量信息可以通过官方文档介绍如何安装和使用 PostgreSQL 。PostgreSQL社区提供了许多有用的地方,以熟悉技术,发现它的工作原理,并找到职业机会。在这里联系社区。下面是它官网的截图。
嗯,很先进
放代码之前,先看一下软件截图吧。
主界面
嗯,主界面就长这样,输入服务器名,用户名,密码,数据库名,然后点击连接就可以了,连接成功之后,点击查找数据,可以把PostgreSQL里面的数据查询出来放到ListView中,然后可以插入数据,点击插入内容会弹出一个小窗口,就像下面这张图片。
添加数据
点击更新,需要先选中下面的一行数据,然后也是弹出一个小窗口,看图。
更新数据
嗯,页面就这些,功能比较简单,下面看代码。
首先当然是要连接数据库。顺便说一下,连接PostgreSQL需要先下载一个Nuget包,叫 Npgsql,
image.png
然后添加引用。
using Npgsql;
连接数据库。
//连接数据库
public void btn_connect_Click(object sender, EventArgs e)
{
string hostname = txt_hostname.Text;
string username = txt_username.Text;
string password = txt_password.Text;
string database = txt_database.Text;
string connec_info = NPGSQLHelper.NpgsqlConn(hostname, username, password, database);
switch(connec_info)
{
case "connection_success":
label_info.Visible = true;
label_info.Text = "连接成功";
label_info.ForeColor = Color.Green;
break;
case "connection_failed":
label_info.Visible = true;
label_info.Text = "连接失败";
label_info.ForeColor = Color.Red;
break;
default:
label_info.Visible = true;
label_info.Text = "连接失败";
label_info.ForeColor = Color.Red;
break;
}
}
查找数据
//查询
private void btn_select_Click(object sender, EventArgs e)
{
string select_sql = "select id,name,telephone,email from users";
DataTable dt = NPGSQLHelper.GetData(select_sql).Tables[0];
list_user.Items.Clear();
for (int i = 0; i < dt.Rows.Count; i++)
{
ListViewItem[] p = new ListViewItem[1];
p[0] = new ListViewItem(new string[] { dt.Rows[i]["id"].ToString(), dt.Rows[i]["name"].ToString(), dt.Rows[i]["telephone"].ToString(), dt.Rows[i]["email"].ToString() });
this.list_user.Items.AddRange(p);
}
}
嗯,可以看到查找的关键代码在一个名为NPGSQLHelper的类中。这个代码在最下面会附上。
然后是插入数据。
//插入数据 需要弹出窗口
private void btn_insert_Click(object sender, EventArgs e)
{
//弹出插入信息窗口
Insert_form inf = new Insert_form();
inf.ShowDialog();
}
public void btn_add_Click(object sender, EventArgs e)
{
string name = txt_name.Text;
string telephone = txt_telephone.Text;
string email = txt_email.Text;
int c = NPGSQLHelper.Add(name, telephone, email);
if (c > 0)
{
MessageBox.Show("数据插入成功");
}
else
{
MessageBox.Show("数据插入失败");
}
}
这里解释一下,为什么会是两个方法,在主页点击插入数据,会弹出一个窗口,在弹出的窗口中输入内容然后点击插入数据的。然后是更新数据。
//更新 需弹出窗口
private void btn_update_Click(object sender, EventArgs e)
{
int select_count = list_user.CheckedItems.Count;
if(select_count!=1)
{
MessageBox.Show("请选择一条数据");
}
else
{
string id = list_user.CheckedItems[0].SubItems[0].Text;
string name = list_user.CheckedItems[0].SubItems[1].Text;
string telephone = list_user.CheckedItems[0].SubItems[2].Text;
string email = list_user.CheckedItems[0].SubItems[3].Text;
update_form uf = new update_form(id,name, telephone, email);
uf.ShowDialog();
}
}
private void btn_add_Click(object sender, EventArgs e)
{
string name = txt_name.Text;
string telephone = txt_telephone.Text;
string email = txt_email.Text;
int c = NPGSQLHelper.Update(_id, name, telephone, email);
if (c > 0)
{
MessageBox.Show("数据更改成功");
}
else
{
MessageBox.Show("数据更改失败");
}
}
更新数据也是需要在弹出的窗口中进行操作。最后是删除数据。
//删除
private void btn_delete_Click(object sender, EventArgs e)
{
if (MessageBox.Show("确定删除?", "提示", MessageBoxButtons.YesNo) == DialogResult.Yes)
{
int id = Convert.ToInt32(list_user.CheckedItems[0].SubItems[0].Text);
int c = NPGSQLHelper.delete(id);
if (c > 0)
{
MessageBox.Show("共删除" + c + "条数据");
}
else
{
MessageBox.Show("数据删除失败");
}
}
}
删除数据首先要给用户一个提示,用户点击确定然后才会真的删除数据。
最后附上关键的NPGSQLHelper类。
using System;
using System.Collections.Generic;
using System.Data;
using System.Data.SqlClient;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Npgsql;
namespace PostgreSQL_demo
{
public class NPGSQLHelper
{
//配置数据库连接
public static NpgsqlConnection npsqlconn;
public static string NpgsqlConn(string hostname,string username,string password,string database)
{
string connecstr = string.Format("PORT=5432;DATABASE={0};HOST={1};PASSWORD={2};USER ID={3}", database, hostname, password, username); //配置数据库连接字符串
npsqlconn = new NpgsqlConnection(connecstr); //配置数据库连接
try
{
npsqlconn.Open();
string state = npsqlconn.State.ToString(); //监测连接状态
if (state == "Open")
{
return "connection_success";
}
else
{
return "connection_failed";
}
}
catch (Exception)
{
return "connection_error";
}
}
///
/// 向数据库插入一行记录
///
///
public static int Add(string name, string telephone, string email)
{
string insert_sql = "insert into users(name,telephone,email) values(@name,@telephone,@email)";
NpgsqlParameter[] values = new NpgsqlParameter[]
{
new NpgsqlParameter("@name",name),
new NpgsqlParameter("@telephone",telephone),
new NpgsqlParameter("@email",email)
};
int c = ExecuteCommand(insert_sql, values); //返回受影响的行数
return c;
}
///
/// 更新数据库记录
///
///
public static int Update(int id,string name,string telephone,string email)
{
string update_sql = "update users set name = @name,telephone=@telephone,email=@email where id = @id";
NpgsqlParameter[] values = new NpgsqlParameter[]
{
new NpgsqlParameter("@id",id),
new NpgsqlParameter("@name",name),
new NpgsqlParameter("@telephone",telephone),
new NpgsqlParameter("@email",email),
};
int c = NPGSQLHelper.ExecuteCommand(update_sql,values);
return c;
}
///
/// 删除数据
///
///
public static int delete(int id)
{
string sql = "delete from users where id =" + id + "";
int c = ExecuteNonQuery(sql);
return c;
}
//public DataSet dataSet()
//{
//}
public static int ExecuteNonQuery(string sqrstr)
{
try
{
using (NpgsqlCommand SqlCommand = new NpgsqlCommand(sqrstr, npsqlconn))
{
int c = SqlCommand.ExecuteNonQuery(); //执行查询并返回受影响的行数
return c; //r如果是>0操作成功!
}
}
catch
{
return 0;
}
}
//带参数的执行命令
public static int ExecuteCommand(string sqrstr, params NpgsqlParameter[] values)
{
using (NpgsqlCommand cmd = new NpgsqlCommand(sqrstr,npsqlconn))
{
cmd.Parameters.AddRange(values);
return cmd.ExecuteNonQuery();
}
}
//获取数据
public static DataSet GetData(string sqrstr)
{
using (NpgsqlCommand SqlCommand = new NpgsqlCommand(sqrstr, npsqlconn))
{
DataSet dataSet = new DataSet();
NpgsqlDataAdapter nda = new NpgsqlDataAdapter(SqlCommand);
nda.Fill(dataSet);
return dataSet;
}
}
}
}
写完这个小程序感觉PostgreSQL和SQL server和MySQL的操作基本一致。当然这里只是简单的增删改查,里面更多的知识会在以后的学习中,慢慢分享。
Study hard and make progress every day。
有想要源码的同学请关注微信公众号“爱游戏爱编程”,后台回复“新数据库”即可获取。
爱游戏爱编程.jpg