我有一个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;
答案 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中看到一行。所以你应该设置一个断点来看看会发生什么。