C# 使用ADOX创建Access数据库

C# 使用ADOX创建Access数据库,c#,visual-studio,ms-access-2010,adodb,adox,C#,Visual Studio,Ms Access 2010,Adodb,Adox,我正在尝试创建一个由两个表组成的Access数据库。我在下面的方法的第88行获得System.Runtime.InteropServices.COMException。当我尝试将表附加到Catalog对象时,会发生异常。有人能解释一下出了什么问题以及如何解决这个问题吗 public bool CreateNewAccessDatabase(string fileName) { bool result = false; ADOX.Catalog cat =

我正在尝试创建一个由两个表组成的Access数据库。我在下面的方法的第88行获得System.Runtime.InteropServices.COMException。当我尝试将表附加到Catalog对象时,会发生异常。有人能解释一下出了什么问题以及如何解决这个问题吗

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

        ADOX.Catalog cat = new ADOX.Catalog();
        ADOX.Table provTable = new ADOX.Table();
        ADOX.Key provKey = new ADOX.Key();
        ADOX.Table locTable = new ADOX.Table();
        ADOX.Key locKey = new ADOX.Key();
        ADOX.Column provCol = new Column();
        ADOX.Column locCol = new Column();


        //Create the Province table and it's fields. 
        provTable.Name = "Provinces";
        provCol.Name = "id";
        provCol.Type = ADOX.DataTypeEnum.adInteger;
        provTable.Columns.Append(provCol);            
        provTable.Columns.Append("name", ADOX.DataTypeEnum.adVarWChar, 4);

        provKey.Name = "Primary Key";
        provKey.Columns.Append("id");
        provKey.Type = KeyTypeEnum.adKeyPrimary;

        //Create the Locations table and it's fields
        locTable.Name = "Locations";
        locCol.Name = "id";
        locCol.Type = ADOX.DataTypeEnum.adInteger;
        locTable.Columns.Append(locCol);
        locTable.Columns.Append("name", ADOX.DataTypeEnum.adVarWChar, 50);
        locTable.Columns.Append("price", ADOX.DataTypeEnum.adVarWChar, 8);

        locKey.Name = "Primary Key";
        locKey.Columns.Append("id");
        locKey.Type = KeyTypeEnum.adKeyPrimary;

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

            // Must create database file before applying autonumber to column
            provCol.ParentCatalog = cat;
            provCol.Properties["AutoIncrement"].Value = true;

            locCol.ParentCatalog = cat;
            locCol.Properties["AutoIncrement"].Value = true;

            cat.Tables.Append(provTable);  // <<< Exception triggered here
            cat.Tables.Append(locTable);

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

            result = true;
        }
        catch (Exception ex)
        {
            Debug.WriteLine(ex.StackTrace);
            result = false;
        }
        cat = null;
        return result;
    }
public bool CreateNewAccessDatabase(字符串文件名)
{
布尔结果=假;
ADOX.Catalog cat=new ADOX.Catalog();
ADOX.Table provTable=新的ADOX.Table();
ADOX.Key provKey=新的ADOX.Key();
ADOX.Table locTable=新的ADOX.Table();
ADOX.Key locKey=新的ADOX.Key();
ADOX.Column provCol=新列();
ADOX.Column locCol=新列();
//创建省表及其字段。
provTable.Name=“省”;
provCol.Name=“id”;
provCol.Type=ADOX.DataTypeEnum.adInteger;
provTable.Columns.Append(provCol);
provTable.Columns.Append(“name”,ADOX.DataTypeEnum.adVarWChar,4);
provKey.Name=“主键”;
provKey.Columns.Append(“id”);
provKey.Type=KeyTypeEnum.adKeyPrimary;
//创建位置表及其字段
locTable.Name=“位置”;
locCol.Name=“id”;
locCol.Type=ADOX.DataTypeEnum.adInteger;
locTable.Columns.Append(locCol);
locTable.Columns.Append(“name”,ADOX.DataTypeEnum.adVarWChar,50);
locTable.Columns.Append(“price”,ADOX.DataTypeEnum.adVarWChar,8);
locKey.Name=“主键”;
locKey.Columns.Append(“id”);
locKey.Type=KeyTypeEnum.adKeyPrimary;
尝试
{
cat.Create(“Provider=Microsoft.Jet.OLEDB.4.0;“+”数据源=“+fileName+”;Jet-OLEDB:Engine-Type=5”);
//必须先创建数据库文件,然后才能对列应用自动编号
provCol.ParentCatalog=cat;
provCol.Properties[“自动增量”]。Value=true;
locCol.ParentCatalog=cat;
locCol.Properties[“AutoIncrement”]。Value=true;

目录表追加(可验证);//您正在将文本字段声明为
ADOX.DataTypeEnum.adVarChar
,但所有Access
text
字段都能够存储Unicode,因此您需要将它们声明为
ADOX.DataTypeEnum.adVarWChar

确定。我根据请求更改了数据类型,但仍然得到相同的异常。@Alan您错过了第一个:
provable.Columns.Append(“name”,ADOX.DataTypeEnum.adVarChar,4);