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