2012-11-15 48 views
0

我正在编写一个C#应用程序来从网站上抓取数据,然后用它来更新数据库表。将程序生成的数据与存储在数据库中的数据进行比较的最佳方法?

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

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

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

+0

请给我们架构,理想情况下的一些例子(即使它是虚构的)数据。你打算更新现有记录吗?您是否打算将现有记录标记为存档并插入新记录?如果一个键值对改变了,你是想要替换/更新所有的键值对,还是只更改那些键值对?等等等等? – MatBailie

+0

@Dems,我有10个对象 - 每个对象有5个字段。我只想更新数据库中的相应字段,如果从网站抓取生成的相应字段已更改。 – mezamorphic

+0

'请给我们架构,理想情况下举一些例子(即使它是虚构的)数据。“ – MatBailie

回答

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 

以外,我觉得我需要了解更多的情况,以帮助更多的(什么是太例如:代码,模式,更新)

0

为什么过程10行,如果有变化对第1行

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

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

在你的国家,插入数据,但随后在评论你的状态更新的问题。

如果更新那么简单

更新表1组COL1 = “newvalueCol1”,其中的col1 <> “newvalueCol1”

它实际上是更有效地

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

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

相关问题