2016-03-15 94 views
0

我有我的查询的功能,它应该返回9行。但是,由于某种原因,查询不会返回任何行。Npqsql查询不返回任何行

但是,当我在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条款作出的代码返回所有行。但现在我需要这个条款。

+0

我不认为你需要列名中包含引号,至少我没有当我使用postgres。这可能让你看起来查询简单,因为你不会有所有的逃避'\“'那里。 – user1666620

+0

由于有一个字符串大小写比较想到的,是'test'在'users'书面一模一样表? – dnoeth

+0

好,用户是保留关键字,所以我们不得不引用该列。然后,我们决定保持一致,我们会做它无处不在,它是从我们身边引起所有这些逃逸引号的命名只是差。 – blipman17

回答

2

为什么你引用@username参数?与

"WHERE \"user\".\"username\" = @username " + 

更换

"WHERE \"user\".\"username\" = '@username' " + 

此外,如果你拥有多语句和需要引用表和列,如果使用@""符号代替代码可能变得更具可读性。

+0

现在我觉得自己像个白痴,非常感谢你! – blipman17

+0

某个时间段,我的项目组的人选择不这样做是因为某种原因,如果我是这样,我也会这样做。允许。 – blipman17