Reader返回5行,数据表有1行

时间:2012-02-28 19:17:07

标签: c# sql

我有一个sql语句,我正在尝试对sqlite db执行。

问题是,只有这一个sql语句,数据表报告1行事件,但是如果我查看阅读器它在结果视图中有5行。

SQL:

SELECT 
    f.host_id,h.hostname,h.computer_name_dns_fully_qualified,
    l.username,l.logon_domain 
FROM scans s 
LEFT JOIN hosts h ON h.scan_id=s.scan_id 
LEFT JOIN logged_on_users l ON l.host_id=h.host_id 
LEFT JOIN hosts f ON f.computer_name_netbios LIKE l.logon_ser...

这就是它的名称:

        var dt = new DataTable();

        try
        {
            var com = new SQLiteCommand(_con) { CommandText = sql };
            var reader = com.ExecuteReader();
            dt.Load(reader);
            reader.Close();
        }
        catch
        {
        }

        return dt;

4 个答案:

答案 0 :(得分:2)

问题是MSDN文章中描述的数据表填充方法与主键匹配并覆盖每一行。 我知道如果这是真的,那么只返回最后一行。我回去取消了所有代码更改,果然,只返回了最后一行。这是因为加载到数据表中的每一行都覆盖了之前的行。 如果你有这个问题,我现在已经指出了一些线程 - 有些线程长达4年没有解决 - 停止,删除,并检查一个特定列中的所有值是否相同;数据表可能会按该列键入您的数据。

答案 1 :(得分:1)

向查询添加订单。 DataTables需要一个独特的字段来处理,并按顺序排序。因为数据表可以通过加载读取器来更新内容。

请参阅:Similar Issue

答案 2 :(得分:0)

您的加入扫描到主机,主机到logged_on_users然后过滤到logged_on_users如果带有过滤器的表生成多行,那么您将获得笛卡尔乘法。

尝试将部分查询分解为子查询。

此外,如果这是SQL Server,请向business studio询问查询计划 - 将其作为图片发布,我们可以清楚地回答。

由于 西蒙

答案 3 :(得分:0)

避免空的catch-block,因为它会导致这样的问题。而是记录异常和/或抛出异常。 http://www.codeproject.com/Articles/9538/Exception-Handling-Best-Practices-in-NET

Load方法从加载的IDataReader消耗第一个结果,在成功完成后,将读者的位置设置为下一个结果集,如果有的话。

显然存在异常,因此您只能在DataTable中看到一行。所以你应该设置一个断点来看看会发生什么。

当存在异常时,您也没有关闭连接,该异常属于finally - 块(或使用using语句)。