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];
}
我正在将查询和参数从 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];
}