65.9K
CodeProject 正在变化。 阅读更多。
Home

批量记录插入到 Access

2007年1月5日

3分钟阅读

viewsIcon

158633

downloadIcon

5653

本文演示了如何使用 MS Access 执行批量“插入”。

引言

本文展示了一种使用 OleDbDataAdapter 将多个新记录(行)插入到 MS Access 数据库的方法。

背景

在 Code Project 上,我经常看到帖子寻求帮助,关于向数据库批量更新新记录的问题。我也在其他网站上看到过这个问题。回想我刚开始学习数据库时,这也是一个对我来说很重要的问题。有时你可以在网上或书籍中找到解决问题的真正有用的信息,但有时却找不到。因此,我决定写这篇文章。

使用代码

此应用程序将模拟读取某些文件中的电表读数,并将它们加载到 Access 数据库中。读数每 15 分钟读取一次。同时读取四个电表。这些数据以 256 位(或 8 个不同的读数集合)的形式写入文件中的一行。每个电表读数长度为 8 位,每个读数集合总共 32 位。

所以问题是:逐行读取文件,将该行分解为读数集合,并将它们放入数据表。在读取文件并填充数据表后,将新记录插入到数据库中。

数据示例

0006100000000000000250000074800000062000000000000002400000752000

这是接受 Stream Reader 已经读取的行的方法,将其分解为读数集合,并创建一个新行(记录 DR)。然后将该集合添加到数据表(DT)。

        private void ProcessLine()
        {
            int Position = 0;    //Position in the StreamReader Line
            const int Skip = 8;  //Each Reading is 8 characters long
            while (Position < Line.Length)
            {
                DataRow DR = DT.NewRow();
                DR["Meter1"] = Convert.ToInt32(Line.Substring(Position, Skip));
                Position += Skip;
                DR["Meter2"] = Convert.ToInt32(Line.Substring(Position, Skip));
                Position += Skip;
                DR["Meter3"] = Convert.ToInt32(Line.Substring(Position, Skip));
                Position += Skip;
                DR["Meter4"] = Convert.ToInt32(Line.Substring(Position, Skip));
                Position += Skip;
                DT.Rows.Add(DR);
            }
        }

让我退一步,向您展示我如何获取数据表。在这里,我在数据库类中有一个静态方法,该方法返回一个 DataTable。我使用“SELECT”SQL 语句来检索将接收电表读数的数据表。如果您查看“WHERE”子句,您会看到我尝试检索 ReadingID 为 0 的记录。重要的是要知道 ReadingID 是表的自动编号/主键。它将不会有 ReadingID = 0 的记录。这只是获取表布局的一种快速方法。

        public static DataTable LoadDT(string DB)
        {
            CheckTables(DB);
            DataTable DT = new DataTable();
            string ConnString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + DB +
                                ";User Id=admin;Password=;";
            string SQL = "SELECT * FROM MeterReadings WHERE ReadingID=0";

            OleDbConnection OleConn = new OleDbConnection(ConnString);
            OleDbDataAdapter OleAdp = new OleDbDataAdapter(SQL, OleConn);
            OleConn.Open();
            OleAdp.Fill(DT);
            OleConn.Close();
            return DT;
        }

现在,在处理完文件并准备将新记录插入到数据库后。我们需要一种快速简便的方法来做到这一点。因此,查看下一段代码,您会看到我使用与创建数据表时相同的 SQL SELECT 创建了一个数据适配器。这只是为了确保进入数据库的一切都与从中取出的内容相同。我分配一个 SQL INSERT 添加我的参数,然后执行数据适配器的 Update 方法。

        public static void UpDataDB(string DB, DataTable DT)
        {
            string ConnString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + DB +
                                ";User Id=admin;Password=;";
            string SQL = "SELECT * FROM MeterReadings WHERE ReadingID=0";
            string INSERT = "INSERT INTO MeterReadings(Meter1, Meter2, Meter3, Meter4) " +
                            "VALUES (@Meter1, @Meter2, @Meter3, @Meter4)";

            OleDbConnection OleConn = new OleDbConnection(ConnString);
            OleDbDataAdapter OleAdp = new OleDbDataAdapter(SQL, OleConn);
            OleAdp.InsertCommand = new OleDbCommand(INSERT);
            OleAdp.InsertCommand.Parameters.Add("@Meter1", OleDbType.Integer, 8, "Meter1");
            OleAdp.InsertCommand.Parameters.Add("@Meter2", OleDbType.Integer, 8, "Meter2");
            OleAdp.InsertCommand.Parameters.Add("@Meter3", OleDbType.Integer, 8, "Meter3");
            OleAdp.InsertCommand.Parameters.Add("@Meter4", OleDbType.Integer, 8, "Meter4");
            OleAdp.InsertCommand.Connection = OleConn;
            OleAdp.InsertCommand.Connection.Open();
            OleAdp.Update(DT);
            OleAdp.InsertCommand.Connection.Close();
        }

关注点

虽然我希望这能帮助到某人。如果能帮助到一个人,那么,我想说,拍拍他或者打个招呼吧…别再盯着我了!!!

© . All rights reserved.