循环DataTable和多次访问数据库,哪个更有效率?

3
基本上,我有一个包含零件号和一些列有关这些零件信息的DataTable。
为了将这些信息与我们在数据库中拥有的数据进行比较,我确定有两种选择。
选项1-循环遍历每一行并选择数据。
void CompareData(DataTable dt) {
    foreach (DataRow entry in dt.Rows) {
        //select that row
        DataRow dbEntry = ExecuteQuery("SELECT * FROM Parts WHERE partno='" + entry["partno"] + "'").Rows[0];
        if (dbEntry["info1"] == entry["info1"]) {
            //do something
        } else {
            //do something
        }
    }
}

选项2 - 一次性选择所有数据并通过循环进行比较

void CompareData(DataTable dt, string[] parts) {
    DataTable dbEntries = ExecuteQuery("SELECT * FROM Parts WHERE partno IN('" + String.Join(parts, "','") + "')");
    foreach (DataRow entry in dt.Rows) {
        foreach (DataRow dbEntry in dt.Rows) {
            if (dbEntry["partno"] == entry["partno"]) {
                if (dbEntry["info1"] == entry["info1"]) {
                    //do something
                } else {
                    //do something
                }
            }
        }
    }
}

它们两个看起来都不太有效率,所以我不太确定该怎么办。使用LINQ会加速这个过程吗?我从未真正使用过它,但浏览一下它看起来像是能帮助的东西。


6
数据库调用越少越好。因此我会支持您的第二个选项。 - Uwe Keim
1
尝试消除第一个“DataTable”的创建,直接在数据库服务器上使用纯SQL进行整个比较,仅返回匹配的记录。这将允许摆脱两个嵌套的循环,只留下一个单一的SQL查询。 - Uwe Keim
1
正如其他人所说,数据库调用越少越好。但是尝试两者并亲自测试非常容易。 - jrummell
1
这很有趣,@UweKeim。我正在从用户输入中获取DataTable dt。但是如果我将其提供给数据库表,那么我可以定制SELECT语句。最终,我想在对其进行一些验证检查后使用新数据更新这些行。 - tedski
@jrummell 这个问题是我尝试做的事情的一个非常简化版本,我宁愿不花费两倍的时间来构建我的解决方案。 - tedski
显示剩余3条评论
1个回答

4
尽可能少进行数据库调用。99.9%的情况下,这样做会更有效率。(编码的通用规则)

把荣誉交给你 :-). 在我看来,这只值得一条评论。 - Uwe Keim
1
@UweKeim 哈哈,我想过要解释连接延迟等更精确的内容,但通常规则似乎最正确。 - Nick Vaccaro

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接