如何在C#程序中以编程方式创建Microsoft Access数据库?

20

如果还没有Microsoft Access数据库文件,如何使用C#创建它?


它必须是Access,还是您正在寻找基于文件的数据库解决方案来存储数据?如果只需要这些,SQLite很好且便携。 - Jeff LaFay
是的,我现在在Android上使用SQLite。 - LEMUEL ADANE
4个回答

20

最简单的答案是在程序中嵌入一个空的.mdb / .accdb文件,并将其写入磁盘。

正确的答案是使用ADOX库的COM互操作:

var cat = new ADOX.Catalog()
cat.Create(connectionString);

请记得使用 OleDbConnectionStringBuilder 来生成您的连接字符串。


6
提示:在我的计算机上,“ADOX库”可以作为“Microsoft ADO Ext. 6.0 for DDL and Security”找到。 - Matthias
我遇到了一个错误:System.Runtime.InteropServices.COMException 类未注册 - reguieg younes
有人知道为什么会出现“类未注册”的错误吗? - g00n3r
@g00n3r 您是否安装了 Office 或 Access 版本? - Zev Spitz

17
尝试:
using ADOX; //Requires Microsoft ADO Ext. 2.8 for DDL and Security
using ADODB;

public bool CreateNewAccessDatabase(string fileName)
{
bool result = false; 

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

//Create the table and it's fields. 
table.Name = "Table1";
table.Columns.Append("Field1");
table.Columns.Append("Field2");

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

    //Now Close the database
    ADODB.Connection con = cat.ActiveConnection as ADODB.Connection;
    if (con != null)
    con.Close();

    result = true; 
}
catch (Exception ex)
{
    result = false;
}
cat = null;
return result;
} 

http://zamirsblog.blogspot.com/2010/11/creating-access-database.html


1
不错的例子! 记得using ADODB; // 在 .Net Framework 中需要 ADODB - someone

13

在我的电脑上,Windows 7 sp1 专业版 64 位操作系统中,我发现了 Microsoft ADO Ext. 2.8 for DDL and Security,它位于C:\Program Files\Common Files\System\ado\msadox28.dll

它也被找到了一个引用:

enter image description here

它作为ADOX被包括在引用中

enter image description here

默认情况下,列被创建为text[255]。以下是一些以不同数据类型创建列的示例。

table.Columns.Append("PartNumber", ADOX.DataTypeEnum.adVarWChar, 6); // text[6]
table.Columns.Append("AnInteger", ADOX.DataTypeEnum.adInteger); // Integer 

我找到了这个数据类型列表,可以用于创建和读取Access数据库字段

文本 = adVarWChar

备注 = adLongVarWChar

数字(字节) = adUnsignedTinyInt

数字(整数) = adSmallInt

数字(长整数)= adInteger

数字(单精度)= adSingle

数字(双精度)= adDouble

数字(复制 ID)= adGuid

数字(小数)= adNumeric

日期/时间 = adDate

货币 = adCurrency

自动编号 = adInteger

是/否 = adBoolean

超链接 = adLongVarWChar


1
注意到了评论。只是在跟进Zamir的评论。 - Jim Lahman
关于制作自动编号列的问题,只是提醒一句:需要将“AutoIncrement”值设置为true。这个设置应该在创建目录之后进行,在设置父目录为目录时,然后将该列的“Properties["AutoIncrement"].Value”设置为true。 - Imad Nabil Alnatsheh

1
你可以在DAO/ACE库中使用CreateDatabase方法(它已经安装在Office中,或者可以从这里下载)。
// using Microsoft.Office.Interop.Access.Dao;
// using static Microsoft.Office.Interop.Access.Dao.DatabaseTypeEnum;

const string dbLangGeneral = ";LANGID=0x0409;CP=1252;COUNTRY=0";

var engine = new DBEngine();
var dbs = engine.CreateDatabase(@"c:\path\to\database.accdb", dbLangGeneral, dbVersion120);
dbs.Close();
dbs = null;

请注意,根据您希望支持的Access/Jet版本,您可以使用DatabaseTypeEnum枚举中的其他值:
  • dbVersion10
  • dbVersion11
  • dbVersion20
  • dbVersion30
  • dbVersion40
  • dbVersion120
  • dbVersion140
  • dbVersion150
此外,请注意您可以选择加密数据库或选择不同的排序规则。
注意:如果您有一台64位机器,并且想将代码作为64位程序的一部分运行,则需要64位引擎版本。如果您已经安装了32位版本(通过Office或下载安装),则必须使用/passive/silent标志运行64位安装程序;否则,您将收到一个消息,说明无法在以前安装的32位组件上安装64位组件。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接