0

我正在编写一个 C# 应用程序来从网站上抓取数据,然后用它来更新数据库表。

我抓取的数据与数据库中的 10 行有关。如果数据实际发生了变化,我们只想插入数据。我已经编写了 SQL 过程来进行更改,但我不确定如何实现第一阶段 - 检查程序生成的数据(从网站上抓取)是否与 SQL Server 中已经存储的数据不同。

我目前的方法是在我的程序中使用代表数据的类,填充这些对象实例的字典(在这种情况下将有 10 个键值对),填充网站数据,然后获取 SQL 表数据,迭代所有 10 行,再次使用我的类创建另外 10 个对象,然后使用我在数据类中编写的名为 getHash() 的函数比较两组字典对象,例如:

有吗websitedict.get(key1).getHash() == dbdict.get(key1).getHash()

ETC

4

2 回答 2

1

你想在哪个方面做到最好?

SQL 调用、CPU 使用率、内存使用率、CPU 和 SQL 服务器之间的带宽、最易读取、最易维护等...

对当前方法的一项内存改进是让 dbdict 成为Dictionary<keytype, int>()并且仅将GetHash()值存储在其中。

或者可能将GetHash()值存储在数据库中,因此您可以执行以下操作:

update table1 set col1 = "newvalueCol1", col2 = "newvalueCol2", colHash = @newHash
where id = @key1
   and colHash <> @newHash

除此之外,我觉得我需要更多地了解情况才能提供更多帮助(对你来说太慢的地方,例如:代码、模式、更新)

于 2012-11-15T23:35:08.640 回答
0

如果第 1 行有变化,为什么要处理 10 行。

Select count(*) from table1 where col1 <> "newVal1" or col2 <> "newVal2"  ...

Select count(*) from table2 where col1 <> "newVal1" or col2 <> "newVal2"  ...

在您声明插入数据的问题中,然后在评论中声明更新。

如果更新那么简单

更新 table1 设置 col1 = "newvalueCol1" where col1 <> "newvalueCol1"

它实际上会更有效

update table1 set col1 = "newvalueCol1", col2 = "newvalueCol2" 
where col1 <> "newvalueCol1"
   or col2 <> "newvalueCol2"

一旦你锁定了一个,如果只有一个发生了变化,那么更新两者的开销就会很小。

于 2012-11-15T14:24:53.137 回答