Добавление параметра запроса в NpgsqlCommand приводит к исключению - PullRequest
0 голосов
/ 06 апреля 2020

Я привязываю DataTable к DGV с помощью этого метода:

public DataTable GetDgvData(string selectQuery, string companyFilter, string categoryFilter, string idFilter)
{
    using (NpgsqlConnection conn = new NpgsqlConnection(connString))
    using (NpgsqlCommand cmd = new NpgsqlCommand(selectQuery, conn))
    {
        cmd.Parameters.Add(new NpgsqlParameter("company", companyFilter));
        if (!string.IsNullOrEmpty(idFilter)) cmd.Parameters.Add(new NpgsqlParameter("idList", idFilter));
        if (categoryFilter != "All Categories") cmd.Parameters.Add(new NpgsqlParameter("category", categoryFilter));

        DataSet ds = new DataSet();

        conn.Open();

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

        return ds.Tables[0];
    }
}

Изначально у него не было последнего параметра, string idFilter или второго cmd.Parameters.Add() line. И все вызовы метода работали нормально и заполняли DGV, использующие этот метод.

Затем я добавил функцию поиска в мою WinForm, которая ищет в DataTable таблицы DGV введенную пользователем строку, перебирает DataTable, создает список идентификаторов записей для строк с искомой строкой, а затем мне нужно перестроить DGV, используя только строки со строкой поиска в ячейке в DataTable.

Вот функция для этого процесса поиска:

private void btnSearch_Click(object sender, EventArgs e)
{
    string searchText = txtSearchCatsGrid.Text;
    string idToAddToList = "";
    string tempIdList = "";
    string idListForQuery = "";

    DataTable dt = ((DataTable)dgvCategories.DataSource);
    string cellValue;
    int rowIndex;
    int columnIndex;

    for (rowIndex = 0; rowIndex <= dt.Rows.Count - 1; rowIndex++)
    {
        for (columnIndex = 0; columnIndex <= dt.Columns.Count - 1; columnIndex++)
        {
            cellValue = dt.Rows[rowIndex][columnIndex].ToString();

            if (searchText == cellValue)
            {
                // Set corresponding dgvCategories cell's background color to yellow
                dgvCategories[columnIndex, rowIndex].Style.BackColor = Color.Yellow;

                idToAddToList = dt.Rows[rowIndex][0].ToString();
            }
        }

        if (!string.IsNullOrEmpty(idToAddToList) && !tempIdList.Contains(idToAddToList)) tempIdList += idToAddToList + ",";

    }

    if (!string.IsNullOrEmpty(tempIdList))
    {
        idListForQuery = tempIdList.Remove(tempIdList.Length - 1, 1);
    }

    Console.WriteLine("idListForQuery: " + idListForQuery);

    // Refresh dgvCategories with just rows from search, using idListForQuery

    string companyFilter = cboSelectCompany.Text;
    string categoryFilter = cboSelectCategory.Text;

    db categoriesData = new db();

    if (categoryFilter == "All Categories")
    {
        string catsQuery = "SELECT id, category, source_company, old_value, old_desc, new_value, new_desc, reference1, reference2 " +
                            "FROM masterfiles.xref"+
                            " WHERE company_name = @company" +
                                " AND id IN (@idList)" +
                            " ORDER BY category, old_value, source_company";
        this.dtCategories = categoriesData.GetDgvData(catsQuery, companyFilter, categoryFilter, idListForQuery);
    }
    else
    {
        string catsQuery = "SELECT id, category, source_company, old_value, old_desc, new_value, new_desc, reference1, reference2 " +
                            "FROM masterfiles.xref" +
                            " WHERE company_name = @company" +
                                " AND category = @category" +
                                " AND id IN (@idList)" +
                            " ORDER BY old_value, source_company";
        this.dtCategories = categoriesData.GetDgvData(catsQuery, companyFilter, categoryFilter, idListForQuery);
    }

    // TODO: Need to check this.dtCategories.Rows.Count

    dgvCategories.DataSource = this.dtCategories;

    if (dtCategories.Rows.Count == 0)
    {
        return;
    }
    else
    {
        dgvCategories.Columns[0].Visible = false;
        dgvCategories.Rows[0].Cells[0].Selected = false;
    }
}

Список идентификаторов, переданных в функцию GetDgvData(), является правильным, и, насколько я могу судить, реализуется точно так же, как фильтры компании и категории. Программа работает нормально, когда форма загружается и DGV изначально заполняется (я передаю пустую строку в GetDgvData() для всех других вызовов к ней), но когда я использую эту функцию поиска, я получаю ошибку в da.Fill(ds) «Npg sql .PostgresException: 42883: оператор не существует: целое число = текст».

«selectQuery» выглядит так:

SELECT id, category, source_company, old_value, old_desc, new_value, new_desc, reference1, reference2 FROM masterfiles.xref WHERE company_name = @company AND id IN (@idList) ORDER BY category, old_value, source_company

и idList выглядит следующим образом:

1475,1476,1477,1331,1332

Я интерпретирую исключение, чтобы обозначить, что идентификаторы должны быть целыми числами, но я не могу понять, как передать этот список идентификаторов методу GetDgvData() как целые числа - если это вообще проблема здесь. Нужно ли создавать список идентификаторов в виде массива и таким образом передавать список в GetDgvData()? Или в GetDgvData() приведите каждый из этих идентификаторов как int?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...