【问题标题】:PostgreSQL Function doesn't Exist in C# (Error: 42883)C# 中不存在 PostgreSQL 函数(错误:42883)
【发布时间】:2021-08-17 16:19:17
【问题描述】:

我正在创建一个 winforms 界面,我在其中连接我的 PostgreSQL 数据库,以便选择、更新和删除我的数据。到目前为止,我已经创建了“插入”和“选择”功能,并且正在继续“更新”功能。我在 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();

            }
        }


我收到以下错误

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

【问题讨论】:

  • 为什么要将最后一个参数转换为字符串?根据函数声明,它应该是一个整数。
  • 因为我收到一个 CLR 类型错误,其中 Ngsql 本身不支持 DataGridViewTextBox。
  • 如果您不能直接转换为 int,请尝试先转换为字符串,然后再转换为 int。 (我不是 CLR 程序员,所以我不会提出这样做​​的代码)。
  • 非常感谢 DanielZhang-MSFT 在下面的回答。

标签: c# postgresql visual-studio winforms


【解决方案1】:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-04-14
    • 1970-01-01
    • 1970-01-01
    • 2022-10-06
    • 2020-04-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多