【问题标题】:Count SQL Query not returning expected value计数 SQL 查询未返回预期值
【发布时间】:2015-08-11 20:25:14
【问题描述】:

我正在尝试让一个方法返回一个计数语句。

    public int getSettingsCount(string UserId, string Setting)
    {
        int LastSetting;
        //var user = new SqlDataLayer();
        using (var db = new SQLite.SQLiteConnection(this.DBPath))
        {
            {
                List<int> _setting = db.Query<int>("SELECT COUNT(*) FROM QTabSettings WHERE UserId = 1058 AND Setting = 'ServerDropdown' GROUP BY UserId;");
                LastSetting = Convert.ToInt32(_setting.SingleOrDefault());
            }
            return LastSetting;
        }
    }

当我执行查询时,它会返回正确的值 (6)。但是我从上面的查询中得到了值 (0)。

如何获得将计数返回为 int 的方法?

【问题讨论】:

  • 您希望LIMIT 1 完成什么?
  • 好点,我删除了它。
  • 你为什么要ORDER BY TimeStamp?这个查询无论如何都会返回一行。
  • 代码似乎是正确的,但我会尝试在List&lt;long&gt; 中更改List&lt;int&gt; 并在各处进行适当的更改。只是为了尝试一个疯狂的想法。

标签: c# sql sqlite


【解决方案1】:

您正在使用LIMIT 1,但仍在使用List&lt;int&gt;,这很奇怪且没有必要。此外,因为它是count(*),所以不需要LIMIT 1,因为结果将是一个标量数据。应该改成

int _setting = db.Query<int>("SELECT COUNT(*) FROM QTabSettings WHERE UserId = 1058 AND Setting = 'ServerDropdown';");
LastSetting = _setting;

【讨论】:

  • 加上 Group By 在他的查询中也是不必要的,因为我们过滤了唯一的用户。
【解决方案2】:

如果我正确理解您的问题,我认为这就是您想要的:

LastSetting = _setting.FirstOrDefault();

或:

LastSetting = _setting[0];

【讨论】:

  • 这会返回 1,因为列表中只有一个值。我需要访问该实际值。
  • 我不确定你为什么要使用列表,但请尝试使用 LastSetting = _setting.FirstOrDefault();
  • 因为如果我没有编译错误,说明您不能将 int 隐式转换为列表。
  • _setting.count() 将返回列表的计数属性,而不是数据库计数值。不是吗?
  • @Rahul 是的,这是正确的 - 我误解了这个问题。
猜你喜欢
  • 1970-01-01
  • 2015-05-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-22
  • 1970-01-01
相关资源
最近更新 更多