Npgsql 查询不返回任何行
Npqsql query not returning any rows
我在一个函数中有我的查询,它应该 return 9 行。但是,出于某种原因,查询没有 return 任何行。
然而,当我在 pgadmin 中 运行 它时,它运行得非常好。
我使用此查询的用户名是 "test"
,我知道它存在于数据库中并具有正确的数据。
所以我的问题是,为什么这个查询不起作用?
internal bool TryGetOrders(out List<OrderDetail> orders, out Exception exception, string fromUsername = null)
{
try
{
orders = new List<OrderDetail>();
NpgsqlCommand cmd = new NpgsqlCommand();
cmd.Connection = _connection;
cmd.CommandText = "SELECT \"order\".\"id\", SUM(\"product\".\"price\" * \"orderline\".\"amount\") AS \"total_price\", \"order\".\"order_status\" " +
"FROM \"order\" " +
"JOIN \"orderline\" ON \"orderline\".\"order_id\" = \"order\".\"id\" " +
"JOIN \"product\" ON \"orderline\".\"product_id\" = \"product\".\"id\" " +
"JOIN \"user\" ON \"order\".\"user_id\" = \"user\".\"id\" " +
"WHERE \"user\".\"username\" = '@username' " +
"GROUP BY \"order\".\"id\"" +
";";
cmd.Parameters.AddWithValue("username", fromUsername);
NpgsqlDataReader reader = cmd.ExecuteReader();
bool failed = true;
while (reader.Read())
{
failed = false;
OrderDetail order = new OrderDetail();
order.OrderId = reader.GetInt32(reader.GetOrdinal("id"));
order.Total = reader.GetDecimal(reader.GetOrdinal("total_price"));
order.OrderStatus = (OrderStatus)reader.GetInt64(reader.GetOrdinal("order_status"));
orders.Add(order);
}
if(failed)
{
exception = new Exception("No rows returned");
return false;
}
else
{
exception = null;
return true;
}
}
catch (Exception e)
{
orders = null;
exception = e;
return false;
}
}
编辑:
删除 WHERE
子句使代码 return 所有行。但现在我需要它和那个条款。
为什么要引用@username
参数?替换
"WHERE \"user\".\"username\" = '@username' " +
与
"WHERE \"user\".\"username\" = @username " +
此外,如果您有多行语句并且需要引用表和列,如果您改用 @""
符号,代码可能会变得更易读。
我在一个函数中有我的查询,它应该 return 9 行。但是,出于某种原因,查询没有 return 任何行。
然而,当我在 pgadmin 中 运行 它时,它运行得非常好。
我使用此查询的用户名是 "test"
,我知道它存在于数据库中并具有正确的数据。
所以我的问题是,为什么这个查询不起作用?
internal bool TryGetOrders(out List<OrderDetail> orders, out Exception exception, string fromUsername = null)
{
try
{
orders = new List<OrderDetail>();
NpgsqlCommand cmd = new NpgsqlCommand();
cmd.Connection = _connection;
cmd.CommandText = "SELECT \"order\".\"id\", SUM(\"product\".\"price\" * \"orderline\".\"amount\") AS \"total_price\", \"order\".\"order_status\" " +
"FROM \"order\" " +
"JOIN \"orderline\" ON \"orderline\".\"order_id\" = \"order\".\"id\" " +
"JOIN \"product\" ON \"orderline\".\"product_id\" = \"product\".\"id\" " +
"JOIN \"user\" ON \"order\".\"user_id\" = \"user\".\"id\" " +
"WHERE \"user\".\"username\" = '@username' " +
"GROUP BY \"order\".\"id\"" +
";";
cmd.Parameters.AddWithValue("username", fromUsername);
NpgsqlDataReader reader = cmd.ExecuteReader();
bool failed = true;
while (reader.Read())
{
failed = false;
OrderDetail order = new OrderDetail();
order.OrderId = reader.GetInt32(reader.GetOrdinal("id"));
order.Total = reader.GetDecimal(reader.GetOrdinal("total_price"));
order.OrderStatus = (OrderStatus)reader.GetInt64(reader.GetOrdinal("order_status"));
orders.Add(order);
}
if(failed)
{
exception = new Exception("No rows returned");
return false;
}
else
{
exception = null;
return true;
}
}
catch (Exception e)
{
orders = null;
exception = e;
return false;
}
}
编辑:
删除 WHERE
子句使代码 return 所有行。但现在我需要它和那个条款。
为什么要引用@username
参数?替换
"WHERE \"user\".\"username\" = '@username' " +
与
"WHERE \"user\".\"username\" = @username " +
此外,如果您有多行语句并且需要引用表和列,如果您改用 @""
符号,代码可能会变得更易读。