C# 参数化查询 - 参数未被设置值替换

C# Parameterized query - parameters not being replaced with set value

我正在将查询和参数从 WinForm 传递到数据库 class。

表单上的代码如下所示:

string selectedComp = "CPSI";
string catsQuery = "SELECT id, category, old_value, old_desc, new_value, new_desc, reference1, reference2 FROM masterfiles.xref WHERE company_name = '@company' ORDER BY category, old_value";

Db categoriesData = new Db();
dgvCategories.DataSource = categoriesData.GetData(catsQuery, selectedComp);

在我的数据库 class 中,我填充 datatable/set 的代码是这样的:

public DataTable GetData(string selectQuery, string selectedComp)
{
    NpgsqlConnection conn = new NpgsqlConnection(connString);
    DataSet ds = new DataSet();

    NpgsqlCommand cmd = new NpgsqlCommand(selectQuery, conn);

    cmd.Parameters.Add(new NpgsqlParameter("@company", selectedComp));

    //cmd.Parameters.AddWithValue("@company", selectedComp);
    //cmd.Parameters.Add("@company", NpgsqlDbType.Text);
    //cmd.Parameters["@company"].Value = selectedComp;

    try
    {
        conn.Open();
        NpgsqlDataAdapter da = new NpgsqlDataAdapter(selectQuery, conn);
        conn.Close();

        da.Fill(ds);
        return ds.Tables[0];
    }
}

但是在 NpgsqlDataAdapter da = new NpgsqlDataAdapter(selectQuery, conn); 处设置断点,selecctQuery 没有改变 - '@company' 仍在查询中。

我错过了什么?

根本问题是您将查询而不是命令传递给数据适配器。变化

NpgsqlDataAdapter da = new NpgsqlDataAdapter(selectQuery, conn);

NpgsqlDataAdapter da = new NpgsqlDataAdapter(cmd);

我也会使用 using 来处理所有对象,并且在数据集填满之前不要关闭连接:

using(NpgsqlConnection conn = new NpgsqlConnection(connString))
using(NpgsqlCommand cmd = new NpgsqlCommand(selectQuery, conn))
{

    cmd.Parameters.Add(new NpgsqlParameter("company", selectedComp));

    conn.Open();
    using(NpgsqlDataAdapter da = new NpgsqlDataAdapter(cmd))
    {
        DataSet ds = new DataSet();
        da.Fill(ds);
    }
    conn.Close();

    return ds.Tables[0];
}