![](/img/trans.png)
[英]Column Extent1.Id does not exist in Mono with Entity Framework 6 and PostgreSQL
[英]PostgreSQL “Column ”foo“ does not exist”
我正在尝试为我的程序创建一种搜索方法。 在搜索页面中,用户可以搜索8个变量。例如,如果用户仅在“名称:”中键入,则此方法将根据名称进行选择。 如果用户也决定键入“ Id:”,则此方法将根据两者进行选择。 我原来有8个变量。
好吧...每当我尝试搜索时,都会收到“列'sth'不存在”的消息。 如果仅输入名称,则表示“名称”列不存在。 与ID相同,但它表示不存在cloumn'Id'。
我不知道是什么问题。 这可能与准备好的语句有关。 顺便说一下,我的null搜索有效。
public ObservableCollection<Foo> Search(Foo foo)
{
ObservableCollection<Foo> results = new ObservableCollection<Foo>();
IdParam = new NpgsqlParameter("@Id", NpgsqlTypes.NpgsqlDbType.Bigint);
NameParam = new NpgsqlParameter("@Name", NpgsqlTypes.NpgsqlDbType.Varchar, 50);
string sql;
//Null search
if (intern == null)
sql = "select * from \"Foos\"";
else
{
sql = "select * from \"Foos\" ";
int parameterCount = 0;
//This part goes too long, So I just put 2 sample of it. I have 8 parameters in the
//original
if (foo.Id > 0)
{
if (parameterCount == 0)
sql += "WHERE \"Id\"=";
if (parameterCount > 0)
sql += "AND \"Id\"=";
IdParam.Value = foo.Id;
sql += "@Id ";
parameterCount++;
}
if (foo.Name != "" && foo.Name != null)
{
if (parameterCount == 0)
sql += "WHERE \"Name\"=";
if (parameterCount > 0)
sql += "AND \"Name\"=";
NameParam.Value = foo.Name;
sql += "@Name ";
parameterCount++;
}
}
try
{
NpgsqlCommand cmd = new NpgsqlCommand(sql, dbConnection);
NpgsqlDataReader dr = cmd.ExecuteReader(); //This line gives the error
Intern result = new Intern();
while (dr.Read())
{
result.Id = (long)dr.GetInt64(dr.GetOrdinal("Id"));
result.Name = dr.GetString(dr.GetOrdinal("Name"));
results.Add(result);
result = new Intern();
}
return results;
}
catch (Exception ex)
{
MessageBox.Show(ex.ToString());
return null;
}
}
当我不使用准备好的语句时,它就起作用了!
if (intern.Id > 0)
{
if (parameterCount == 0)
sql += "WHERE \"Id\"=";
if (parameterCount > 0)
sql += "AND \"Id\"=";
//IdParam.Value = intern.Id;
//sql += "@Id ";
sql += intern.Id + " "; //When I do this, it works.
parameterCount++;
}
我该怎么做才能解决这个问题?
构建SQL字符串是一个实践中充斥着许多问题的实践。 如您现在所见,故障排除是一个真正的难题。 然后,您之后的那个家伙在尝试进行操作时必须了解发生了什么...
一种方法是编写查询,因此无需执行任何文本更改。 如:
@SQL = "select * from \"foos\" "
+ "where (@ID is null or \"ID\" = @ID) "
+ " and (@Name is null or \"Name\" = @Name) "
+ " and (@so_forth...)"
因此,如果@Name中有一个值,则该值将不会为null,并且该值将用于检查该列。 如果不是,它将为null并跳过测试(将其读取为“ ... and TRUE and ...”。
关键是,现在您每次都执行相同的查询,只有值会更改。 当某件事情无法按您认为的方式正常工作时,进行故障排除会容易得多。
好吧,我忘了在命令中添加参数,这就是为什么出现此错误的原因。
所以我修复了它,它起作用了!
if (intern.Id > 0)
{
if (parameterCount == 0)
sql += "WHERE \"Id\"=";
if (parameterCount > 0)
sql += "AND \"Id\"=";
IdParam.Value = intern.Id;
sql += "@Id ";
cmd.Parameters.Add(IdParam);
parameterCount++;
}
if (intern.Name != "" && intern.Name != null)
{
if (parameterCount == 0)
sql += "WHERE \"Name\" ILIKE ";
if (parameterCount > 0)
sql += "AND \"Name\" ILIKE ";
NameParam.Value = intern.Name;
sql += "@Name ";
cmd.Parameters.Add(NameParam);
parameterCount++;
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.