我正在将查询和参数从WinForm传递到数据库类。
表单上的代码如下:
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);
在我的数据库类中,用于填充数据表/集合的代码是这样的:
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'
仍在查询中。
我想念什么?
根本问题是您要将query传递给数据适配器,而不是command。更改
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];
}