You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.29 23:39:14