![](/img/trans.png)
[英]How to Copy and Insert from c# DataSet to PostgreSQL DataBase with Npgsql?
[英]Insert data into Npgsql/Postgresql database with C# windows forms
我对编程完全陌生,我正在尝试创建一个小型应用程序作为学校项目。 我希望它能够注册和登录用户。 我已经想出了如何创建登录部分,但我一直停留在注册上。 我在 pgAdmin 中创建了 Insert function 并且它可以工作,但我不能让它与我的 windows forms 应用程序一起工作。
到目前为止,这是我的代码:
using Npgsql;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace ProjektV0._0._2
{
public partial class frmRegister : Form
{
public frmRegister()
{
InitializeComponent();
}
private NpgsqlConnection conn;
string connstring = String.Format("Server={0}; Port={1};" +
"User Id = {2}; Password={3};Database={4};",
"localhost", "5432", "postgres", "23112001", "demo2");
private NpgsqlCommand cmd;
private string sql = null;
private void frmRegister_Load(object sender, EventArgs e)
{
conn = new NpgsqlConnection(connstring);
}
private void Register_FormClosed(object sender, FormClosedEventArgs e)
{
Application.Exit();
}
private void btnRegister_Click(object sender, EventArgs e)
{
try
{
conn.Open();
sql = @"select * from u_insert(:_username,:_password)";
cmd = new NpgsqlCommand(sql, conn);
cmd.Parameters.AddWithValue("_username", txtEmail.Text);
cmd.Parameters.AddWithValue("_password", txtPswrd.Text);
if ((int)cmd.ExecuteScalar() == 1)
{
conn.Close();
MessageBox.Show("Registered successfuly", "Well done", MessageBoxButtons.OK, MessageBoxIcon.Asterisk);
txtEmail.Text = txtPswrd.Text = txtConPswrd.Text = null;
}
}
catch (Exception ex)
{
conn.Close();
MessageBox.Show("Error", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
}
}
pgAdmin 部分:
create function u_insert
(
_username character varying,
_password character varying
)returns int as
$$
begin
insert into tbl_users
(
username,
password
)values
(
_username,
_password
);
if found then
return 1;-----success-----
else
return 0;-----fail-----
end if;
end
$$
language plpgsql
正如我所说,我的登录部分甚至通过我的程序工作,所有其他功能(插入、更新)仅在 pgAdmin 内部工作。
澄清我的评论......为什么功能/程序? 对于插入来说,这似乎是戏剧性的矫枉过正。 我会把这样的东西放在我的表格之外(在某处的 CRUD class 中):
public static int UpdateUser(string UserId, string Password, out string ErrorMessage)
{
int result = 0;
ErrorMessage = null;
NpgsqlConnectionStringBuilder sb = new NpgsqlConnectionStringBuilder();
sb.Host = "localhost";
sb.Port = 5432;
sb.Username = "postgres";
sb.Password = "23112001";
sb.Database = "demo2";
using (NpgsqlConnection conn = new NpgsqlConnection(sb.ToString()))
{
conn.Open();
string dml = "insert into tbl_users (username, password) values (:USER, :PW)";
using (NpgsqlCommand cmd = new NpgsqlCommand(dml, conn))
{
cmd.Parameters.AddWithValue("USER", UserId);
cmd.Parameters.AddWithValue("PW", Password);
try
{
result = cmd.ExecuteNonQuery();
}
catch (Exception ex)
{
ErrorMessage = ex.Message;
}
}
}
return result;
}
然后在 Button Click 事件中,您可以将其简化为:
private void btnRegister_Click(object sender, EventArgs e)
{
string error;
int insertedRows = CrudClass.UpdateUser(txtEmail.Text, txtPassword.Text, out error);
if (insertedRows == 1)
{
MessageBox.Show("Registered successfuly", "Well done", MessageBoxButtons.OK, MessageBoxIcon.Asterisk);
txtEmail.Text = txtPswrd.Text = txtConPswrd.Text = null;
}
else
{
MessageBox.Show("Error", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.