Npgsql.PostgresException 尝试在 C# Winform 中查询 PostgreSQL 数据库时 ExecuteReader 出错
Npgsql.PostgresException error on ExecuteReader when attempting to query PostgreSQL database in C# Winform
我正在尝试从数据库查询中获取字符串列表并将它们放入 ComboBox 中。
我尝试执行此操作的代码以 DataGridVew
Cell Click 事件中的以下代码开头:
// Bind combobox to dgv and than add list of New Values to combobox
DataGridViewComboBoxCell cboNewValueList = new DataGridViewComboBoxCell();
// Get fields to build New Value query
List<string> lsNewValuesResult = new List<string>();
string strCategory = dtCategories.Rows[e.RowIndex][1].ToString();
string strCompanyName = cboSelectCompany.Text;
string strQueryGetNewValuesValidationInfo = "SELECT validationdb, validationtable, validationfield, validationfield2, validationvalue2" +
" FROM masterfiles.categories" +
" WHERE category = @category";
// Pass validation info query to db class and return list of New Values
db getListOfNewValues = new db();
lsNewValuesResult = getListOfNewValues.GetNewValuesList(strQueryGetNewValuesValidationInfo, strCategory, strCompanyName);
//Populate the combobox with the list of New Values
foreach (string strListItem in lsNewValuesResult)
{
cboNewValueList.Items.Add(strListItem);
}
我需要使用上面的查询来找出查询填充 lsNewValuesResult
.
所需的 table 和字段
在GetNewValuesList
我有这个代码:
public List<string> GetNewValuesList(string strValidationInfoQuery, string strCategory, string strCompanyName)
{
List<string> lsValidationInfo = new List<string>();
List<string> lsNewValuesList = new List<string>();
using (NpgsqlConnection conn = new NpgsqlConnection(connString))
using (NpgsqlCommand cmd = new NpgsqlCommand(strValidationInfoQuery, conn))
{
cmd.Parameters.Add(new NpgsqlParameter("@cateogry", strCategory));
conn.Open();
using (NpgsqlDataReader reader = cmd.ExecuteReader())
{
while (reader.Read())
{
int intReaderIndex;
for (intReaderIndex = 0; intReaderIndex <= reader.FieldCount - 1; intReaderIndex++)
{
// reader indexes 3 & 4 correspond to categories.validationfield2 and validationvalue2, which can be null
if (string.IsNullOrEmpty(reader[intReaderIndex].ToString()))
{
lsValidationInfo.Add("");
}
else
{
lsValidationInfo.Add(reader.GetString(intReaderIndex));
}
Console.WriteLine("reader index " + intReaderIndex + ": " + reader.GetString(intReaderIndex));
}
}
}
}
// Use the items in lsValidationInfo to build the query to get the New Values
}
在 ExecuteReader()
行上,虽然我收到 Npgsql.PostgresException、"operator does not exist: @ character varying'".
让我感到困惑的是,我在同一个项目中成功执行相同操作的另一个代码块之后对其进行了建模。这几乎是 copy/paste 然后更改新函数的参数和对象名称。
所以我认为问题在于以下行:
cmd.Parameters.Add(new NpgsqlParameter("@cateogry", strCategory));
尝试用以下内容替换:
cmd.Parameters.AddWithValue("category", strCategory);
我正在尝试从数据库查询中获取字符串列表并将它们放入 ComboBox 中。
我尝试执行此操作的代码以 DataGridVew
Cell Click 事件中的以下代码开头:
// Bind combobox to dgv and than add list of New Values to combobox
DataGridViewComboBoxCell cboNewValueList = new DataGridViewComboBoxCell();
// Get fields to build New Value query
List<string> lsNewValuesResult = new List<string>();
string strCategory = dtCategories.Rows[e.RowIndex][1].ToString();
string strCompanyName = cboSelectCompany.Text;
string strQueryGetNewValuesValidationInfo = "SELECT validationdb, validationtable, validationfield, validationfield2, validationvalue2" +
" FROM masterfiles.categories" +
" WHERE category = @category";
// Pass validation info query to db class and return list of New Values
db getListOfNewValues = new db();
lsNewValuesResult = getListOfNewValues.GetNewValuesList(strQueryGetNewValuesValidationInfo, strCategory, strCompanyName);
//Populate the combobox with the list of New Values
foreach (string strListItem in lsNewValuesResult)
{
cboNewValueList.Items.Add(strListItem);
}
我需要使用上面的查询来找出查询填充 lsNewValuesResult
.
在GetNewValuesList
我有这个代码:
public List<string> GetNewValuesList(string strValidationInfoQuery, string strCategory, string strCompanyName)
{
List<string> lsValidationInfo = new List<string>();
List<string> lsNewValuesList = new List<string>();
using (NpgsqlConnection conn = new NpgsqlConnection(connString))
using (NpgsqlCommand cmd = new NpgsqlCommand(strValidationInfoQuery, conn))
{
cmd.Parameters.Add(new NpgsqlParameter("@cateogry", strCategory));
conn.Open();
using (NpgsqlDataReader reader = cmd.ExecuteReader())
{
while (reader.Read())
{
int intReaderIndex;
for (intReaderIndex = 0; intReaderIndex <= reader.FieldCount - 1; intReaderIndex++)
{
// reader indexes 3 & 4 correspond to categories.validationfield2 and validationvalue2, which can be null
if (string.IsNullOrEmpty(reader[intReaderIndex].ToString()))
{
lsValidationInfo.Add("");
}
else
{
lsValidationInfo.Add(reader.GetString(intReaderIndex));
}
Console.WriteLine("reader index " + intReaderIndex + ": " + reader.GetString(intReaderIndex));
}
}
}
}
// Use the items in lsValidationInfo to build the query to get the New Values
}
在 ExecuteReader()
行上,虽然我收到 Npgsql.PostgresException、"operator does not exist: @ character varying'".
让我感到困惑的是,我在同一个项目中成功执行相同操作的另一个代码块之后对其进行了建模。这几乎是 copy/paste 然后更改新函数的参数和对象名称。
所以我认为问题在于以下行:
cmd.Parameters.Add(new NpgsqlParameter("@cateogry", strCategory));
尝试用以下内容替换:
cmd.Parameters.AddWithValue("category", strCategory);