现在做一个2次开发,需要使用A软件产生的实时数据,但是A软件使用的是ACCESS而且A软件每月会自动备份数据库并清除当前数据库,现在我开发B软件使用MSSQL数据库,需要调用A软件数据,请各位指点如何高效读取A软件产生的实时数据?A:做C程序运行在A程序计算机,实时刷新A程序使用的数据库,并将A程序产生的新数据发送到B程序使用的数据库内。B:B程序实时远程扫描A程序使用的数据库,并将A程序产生的新数据发送到B程序使用的数据库内。
或者还有什么好的方法,请大家提供!!

解决方案 »

  1.   

    我个人认为还是用一个程序测一下A软件数据库的字节数大小,一但有变化就说明要更新啊,而且你可以控制A程序达到多少更新数量就更新一次B,就这样就不用一直去读数据库,你觉得效果是不是好点?
      

  2.   

    检测mdb文件的修改时间,有变化再去读取数据。
      

  3.   

    通过remoting访问A程序使用的数据库进行数据获取。
      

  4.   

    用Cache  以来一个mdb 文件就好了 
    当缓存过期 调用委托出发一个 方法 不就搞定了?
      

  5.   

    定期可以查询一下远程access,sql连接字符串里可以连接其他机器的access,然乎定期获取一下数据是否更新,更新了,就把数据取出来,进行同步
      

  6.   

    A 软件是人家写的软件,不能修改的!!只能读取A软件使用的ACCESS数据库!!
      

  7.   

    做一个timer 定时器  刷新数据库
      

  8.   

    如果A软件实时操作A数据库,那如何实时对A数据库最优监控并读取最新数据呢?
      

  9.   

    有几个地方可能会比较麻烦,就是A软件会自动备份数据并清空数据库
    如果定时取数的间隔太长的话可能会引起部分数据丢失,比如B软件5分钟取一下数,但A软件在这5分钟之内写入了新的数据,然后又清空了数据库,B软件在5分钟之后取出的数据是不完整的
    如果定时取数的间隔设的太短,而同时A软件的数据库比较大的话,会导致Access的性能急剧下降,可能前一次取数还没结束,下一次的取数又开始了
    还有就是A软件是否对数据库进行独占,如果独占的话,B软件就没办法在A软件运行的时候去读取数据库
      

  10.   

    现在出现一个问题,我做的监控软件,在开发计算机上运行正常,数据传输OK,但是在运行A软件的计算机上数据传输失败,使用软件查询数据也一切正常,本地,远程都可以查询到数据,但是就是不能正常地把本地读取的数据传送到SQL服务器内,找1台网内的计算机,运行,把A软件的数据库远程共享,也运行正常!!郁闷,不知道哪里错误了!!
      

  11.   

    测试时,发现对方运行时对数据库独享,因此编写一个COPY的批处理网络拷贝过来读取,然后删除,时间间隔10秒,感觉太危险了,网络、程序等都可以引起运行失败!求新的解决方法!!
      

  12.   

    晕!!连个UP的都没有!!看看我的历史帖子,一般UP都有分的!!
      

  13.   

    这种情况确实没有什么特别完美的解决方法。为了保证A、B两程序的稳定,可以这样做:
    在A机上建立自己建立一个MySql库并运行程序C,C负责把ACCESS库复制到本机的某个目录中,同时打开这个复制的ACCESS库把数据插入到自己建立的MySql库,这样保证了A程序不受影响。然后B程序再远程连接这个MySql库,这样避免了ACCESS库的独占问题,即使网络出现问题,B程序也不会出现不稳定。
      

  14.   


    发现A软件的数据被独享,B软件没有办法远程打开查询!!!观察其数据库大小,如果改变,进行远程COPY到本地,在打开临时副本,进行数据读取反之不打开,等待下一次对比!!但是如果A软件15秒左右更新一次数据,等于说我需要20秒左右远程COPY一次数据库到本地,然后打开数据库进行数据读取,感觉频率太大,延时有担心B软件数据同步太慢,太快又担心高频率读写数据对硬盘可能有损伤!!现寻求一好的解决方案!!
      

  15.   

    关于mdb的操作可以查看。
    http://blog.csdn.net/gisfarmer/archive/2009/01/04/3701136.aspx#999696
      

  16.   

    检测MDB文件的时间最好,时间变化则重新读
      

  17.   


    Oracle的SOA产品有这么个功能,原理是监控服务,个人感觉这是最好的办法。以上没有人提到过这种方案,但是这种方案如何实施,没有头绪。也就是如何监控JET?
      

  18.   

        (1)我们先在VS的IDE中创建名为“TestRemoteAccess”的新的解决方案来容纳前述用来实现远程处理的三个项目,首先向解决方案中添加名为“RemoteObject”的类库,然后将默认创建的类名更改为“CRemoteAccess”,并且继承于“MarshalByRefObject”,代码如下:using System;
    using System.Collections.Generic;
    using System.Text; 
    namespace RemoteObject
    {
     public class CRemoteAccess : MarshalByRefObject
     {}
    } ……
    public static string m_ConnString;
    ……
    public void SetRemoteAccessConnString(string Connstr)
    {
     m_ConnString = Connstr;
    }
    ……   成功连接了Access数据库后我们需要返回数据集给请求的客户端进行显示和编辑,在远程对象中我们声明了几个相关函数:private void LoadData(string SqlStr, string TableName)
    public void SaveData(DataTable ClientDataTable)
    public DataTable GetUserTable(string SqlStr, string TableName)   客户端可以传递SQL查询脚本通过调用 GetUserTable来获取相关数据库表的数据,并返回一个DataTable,然后可以将该DataTable附值给DataGridView以便将数据显示出来。GetUserTable通过调用私有的LoadData 函数来完成对数据的获取。SaveData函数用于将编辑过的数据集保存回本地Access数据库文件,代码如下:……
    m_connection.Open();
    m_adapter.Update(ClientDataTable);
    ……
       (2)远程对象创建完成,我们需要创建用于侦听该远程对象请求的服务端应用程序。在“TestRemoteAccess”解决方案中新建一个Windows窗体项目名为:“TestServer”,从工具箱中拖拽下几个组件,界面如下所示:    服务器程序TestServer除了具备远程访问对象的能力外,它最主要的作用就是获取实际的Access数据库文件路径,并且设置远程对象的数据库连接字符串。我们必须添加远程对象以及远程处理和网络通讯协议等的类库的引用。在服务器程序启动初始,需要创建远程对象的实例以及注册通信端口,然后调用RemotingConfiguration.RegisterWellKnownServiceType 方法,MSDN中关于该方法的描述是这样的:通过使用给定的参数初始化 WellKnownServiceTypeEntry 的新实例,将服务端上的对象 Type 注册为已知类型,所有知道已注册已知对象的 URI 的客户都可以获取该对象的代理。所谓URI即统一资源标识符 (Uniform Resource Identifier)。代码如下:……
    remotableObject = new RemoteObject.CRemoteAccess();
    TcpChannel channel = new TcpChannel(8080);
    ChannelServices.RegisterChannel(channel);
    RemotingConfiguration.RegisterWellKnownServiceType(typeof(RemoteObject.CRemoteAccess), "RithiaTestAccessServer", WellKnownObjectMode.Singleton);
    ……
       当选择了要进行存取的Access数据库文件后,我们需要调用远程对象的SetRemoteAccessConnString方法,该方法将保存在本次与服务器程序连接期间连接该Access数据库文件的连接字符串,代码如下:……
    ProviderStr = ProviderStrPart + txtAccessMdbFileName.Text + ";Jet OLEDB:Database Password=" + txtAccessPassword.Text;
    ……
    remotableObject.SetRemoteAccessConnString(ProviderStr);
    ……
       (3)最后我们创建用于连接和请求服务的客户端程序,它会通过调用服务器程序TestServer已经注册的远程对象来获取相关数据集,并将编辑过的数据保存回实际的数据库文件。在“TestRemoteAccess”解决方案中新建一个Windows窗体项目名为:“TestClient”,从工具箱中拖拽下几个组件,界面如下所示:    客户端程序需要知道服务器程序所运行在的计算机名称或IP地址以及侦听的端口号,然后创建远程对象的实例,并且创建DataTable以便接收返回的数据,代码如下:……
    string RemoteURL;
    Host = txtHost.Text;
    Port = txtPort.Text;
    RemoteURL = "tcp://" + Host + ":" + Port + "/RithiaTestAccessServer";
    try
    {
     TcpChannel chan = new TcpChannel();
     ChannelServices.RegisterChannel(chan);
     remoteObject = (RemoteObject.CRemoteAccess)Activator.GetObject(typeof(RemoteObject.CRemoteAccess), RemoteURL);
     RemoteDataTable = new DataTable();
     button3.Enabled = false;
    }
    catch (Exception E)
    {
     MessageBox.Show(E.Message.ToString());
    }
    finally
    {
    }
    ……   客户端程序根据服务程序所侦听的信道是TCP还是HTTP来注册相应的信道和端口号,并且组合成远程对象的Url,即Url= 信道://主机名:端口号/对象的Uri,然后创建远程对象的实例,就像使用本地对象一样可以对其进行存取,我们可以调用远程对象的GetUserTable方法获取指定查询脚本的结果集,代码如下:……
    RemoteDataTable = remoteObject.GetUserTable(txtSQL.Text, "Test");
    dataGridView1.DataSource = RemoteDataTable;
    ……   保存结果集时仅需简单调用SaveData方法即可,代码如下:……
    remoteObject.SaveData(RemoteDataTable);
    …… 
      

  19.   

    今天正式测试发现A软件的数据库达到700M多,复制COPY方法明显不行,寻求好的解决ACCESS独占的方法!!
      

  20.   

    问题自己解决了!!是用户权限问题,引起ACCESS数据独享的!!