C#使用ADOX创建Access库表后如何填充列数据
核心结论
ADOX仅负责数据库结构定义(建库、建表、修改列/索引等DDL操作),不提供数据写入能力。向表中填充数据需要在表结构创建完成后,通过标准SQL的INSERT语句执行写入。
你原有代码存在两个必须修正的问题:
- 连接字符串与目标文件格式不匹配:
Microsoft.Jet.OLEDB.4.0引擎最高只支持.mdb格式(Access 2003及更早版本),要创建.accdb格式必须使用Microsoft.ACE.OLEDB系列引擎,否则生成的文件本质是改了后缀的mdb,后续访问会出错。 - 操作顺序错误:必须先将表对象追加到
Catalog.Tables集合,完成表在数据库中的物理创建后,才能执行数据写入操作,你原来预留的代码位置在追加表之前,此时表还未实际存在,无法写入。
实现代码
首先需要确保项目添加了两个引用:
- COM组件:
Microsoft ADO Ext. x.x for DDL and Security(即ADOX) - 程序集:
System.Data(用于OleDb相关操作)
完整实现代码如下:
using ADOX; using System.Collections.Generic; using System.Data.OleDb; using System.Runtime.InteropServices; class AccessDbOperator { public void CreateAndFillAccessDb() { CatalogClass accessDB = new CatalogClass(); string filename = @"C:\PsAUTO.accdb"; // accdb格式对应ACE引擎,Engine Type=6对应Access 2007+的accdb格式 // 如果本机安装的是更高版本Office,可将Provider改为Microsoft.ACE.OLEDB.16.0 string connStr = @"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + filename + ";Jet OLEDB:Engine Type=6"; accessDB.Create(connStr); // 定义表结构 Table nTable = new Table(); nTable.Name = "MyTable"; // 文本列建议指定长度,避免默认长度不符合预期 nTable.Columns.Append("MyColumn", DataTypeEnum.adVarWChar, 255); // 先追加表,完成结构创建 accessDB.Tables.Append(nTable); Marshal.FinalReleaseComObject(nTable); // 待写入的字符串列表 List<string> MyList = new List<string> { "One", "Two", "Three" }; // 通过OleDb连接执行INSERT写入数据 using (OleDbConnection conn = new OleDbConnection(connStr)) { conn.Open(); // 用参数化查询,避免字符串含单引号等特殊字符时SQL执行失败 OleDbCommand insertCmd = new OleDbCommand("INSERT INTO MyTable(MyColumn) VALUES (@content)", conn); insertCmd.Parameters.Add("@content", OleDbType.VarWChar, 255); foreach (string item in MyList) { insertCmd.Parameters["@content"].Value = item; insertCmd.ExecuteNonQuery(); } } // 释放所有COM资源 Marshal.FinalReleaseComObject(accessDB.Tables); Marshal.FinalReleaseComObject(accessDB.ActiveConnection); Marshal.FinalReleaseComObject(accessDB); } }
补充说明
- 如果不需要accdb格式,可直接将文件名后缀改为
.mdb,连接字符串换回Provider=Microsoft.Jet.OLEDB.4.0;Jet OLEDB:Engine Type=5,不需要额外安装ACE引擎即可运行。 - 不要通过字符串拼接的方式组装INSERT语句,参数化查询是更稳妥的写法,能避免特殊字符转义问题和SQL注入风险。
内容的提问来源于stack exchange,提问作者Saimon Cavallari
相关产品推荐
相关产品推荐

