C# Параметризованный запрос - параметры не заменяются на заданное значение - PullRequest
0 голосов
/ 31 марта 2020

Я передаю запрос и параметр из 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' все еще находится в запросе.

Что мне не хватает?

1 Ответ

2 голосов
/ 31 марта 2020

Проблема root в том, что вы передаете запрос в адаптер данных вместо команды . Измените

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];
}
...