PostgreSQL Function doesn't Exist in C# (Error: 42883)

PostgreSQL Function doesn't Exist in C# (Error: 42883)

我正在创建一个 winforms 界面,我在其中连接我的 PostgreSQL 数据库,以便 select、更新和删除我的数据。到目前为止,我已经创建了“插入”和“Select”函数,并且我正在处理“更新”函数。我在 PostgreSQL 上创建了以下函数,

PostgreSQL 更新函数

create function ka_update
(
    _cus_name varchar,
    _cus_phone varchar,
    _cus_vat varchar,
    _cus_street varchar,
    _cus_street_num varchar,
    _cus_city varchar,
    _cus_zip varchar,
    _cus_email varchar,
    _cus_id integer
)returns int as
$$
begin
    update customer
    set
        cus_name = _cus_name,
        cus_phone = _cus_phone,
        cus_vat = _cus_vat,
        cus_street = _cus_street,
        cus_street_num = _cus_street_num,
        cus_city = _cus_city,
        cus_zip = _cus_zip,
        cus_email = _cus_email
    where cus_id=_cus_id;
    if found then
        return 1;
    else
        return 0;
    end if;
end
$$
language plpgsql

然后我继续我的 C# 代码,

使用 PostgreSQL 更新功能的 C# 脚本

private NpgsqlConnection conn;
private DataTable dt;
private NpgsqlCommand cmd;
private string sql = null;
private DataGridViewRow r;


private void button2_Click(object sender, EventArgs e)
        {
            if (r == null)
            {
                MessageBox.Show("Please choose a customer to update information", "Oops", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                return;
            }
            try
            {
                conn.Open();
                sql = @"select * from ka_update(:_cus_name,:_cus_phone,:_cus_vat,:_cus_street,:_cus_street_num,:_cus_city,:_cus_zip,:_cus_email,:_cus_id)";
                cmd = new NpgsqlCommand(sql, conn);
                cmd.Parameters.AddWithValue("_cus_name", textBox1.Text);
                cmd.Parameters.AddWithValue("_cus_phone", textBox2.Text);
                cmd.Parameters.AddWithValue("_cus_vat", textBox3.Text);
                cmd.Parameters.AddWithValue("_cus_street", textBox4.Text);
                cmd.Parameters.AddWithValue("_cus_street_num", textBox5.Text);
                cmd.Parameters.AddWithValue("_cus_city", textBox6.Text);
                cmd.Parameters.AddWithValue("_cus_zip", textBox7.Text);
                cmd.Parameters.AddWithValue("_cus_email", textBox8.Text);
                cmd.Parameters.AddWithValue("_cus_id", r.Cells["_cus_id"].Value.ToString());
                
                if ((int)cmd.ExecuteScalar() == 1)
                {
                    conn.Close();
                    MessageBox.Show("Updated a new customer successfully", "Well Done", MessageBoxButtons.OK, MessageBoxIcon.Information);
                    button4.PerformClick(); //If updated successfully then load all customers again
                    //reset textbox components
                    textBox1.Text = textBox2.Text = textBox3.Text = textBox4.Text = textBox5.Text = textBox6.Text = textBox7.Text = textBox8.Text = null;
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show("Error: " + ex.Message, "UPDATE FAIL!!!", MessageBoxButtons.OK, MessageBoxIcon.Error);
                conn.Close();
            }



private void dataGridView1_CellClick(object sender, DataGridViewCellEventArgs e)
        {
            if (e.RowIndex >= 0)
            {
                r = dataGridView1.Rows[e.RowIndex];
                textBox1.Text = r.Cells["_cus_name"].Value.ToString();
                textBox2.Text = r.Cells["_cus_phone"].Value.ToString();
                textBox3.Text = r.Cells["_cus_vat"].Value.ToString();
                textBox4.Text = r.Cells["_cus_street"].Value.ToString();
                textBox5.Text = r.Cells["_cus_street_num"].Value.ToString();
                textBox6.Text = r.Cells["_cus_city"].Value.ToString();
                textBox7.Text = r.Cells["_cus_zip"].Value.ToString();
                textBox8.Text = r.Cells["_cus_email"].Value.ToString();

            }
        }


我收到以下错误

我想弄清楚,我在编写函数时做错了什么,但到目前为止我的线索为零。有什么想法吗???

错误提示参数类型不匹配。 jjanes 还指出最后一个参数是 int

如果你的_cus_id列是int类型,你可以使用Convert.ToInt32方法直接将其转换为int类型。

cmd.Parameters.AddWithValue("_cus_id", Convert.ToInt32(r.Cells["_cus_id"].Value));