批量插入后选择在 MS access 数据库中不起作用

Posted

技术标签:

【中文标题】批量插入后选择在 MS access 数据库中不起作用【英文标题】:Select after bulk insert doesn't work in MS access database 【发布时间】:2017-11-30 02:57:34 【问题描述】:

有一个 Windows 窗体应用程序。我正在使用 MS Access 数据库进行一些数据操作。我想将数据从一个数据库复制到另一个数据库。两个表中的表名、架构和数据类型相同。

我正在使用以下查询通过从源数据库中选择数据来批量插入目标数据库中的数据。

INSERT INTO [Table1] IN 'C:\Data\Users.mdf' SELECT * FROM [Table1]

插入数据后,我正在查询目标表以获取插入的数据。我正在使用 OleDbConnection 执行数据库操作。

我在这里面临的问题是,在执行 SELECT 语句以获取数据时执行上述 INSERT 查询后,我没有获取数据。但是,当我在调试模式下检查时,我正在获取数据。

我注意到,如果我在执行 INSERT 语句后等待一段时间,则数据正确。所以我假设它需要一些时间(延迟?)来完成批量插入操作。

我尝试在 INSERT 查询执行后提供Task.Delay(20000),但没有运气。有人可以在这里帮助我,我该如何解决这个问题?非常感谢任何帮助。

【问题讨论】:

我们在谈论多少数据?你有没有打开表格查看它并检查数据是否正确输入?我可能只是将源表导入目标数据库并执行适当的重写查询。然后它至少消除了两个独立数据库之间的通信中可能出现的问题。 大约有 70 万条记录。但我也可以用 10 条记录复制这个问题。在 INSERT 操作发生之前,源数据库和目标数据库的数据库连接都是打开的。 我建议你发布整个过程。 有时这可以通过在事务内部执行插入来解决。开始事务,执行语句,然后提交事务。为此,您必须声明一个工作区对象才能打开/关闭事务,但是当我想更快地强制提交数据时,这有时是实现它的技巧。 【参考方案1】:

我没有找到解决此问题的好方法,但也解决了这个问题。将数据插入表后,我正在触发另一个查询以检查插入的表中是否有任何数据。这发生在do..while 循环中,如下所示。每次操作完成时都会删除该表。

        var insertQuery = "INSERT INTO [Table1] IN 'C:\Data\Users.mdf' SELECT * FROM [Table1]";
        ExecuteQuery(insertQuery, connProd);

        var count = 10;

        do
        
            var selectQuery = "SELECT TOP 1 * FROM " + tableProdCopy;
            var dtTopRowData = GetQueryData(selectQuery, connOther);

            if (dtTopRowData != null && dtTopRowData.Rows.Count > 0)
            
                count = 0;
                break;
            

            System.Threading.Thread.Sleep(2000);

            count = count - 1;
         while (count > 0);


        private DataTable GetQueryData(string query, OleDbConnection conn)
        
            using (OleDbCommand cmdOutput = new OleDbCommand(query, conn))
            
                using (OleDbDataAdapter adapterOutput = new OleDbDataAdapter(cmdOutput))
                
                    var dtOutput = new DataTable();

                    adapterOutput.Fill(dtOutput);

                    return dtOutput;
                
            
        



        private void ExecuteQuery(string query, OleDbConnection conn)
        
            using (OleDbCommand cmdInput = new OleDbCommand(query, conn))
            
                cmdInput.ExecuteNonQuery();
            
        

【讨论】:

以上是关于批量插入后选择在 MS access 数据库中不起作用的主要内容,如果未能解决你的问题,请参考以下文章

HIbernate 批量插入或更新在 Spring Boot 中不起作用

从 MS Access 批量导入并插入 Sql Server [关闭]

更新查询在带有 MS Access 的 VB.NET 中不起作用

在 ms access 2010 中将查询结果插入表中

尝试使用 C# 将数据插入 MS Access 数据库,但插入命令不起作用

在 ms 访问中不起作用的日期之间的比较