当其它程序写入记录数据库中后,我要立即取得其输入的数据,以写入到我的数据库中,用C#怎么做?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了当其它程序写入记录数据库中后,我要立即取得其输入的数据,以写入到我的数据库中,用C#怎么做?相关的知识,希望对你有一定的参考价值。

在不用触发器的情况下,是否有实现的方法?请高人指点.
谢谢大家的回答,虽然不能解决问题。问题已经有了一个解决方案,在这里愿和大家分享。

数据库同步的方式有4种:全表复制,根据时间戳同步,使用触发器同步,使用oracle CDC同步。

1、全表复制:如果表不大,对实时性要求不高,可以采用全表复制的方式进行数据库同步。
2、根据时间戳同步:如果要同步的表有时间戳,记录了表中数据的插入时间,更新时间。则可以根据时间戳进行同步。
3、使用触发器同步:在要同步的表上加触发器,当有增加,删除,修改操作时在临时表中记录增加,删除,修改的记录的id,从临时表中查询出记录的id和操作类型(增加,删除,修改),然后进行相应处理。
4、使用oracle CDC同步:CDC有两个模式:同步和异步。同步CDC主要是采用触发器记录新增数据,基本能够做到实时增量抽取。而异步CDC则是通过分析已经commit的日志记录来得到增量数据信息,有一定的时间延迟,并且提供了到Oracle Streams的接口。同步CDC在企业版或者标准版中都可以使用,异步CDC则只包含在企业版中。注意CDC在9i和10g中有了比较大的改变,异步CDC主要采用了和Streams相同的技术。

参考技术A 我的思路是
可以使用客户端提交刷新(可以使用定时器控件) 1000ms刷新一次,如果客户端很多不适合该方法;

新开一条socket通道, 每1000ms 监听服务器刷新信息, 如果监听到服务器刷新标志.
那么立即提交form到服务器 请求最新的datatable
参考技术B 一般是对数据库的表都会有一些字段,比如时间戳来记录记录产生的时间和操作者。
你可以在你的c#里去判断这些值然后去抽取数据到你的数据库中去。
看样子,你要组个实时的,做的service之类的让他一直运行吧追问

我所说的源数据库并不是由我所建,而是其它应用系统建的,我并不能对其进行任何修改,也不能在已有的表中增加触发器之类的东西。如果不停地从数据库取数据后进行比较,效率十分低下,且对数据库服务器的负担增加很多。因此不予采用。

追答

所以你要分析原数据,表结构等来做出设计。我只是给了你一些标准的做法

mysql写入后立即读取数据?

【中文标题】mysql写入后立即读取数据?【英文标题】:Mysql read data immediately after writing? 【发布时间】:2009-11-27 11:17:19 【问题描述】:

我正在使用 MySQL DB 和 Java JDBC 客户端来访问它。

我有一个包含会话信息的表。每个会话都与一个 SessionToken 相关联。此令牌是一些会话值的哈希的 Base64 编码字符串。它应该是独一无二的。并在数据库中定义为 varchar(50)。

当我尝试通过其令牌查找会话时,我使用如下 sql 语句查询数据库:

select SessionId, ClientIP, PersonId, LastAccessTime, SessionCreateTime from InkaSession where SessionToken like 'exK/Xw0imW/qOtN39uw5bddeeMg='

我有一个测试这个功能的单元测试,它总是失败,因为查询没有返回任何会话,即使很难,我刚刚将会话写入数据库。

我的单元测试执行以下操作:

Create Connection via DriverManager.getConnection
Add a session via Sql Insert query
close the connection

create Connection via DriverManager.getConnection
look for the session via sql select
unit test fails, because nothing found

当我使用调试器单步执行此 UnitTest 并将即将发送到 db 的 select sql 复制到 mysql 命令行中时,它工作正常,并且我得到了会话行。

我还尝试通过请求较旧的 SessionToken 从数据库中检索较旧的会话。这也很好。如果我在插入 SessionToken 后立即要求它,它只会失败。

所有连接都在 AutoCommit 上。尽管如此,我还是尝试将事务级别设置为“未提交读取”。这也不起作用。

还有什么建议吗?

【问题讨论】:

【参考方案1】:

这通常是由于插入和选择之间的连接未提交造成的。

你基本做到以下几点了吗?

statement.executeUpdate("INSERT INTO session (...) VALUES (...)");
connection.commit();
resultSet = statement.executeQuery("SELECT ... FROM session WHERE ...");

编辑我在 MySQL 5.1.30 和 Connector/J 5.1.7 上尝试了以下 SSCCE:

public static void main(String[] args) throws Exception 
    Class.forName("com.mysql.jdbc.Driver");
    Connection connection = null;
    Statement statement = null;
    ResultSet resultSet = null;
    try 
        connection = DriverManager.getConnection("jdbc:mysql://localhost/javabase", "root", null);
        statement = connection.createStatement();
        statement.executeUpdate("INSERT INTO foo (foo) VALUES ('foo')");
        resultSet = statement.executeQuery("SELECT id FROM foo WHERE foo = 'foo'");
        if (resultSet.next()) 
            System.out.println(resultSet.getLong("id"));
         else 
            System.out.println("Not inserted?");
        
     finally 
        SQLUtil.close(connection, statement, resultSet);
    

完美运行。可能是您的 JDBC 驱动程序有问题。尝试升级。

【讨论】:

是的,这基本上就是我所做的。除此之外,由于 SQL 语法错误,commit() 将失败。我觉得很奇怪。我改为关闭()连接。无论如何,在自动提交模式下,这应该不是必需的,不是吗?此外,数据保留在数据库中,所以我认为没有任何未完成的事务。有什么办法可以确定吗? 还尝试禁用自动提交并明确提交。这有效(即 commit() 不再引发异常),但不能解决问题。【参考方案2】:

已解决:两个不同的标记字符串。其中一个最后有几个零字节。 (由于加密和解密和填充......)这两个字符串在视觉上是相同的,但是 MySQL 和 Java 都说,它们不是。 (而且他们和往常一样)

【讨论】:

以上是关于当其它程序写入记录数据库中后,我要立即取得其输入的数据,以写入到我的数据库中,用C#怎么做?的主要内容,如果未能解决你的问题,请参考以下文章

二叉树的前中后序遍历迭代&广度遍历

在 ImageView 中显示图像并将其保存到 Android 上的内部存储中

[Javascript摸鱼记录] 关于js简单字符删减替换增加插入追加前中后处理

mysql写入后立即读取数据?

我要面试了,给些java面试基础问题,在线等

汇编实验-显示缓冲区的内容