【问题标题】:How to create an Access database at runtime in C#?如何在 C# 中在运行时创建 Access 数据库?
【发布时间】:2010-11-26 05:09:20
【问题描述】:

如何在 C# 中在运行时创建 Access 数据库?

【问题讨论】:

标签: c# database ms-access


【解决方案1】:

您需要做的第一件事是获取对 Microsoft ADO Ext 的 COM 引用。 X.X 用于 DDL 和安全性。 X.X 代表您机器上碰巧拥有的任何版本。我的曾经是 2.7 版,但在 Visual Studio 2008 中,它已更新到 6.0。

alt text http://blog.jrpsoftware.com/content/binary/WindowsLiveWriter/CreateanAccessDatabaseinC_10DDD/AddReference_2.png

添加引用后,ADOX 将添加到代码的 using 部分。

alt text http://blog.jrpsoftware.com/content/binary/WindowsLiveWriter/CreateanAccessDatabaseinC_10DDD/Using_2.png

接下来,您将要为数据库创建目录。将您希望的文件名插入以下字符串并将其传递给 CatalogClass。

CatalogClass cat = new CatalogClass();  
string tmpStr;  
string filename = "Sample.MDB";   
tmpStr = "Provider=Microsoft.Jet.OLEDB.4.0;";   
tmpStr += "Data Source=" + filename + ";Jet OLEDB:Engine Type=5";  
cat.Create(tmpStr);

下一步是为您的数据库创建表和列。这是一个非常简单的操作,如下例所示。

 Table nTable = new Table(); 
 nTable.Name = "PersonData"; 
 nTable.Columns.Append("LastName", DataTypeEnum.adVarWChar, 25);
 nTable.Columns.Append("FirstName", DataTypeEnum.adVarWChar, 25);
 nTable.Columns.Append("Address 1", DataTypeEnum.adVarWChar, 45);
 nTable.Columns.Append("Address 2", DataTypeEnum.adVarWChar, 45); 
 nTable.Columns.Append("City", DataTypeEnum.adVarWChar, 25);
 nTable.Columns.Append("State", DataTypeEnum.adVarWChar, 2);
 nTable.Columns.Append("Zip", DataTypeEnum.adVarWChar, 9);
 cat.Tables.Append(nTable);

最后一步非常重要,否则关闭应用程序时会出错。添加完所有表和列后,您需要以正确的顺序正确释放 com 对象。

System.Runtime.InteropServices.Marshal.FinalReleaseComObject(nTable); 
System.Runtime.InteropServices.Marshal.FinalReleaseComObject(cat.Tables);    
System.Runtime.InteropServices.Marshal.FinalReleaseComObject(cat.ActiveConnection); 
System.Runtime.InteropServices.Marshal.FinalReleaseComObject(cat);

就是这样。您现在应该有一个可以写入的 Access 数据库。希望这会有所帮助。

参考:John Russell Plant - Create an Access Database in C#

【讨论】:

  • 我认为 John Feminella 已经在他的回答中发布了这篇文章的链接。
  • 参考链接也坏了
【解决方案2】:

创建一个空白的访问数据库并将其存储在您的资源文件中。

现在,无论何时您想使用它,从您的资源中获取该数据库并将其复制到您想要的任何位置,将其重命名为您想要的任何名称并执行您的数据库设置脚本以创建默认表并在其中加载值。

【讨论】:

    【解决方案3】:

    试试:

    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

    【讨论】:

    • 对于那些不清楚的人:您可以在添加引用的 COM 选项卡下找到 Microsoft ADO Ext. 2.8 for DDL and Security 引用,而不是 .NET 引用。
    【解决方案4】:

    这篇文章来自 John Russell Plant,通过代码示例详细说明了您将如何做到这一点。分为三个步骤:

    1. 创建目录。
    2. 创建表。
    3. 释放相关的 COM 对象。

    【讨论】:

    • 与我的方法相比,我会建议这样做。 :)
    • 链接似乎已失效。
    【解决方案5】:
    static void IF_EXISTS_DELETE_AND_CREATE(string cn)
    {
        //cn = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source =";
        //cn += AppDomain.CurrentDomain.BaseDirectory.ToString() + "test.mdb"; 
        try
        {
            OleDbConnection connection = new OleDbConnection(cn);
            object[] objArrRestrict;
            objArrRestrict = new object[] { null, null, null, "TABLE" };
            connection.Open();
            DataTable schemaTable = connection.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, objArrRestrict);
            connection.Close();
            string[] list;
            if(schemaTable.Rows.Count > 0)
            {
                list = new string[schemaTable.Rows.Count];
                int i = 0;
                foreach (DataRow row in schemaTable.Rows)
                {
                    list[i++] = row["TABLE_NAME"].ToString();
                }
                for ( i = 0; i < list.Length; i++)
                {
                    if(list[i] == "TEMP")
                    {
                        string deletedl = "DROP TABLE TEMP";
                        using (OleDbConnection conn = new OleDbConnection(cn))
                        {
                            using (OleDbCommand cmd = new OleDbCommand(deletedl, conn))
                            {
    
                                conn.Open();
                                cmd.ExecuteNonQuery();
                                conn.Close();
                            }
                        }
                        break;
                    }
                }
            }
            string ddl = "CREATE TABLE TEMP (USERID INTEGER NOT NULL,[ADATE] TEXT(20), [ATIME] TEXT(20))";
            using(OleDbConnection conn = new OleDbConnection(cn))
            {                    
                using(OleDbCommand cmd = new OleDbCommand(ddl, conn))
                {
                    conn.Open();
                    cmd.ExecuteNonQuery();
                    conn.Close();
                }
            }
        }
        catch (System.Exception e)
        {
            string ex = e.Message;
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-05-24
      • 1970-01-01
      • 2011-06-14
      • 2010-11-04
      • 1970-01-01
      • 1970-01-01
      • 2016-04-13
      • 1970-01-01
      相关资源
      最近更新 更多