none
C#如何判断Access数据库有内容更新 RRS feed

  • 问题

  • C#如何判断Access数据库有内容更新,并只将更新的数据抓取到另一个SQL数据库中?
    • 已编辑 hkstb 2010年4月22日 3:53 打错字了
    2010年4月22日 3:52

答案

  • 我想肖小勇的意思是这样:

    1)建立两个数据库的连接,access和SQL server(至于是local还是remote的,不影响)。

    2)update(包括add,delete和update)access,并相应的记录下updateTime的值(最好每次批量update时设置相同的时间或者你获取当前在access中的最近时间,记作oldUpdateTime);

    3)在access中SELECT 那些时间比记录时间更近的时间(也就是你刚刚update的):

    SELECT * FROM table WHERE UpdateTime > oldUpdateTime

    获取最近update的数据;

    4)将获取的数据更新到SQL server中。

    这里有个问题是关于delete的,因为delete之后,数据不再存在,因此你没法知道你delete的数据到底是哪几条,自然也就没法去SQL server中删除了,因此delete需要单独拿出来进行处理。可以在delete之前先将要delete的数据SELECT出来。

    两个数据库之间的同步操作,最要紧的问题就是数据的同步,这方面需要多下些功夫去考虑下。

    • 已编辑 络绎 2010年4月22日 10:42 add more details
    • 已标记为答案 hkstb 2010年4月22日 13:34
    2010年4月22日 10:42
  • 你好!

    具体方法我上面说了络绎也做了详细的解释,这里我再补充一下:

    1. 没有必要几秒就同步一次。

    2. 同步使用后台线程来做,不要影响界面操作。

    3. 怎么知道Access有新数据? 

    a. 每次同步时都保存最后一次的同步的最大时间(UpdateTime)。新数据 SQL 语句条件为 WHERE UpdateTime > 上次同步的时间

    b. 在 Access 表中增加字段,标实哪些已同步过。增、删、改操作后将这个字段重置为未同步。

    c. 还有一些需求,在同步完成后会删除 access 中的数据。那么只有 access 中有数据则都是需要同步的。


    知识改变命运,奋斗成就人生!
    • 已标记为答案 hkstb 2010年4月22日 13:34
    2010年4月22日 12:27
    版主

全部回复

  • 你可以写一个触发器,当access被更新时,触发抓取事件。至于更新到另一个SQL数据库中,那又是另外的操作了。
    2010年4月22日 3:57
  • 你好!

    你在 access 表中增加时间字段(LastUpdateDateTime)与删除标记字段(IsDeleted),新增、更新、删除时使用当前时间更新时间字段。

    同步时使用SQL Server 中最大的 LastUpdateDateTime 做为条件去取 Access 的数据

    SELECT * FROM Table1 WHERE LastUpdateDateTime > @LastUpdateDateTime 


    知识改变命运,奋斗成就人生!
    2010年4月22日 6:29
    版主
  • 我的实际情况是这样的:access数据库在本地,我想用C#做一个Form小程序,将有改动的记录添加到远程服务器的SQL数据库中。让两个数据库内容一致。

    access不能改。不过里面有UpdataTime字段。

    请问有没有更为详细的思路说明?

    2010年4月22日 10:27
  • 我想肖小勇的意思是这样:

    1)建立两个数据库的连接,access和SQL server(至于是local还是remote的,不影响)。

    2)update(包括add,delete和update)access,并相应的记录下updateTime的值(最好每次批量update时设置相同的时间或者你获取当前在access中的最近时间,记作oldUpdateTime);

    3)在access中SELECT 那些时间比记录时间更近的时间(也就是你刚刚update的):

    SELECT * FROM table WHERE UpdateTime > oldUpdateTime

    获取最近update的数据;

    4)将获取的数据更新到SQL server中。

    这里有个问题是关于delete的,因为delete之后,数据不再存在,因此你没法知道你delete的数据到底是哪几条,自然也就没法去SQL server中删除了,因此delete需要单独拿出来进行处理。可以在delete之前先将要delete的数据SELECT出来。

    两个数据库之间的同步操作,最要紧的问题就是数据的同步,这方面需要多下些功夫去考虑下。

    • 已编辑 络绎 2010年4月22日 10:42 add more details
    • 已标记为答案 hkstb 2010年4月22日 13:34
    2010年4月22日 10:42
  • 另外,触发器好像不行,我想成同一个SQL 服务器里面的两个database了。等回去宿舍试试看能不能。

    2010年4月22日 10:55
  • 我也是在想怎么让Form小程序知道access有更新呢。access有触发器吗?我真不想每几秒种就SELECT一次。这样太耗资源了。
    2010年4月22日 11:43
  • access是支持触发器的,只是不知道这个触发器不知道能不能update另一个service(SQL server)。照你的意思?不想每几秒就SELECT一次,可是你要获得数据update的数据,SELECT是必须的吧。我认为两个做法:

    1)你在update access数据的时候同时update sql server数据,两个互不相关,不过不出问题的话数据会保持同步;

    2)你update access时不管sql server,设置一个定时器,每隔固定的时间来SELECT一次。这种做法无法解决DELETE的同步【你可以添加一个flag来标记是否删除,也就是说其实access里数据不删除,只是被标记为删除,而在sql server中再真实的删除数据】。

    你有什么想法,也share一下。

    • 已编辑 络绎 2010年4月22日 12:06 Add more details
    2010年4月22日 12:04
  • 你好!

    具体方法我上面说了络绎也做了详细的解释,这里我再补充一下:

    1. 没有必要几秒就同步一次。

    2. 同步使用后台线程来做,不要影响界面操作。

    3. 怎么知道Access有新数据? 

    a. 每次同步时都保存最后一次的同步的最大时间(UpdateTime)。新数据 SQL 语句条件为 WHERE UpdateTime > 上次同步的时间

    b. 在 Access 表中增加字段,标实哪些已同步过。增、删、改操作后将这个字段重置为未同步。

    c. 还有一些需求,在同步完成后会删除 access 中的数据。那么只有 access 中有数据则都是需要同步的。


    知识改变命运,奋斗成就人生!
    • 已标记为答案 hkstb 2010年4月22日 13:34
    2010年4月22日 12:27
    版主
  • 非常感谢两位的热心帮助。我已经大概知道该怎么做了。谢谢!
    2010年4月22日 13:33