Возврат нескольких результатов из запроса к базе данных в C# - PullRequest
0 голосов
/ 08 апреля 2020

У меня есть следующий код на C# WinForm, который создает запрос и передает его и параметр в функцию, которая запрашивает базу данных PostgreSQL:

DataTable dt = ((DataTable)dgvCategories.DataSource);

List<string> validationInfoResult = new List<string>();
for (intRowIndex = 0; intRowIndex <= dt.Rows.Count - 1; intRowIndex++)
{
    strNewValueCat = dt.Rows[intRowIndex][1].ToString();
    db getValidationInfo = new db();

    strGetValidationInfoQuery = "SELECT validationdb, validationtable, validationfield, validationfield2, validationvalue2" +
                                " FROM masterfiles.categories" +
                                " WHERE category = @category";
    validationInfoResult = getValidationInfo.GetValidationInfo(strGetValidationInfoQuery, strNewValueCat);
}

Как видите, Я перебираю DataTable DGV, собираю значение из определенной ячейки в текущей строке и передаю его как parmaeter в запрос db. Мне нужно вернуть значения из 5 полей, и я намерен поместить результат запроса в List<>, а затем получить каждый из List<> элементов в их собственную переменную для использования в форме.

My db Функция класса выглядит следующим образом:

public List<string> GetValidationInfo(string strQuery, string strCategory)
{
    List<string> strResult = new List<string>();

    using (NpgsqlConnection conn = new NpgsqlConnection(connString))
    using (NpgsqlCommand cmd = new NpgsqlCommand(strQuery, conn))
    {
        cmd.Parameters.Add(new NpgsqlParameter("category", strCategory));
        conn.Open();

        using (NpgsqlDataReader reader = cmd.ExecuteReader())
        {
            while (reader.Read())
            {
                strResult.Add(reader.GetString(0));
                Console.WriteLine("reader: " + reader.GetString(0));
            }
        }
    }

    return strResult;
}

Я построил приведенный выше код на основе ответа на этот вопрос SO .

Когда я его запускаю, Console.WriteLine() только когда-либо выводит первое поле запроса, validationdb, а затем переходит к следующей строке DataTable в вызывающем for l oop. Проходя по коду во время выполнения, после первого попадания Console.WriteLine() возвращается к while (reader.Read()), затем выходит из while l oop и возвращается к вызывающей функции.

Что неправильно в моем l oop, что он помещает только первое поле запроса в List<>?

Ответы [ 2 ]

0 голосов
/ 08 апреля 2020

Проблема GetString(0), которая выбирает только первый столбец строки (индекс 0). Один из способов обойти это было бы путем обхода столбцов. Из документов , FieldCount можно использовать для получения количества столбцов:

while (reader.Read())
{
    for(int i = 0; i < reader.FieldCount; i++)
    {
        strResult.Add(reader.GetString(i));
        Console.WriteLine("reader: " + reader.GetString(i));
    }
}
0 голосов
/ 08 апреля 2020

Следующий код выведет все поля:

while (reader.Read())
{
    // strResult.Add(reader.GetString(0));
    Console.WriteLine("Column 1: " + reader.GetString(0));
    Console.WriteLine("Column 2: " + reader.GetString(1));
    Console.WriteLine("Column 3: " + reader.GetString(2));
    Console.WriteLine("Column 4: " + reader.GetString(3));
    Console.WriteLine("Column 5: " + reader.GetString(4));
}

Поэтому вам нужно изменить вывод List<string>, чтобы вместить 5 строк на элемент.

...