从C#中的数据库查询返回多个结果



我的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);
}

正如您所看到的,我正在遍历DGV的DataTable,从当前行中的特定单元格中获取一个值,并将其作为parmaeter传递给数据库查询。我需要返回来自5个字段的值,我的意图是将查询结果放入List<>中,然后将每个List<>项放入它们自己的变量中,以便在表单中使用。

我的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,然后转到调用for循环中的下一个DataTable行。在运行时逐步执行代码,在第一次到达Console.WriteLine()之后,它返回到while (reader.Read()),然后退出while循环并返回到调用函数。

在我的循环中,它只将第一个查询字段结果放入List<>中,这有什么错?

以下代码将输出所有字段:

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个字符串。

问题是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));
}
}

相关内容

  • 没有找到相关文章

最新更新