【问题标题】:Npqsql query not returning any rowsNpqsql 查询不返回任何行
【发布时间】:2016-03-15 10:11:50
【问题描述】:

我在一个函数中有我的查询,它应该返回 9 行。但是,由于某种原因,查询没有返回任何行。

但是,当我在 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 子句使代码返回所有行。但现在我需要它和那个子句。

【问题讨论】:

  • 我认为您不需要将列名包含在引号中,至少我在使用 postgres 时不需要。这可能会使您的查询看起来更简单,因为您不会在那里有所有转义的\"
  • 想到了一个字符串区分大小写的比较,testusers 表中的写法是否完全相同?
  • 好吧,user 是保留关键字。所以我们不得不引用该列。然后我们决定为了保持一致性,我们会在任何地方都这样做。只是我们这边的糟糕命名导致了所有这些转义引号。
  • @dnoeth 我很确定是这样。不过我会在几个之后对其进行测试。
  • @dnoeth 不,刚刚测试过。我降低了这两个值,在 pgadmin 中测试了查询(它也有效)并实现了它。但后来又失败了。结果相同。

标签: c# sql postgresql-9.1 npgsql


【解决方案1】:

为什么要引用@username 参数?替换

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

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

此外,如果您有多行语句并且需要引用表和列,如果您改用@"" 表示法,代码可能会变得更易读。

【讨论】:

  • 某个时候,我的项目组中的人出于某种原因选择不这样做。如果允许,我也会这样做。
猜你喜欢
  • 1970-01-01
  • 2017-10-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-10-28
  • 1970-01-01
  • 2012-04-14
相关资源
最近更新 更多