批量记录插入到 Access






2.71/5 (16投票s)
2007年1月5日
3分钟阅读

158633

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(); }
关注点
虽然我希望这能帮助到某人。如果能帮助到一个人,那么,我想说,拍拍他或者打个招呼吧…别再盯着我了!!!