如何从 MySQL 数据库的内容中即时创建 Access DB 并在本地保存

Posted

技术标签:

【中文标题】如何从 MySQL 数据库的内容中即时创建 Access DB 并在本地保存【英文标题】:How to Create Access DB on the fly from contents of MySQL database and save Locally 【发布时间】:2013-01-19 16:08:47 【问题描述】:

我有一个用于公司库存的远程 mysql 数据库。库存数据库是我们分包设备的所有地点的主数据库。每个物业都有自己的库存,对于季度库存,每个地点都需要携带笔记本电脑和扫描仪,扫描他们的库存,然后将其同步到主数据库。

问题在于并非所有位置都可以访问 Internet,因此我需要将数据库复制到本地文件。并发不是问题,因为只有一个客户端会同时连接到数据库,并且每个位置的数据库都相对较小,基本上由

我已经在 HD 上创建了一个 Access 文件,但我无法从 MSDN 中真正了解如何创建具有特定架构的文件或如何将我的 SELECT 语句中的相关数据插入到所述数据库中。我一直在寻找动态创建表适配器并使用 .NET 的内置方法进行数据传输,但我仍然找不到如何以编程方式创建具有特定模式的 MS Access 文件。如果有人以前遇到过这样的问题,我将不胜感激任何可以提供的见解。我基本上需要将 SELECT 语句的结果复制到我将在本地存储的 MS Access 数据库中。我已经准备好所有其他代码。

我目前正在使用相当笨拙的查询和 foreach 循环来完成我的繁琐工作,但我希望有一个更优雅的解决方案,也许使用动态创建的数据源。

ADOX.Catalog cat = new ADOX.Catalog();

        cat.Create("Provider=Microsoft.Jet.OLEDB.4.0;" + "Data Source="+ fileName + ";" + "Jet OLEDB:Engine Type=5");

        string conString = @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + fileName + ";" + "User Id=admin;Password=;";

        OleDbConnection con = new OleDbConnection(conString);

        con.Open();

        //create command to generate database schema
        OleDbCommand command = new OleDbCommand();
        command.CommandText = @"CREATE TABLE items (
            [category] VARCHAR(16) NOT NULL,
            [manufacturer] VARCHAR(32) NOT NULL,
            [model] VARCHAR(32),
            [description] TEXT NOT NULL,
            [serial_number] VARCHAR(64),
            [barcode] VARCHAR(8) NOT NULL PRIMARY KEY,
            [property] VARCHAR(4) NOT NULL,
            [present] TINYINT
        )";

        command.Connection = con;
        command.ExecuteNonQuery();

        OleDbCommand cmdInsert = new OleDbCommand();
        cmdInsert.CommandText = "INSERT INTO items([category],[manufacturer],[model],[description],[serial_number],[barcode],[property],[present]) VALUES (@cat,@man,@mod,@desc,@ser,@bar,@prop,@pres)";
        cmdInsert.Connection = con;

        foreach (DataRow row in itemsTableAdapter1.GetData())
        
            cmdInsert.Parameters.AddWithValue("@cat",row.ItemArray[0].ToString());
            cmdInsert.Parameters.AddWithValue("@man", row.ItemArray[1].ToString());
            cmdInsert.Parameters.AddWithValue("@mod", row.ItemArray[2].ToString());
            cmdInsert.Parameters.AddWithValue("@desc", row.ItemArray[3].ToString());
            cmdInsert.Parameters.AddWithValue("@ser", row.ItemArray[4].ToString());
            cmdInsert.Parameters.AddWithValue("@bar", row.ItemArray[5].ToString());
            cmdInsert.Parameters.AddWithValue("@prop", row.ItemArray[6].ToString());
            cmdInsert.Parameters.AddWithValue("@pres", row.ItemArray[7]);
            cmdInsert.ExecuteNonQuery();
            cmdInsert.Parameters.Clear();
        
        con.Close();
        cat = null;

【问题讨论】:

【参考方案1】:

我之前尝试过这样做,但发现为了创建一个新的 AccessDB,我实际上必须复制一个现有数据库以及我需要的所有表等。

你能使用sqlite?吗?它很小,很稳定,并且库可用于大多数语言。您将能够在客户端计算机上创建您喜欢的任何结构。

【讨论】:

人们必须能够在没有我帮助的情况下在场外使用它。我无法在他们将要使用的每台计算机上设置 sqlite。上面的代码有效。它创建一个 Access 数据库,将文件存储在本地,然后打开它并从远程 mySQL 服务器复制所有相关数据。我只是希望有一种更简洁的方式涉及 .NET 的数据结构。 至于你对Access的困扰,使用上面的代码,它实际上是凭空创建了一个数据库并将其存储在本地硬盘上。 @spuy767 我仍然认为托比的观点是有效的。将已创建但为空的数据库复制到本地计算机然后填充表,甚至填充然后复制会更快更容易。访问是基于文件的,因此将其视为文件。但是,我同意 sqlite 不是答案。

以上是关于如何从 MySQL 数据库的内容中即时创建 Access DB 并在本地保存的主要内容,如果未能解决你的问题,请参考以下文章

MySQL 行的小计与总计

如何即时从 hyper::Response 解压缩 XZ 数据?

使用ElasticSearch服务从MySQL同步数据实现搜索即时提示与全文搜索功能

oracle sql中的动态列

在 django 中填充字段(添加新的)

LAMP:如何从远程 URL/文件创建 .Zip 并将其即时流式传输到客户端