澳门新浦京娱乐场网站-www.146.net-新浦京娱乐场官网
做最好的网站

澳门新浦京娱乐场网站:调用ADOX创建ACCESS数据文

转载自:

记得以前要动态的创建Access数据库的mdb文件都是采用DAO,用VC开发,一大堆的API,很是麻烦。现在好像也鲜有人提起DAO。其实动态的创建mdb数据的最简单的方法还是ADOX。
      用ADOX创建access数据库方法很简单,只需要new一个Catalog对象,然后调用它的Create方法就可以了,如下:

//添加两个com组件引用//MicrosoftADOExt.2.8forDDLandSecurity//MicrosoftActiveXDataObjects2.8Library

首先引用msadox.dll和msjro.dll(C:Program FilesCommon FilesSystemado),msjro.dll可以从网上下载,然后引用

在Internet Explorer地址栏里面输入word2003, excel2003, pdf等文件名是可以打开该文件的,
(不知道office 2007支持这个功能否?)
编程时候你也许需要动态加载或者说迟绑定打开Office 2003文件,你可以这么做

用ADOX创建ACCESS数据文件后,*.ldb文件出现,直到程序关闭后才消失。怎样可以使那个*.ldb文件不出来呢?(具体它出来会有什么坏处?我也没细想,反正就是不想它出现。)

澳门新浦京娱乐场网站 1ADOX.Catalog catalog = new Catalog();
澳门新浦京娱乐场网站 2catalog.Create("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=d:\test.mdb;Jet OLEDB:Engine Type=5");
澳门新浦京娱乐场网站 3

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using ADOX;
using System.IO;

[csharp] view plaincopy

AxSHDocVw.AxWebBrowser myBrowser = new AxSHDocVw.AxWebBrowser(); // defined in SharpDevelop
myBrowser.Navigate(OfficeFile);

Interop.ADOX.dll应该是一个com组件,和.Net的不同,那个时代还没有引入垃圾回收机制,没有Dispose()……不能对ActiveConnection进行Dispose(),Catalog也是。

      仅仅两行代码就搞定了。下来我主要介绍一下在c#中的实现细节。首先你要添加引用,在“Add reference”对话框里切换到Com页面,选择“Microsoft ADO Ext. 2.8 for DDL and Security”,然后点击OK。在文件的开头using ADOX名字空间。然后添加如上面所示的代码就可以成功的创建Access 数据库了,代码如下:

namespace WebRequestTest.Common
{
public static class AccessDbHelper
{
/// <summary>
/// 创建access数据库
/// </summary>
/// <param name="filePath">数据库文件的全路径,如 D:\NewDb.mdb</param>
public static bool CreateAccessDb(string filePath)
{
ADOX.Catalog catalog = new Catalog();
if (!File.Exists)
{
澳门新浦京娱乐场网站:调用ADOX创建ACCESS数据文件后关闭连接,的迟绑定。 try
{

  1. using ADOX;  
  2. using JRO;  
  3. using System.IO;  

然后打开word 2003, excel 2003 并调用Save方法可以这么做

设ActiveConnection=null;Catalog=null;这样看似销毁,实际好像只是把指针设为null,而真正的对象,还没有变化。

澳门新浦京娱乐场网站 4澳门新浦京娱乐场网站,using System;
澳门新浦京娱乐场网站 5using System.Collections.Generic;
澳门新浦京娱乐场网站 6using System.Text;
澳门新浦京娱乐场网站 7using ADOX;
澳门新浦京娱乐场网站 8
澳门新浦京娱乐场网站 9namespace testADOX
澳门新浦京娱乐场网站 10{
澳门新浦京娱乐场网站 11    class Program
澳门新浦京娱乐场网站 12    {
澳门新浦京娱乐场网站 13        static void Main(string[] args)
澳门新浦京娱乐场网站 14        {
澳门新浦京娱乐场网站 15            ADOX.Catalog catalog = new Catalog();
澳门新浦京娱乐场网站 16            catalog.Create("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=d:\test.mdb;Jet OLEDB:Engine Type=5");
澳门新浦京娱乐场网站 17        }
澳门新浦京娱乐场网站 18    }
澳门新浦京娱乐场网站 19}
澳门新浦京娱乐场网站 20

catalog.Create("Provider=Microsoft.Jet.OLEDB.4.0;DData Source=" filePath ";Jet OLEDB:Engine Type=5");
}
catch (System.Exception ex)
{
return false;
}
}
return true;
}

然后编写相关函数

  public override void SaveOffice()
  {
   base.SaveOffice();

而在C#里ActiveConnection没有Close()方法……

      创建了数据库文件是没有实际用处的,我们还要创建表。在创建表之前,我们必须连接目标数据库,用来连接数据的桥梁居然是ADO的Connection对象,所以我们不得不再次添加对ADO的应用,在添加引用对话框中切换到Com页面,选择“Microsoft ActiveX Data Objects 2.8 Library”,然后点击OK。下边是创建表的完整代码:

/// <summary>
/// 在access数据库中创建表
/// </summary>
/// <param name="filePath">数据库表文件全路径如D:\NewDb.mdb 没有则创建 </param>
/// <param name="tableName">表名</param>
/// <param name="colums">ADOX.Column对象数组</param>
public static void CreateAccessTable(string filePath, string tableName, params ADOX.Column[] colums)
{
ADOX.Catalog catalog = new Catalog();
//数据库文件不存在则创建
if (!File.Exists)
{
try
{

[csharp] view plaincopy

   if (myApplicationType == InfoVistaConst.WordType)
   {
    try
    {
     object oApp = System.Runtime.InteropServices.Marshal.GetActiveObject("Word.Application");
     if (oApp != null)
     {
      //object oDocuments = oApp.GetType().InvokeMember("Documents", BindingFlags.GetProperty, null, oApp, null);
      //oDocuments.GetType().InvokeMember("Save", BindingFlags.InvokeMethod, null, oDocuments, null);

搜了半天,还是在一个日本网站首先见到解决方法的。可能是搜索方法不对吧。
最终将方法定位在这两个语句上(单独用其中一个不行,要两个同时用):

澳门新浦京娱乐场网站 21using System;
澳门新浦京娱乐场网站 22using System.Collections.Generic;
澳门新浦京娱乐场网站 23using System.Text;
澳门新浦京娱乐场网站 24using ADOX;
澳门新浦京娱乐场网站 25
澳门新浦京娱乐场网站 26namespace testADOX
澳门新浦京娱乐场网站 27{
澳门新浦京娱乐场网站 28    class Program
澳门新浦京娱乐场网站 29    {
澳门新浦京娱乐场网站 30        static void Main(string[] args)
澳门新浦京娱乐场网站 31        {
澳门新浦京娱乐场网站 32            ADOX.Catalog catalog = new Catalog();
澳门新浦京娱乐场网站 33            catalog.Create("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=d:\test.mdb;Jet OLEDB:Engine Type=5");
澳门新浦京娱乐场网站 34
澳门新浦京娱乐场网站 35            ADODB.Connection cn = new ADODB.Connection();
澳门新浦京娱乐场网站 36            
澳门新浦京娱乐场网站 37            cn.Open("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=d:\test.mdb", null, null, -1);
澳门新浦京娱乐场网站 38            catalog.ActiveConnection = cn;
澳门新浦京娱乐场网站 39
澳门新浦京娱乐场网站 40            ADOX.Table table = new ADOX.Table();
澳门新浦京娱乐场网站 41            table.Name = "FirstTable";
澳门新浦京娱乐场网站 42
澳门新浦京娱乐场网站 43            ADOX.Column column = new ADOX.Column();
澳门新浦京娱乐场网站 44            column.ParentCatalog = catalog;
澳门新浦京娱乐场网站 45            column.Name = "RecordId";
澳门新浦京娱乐场网站 46            column.Type = DataTypeEnum.adInteger;
澳门新浦京娱乐场网站 47            column.DefinedSize = 9;
澳门新浦京娱乐场网站 48            column.Properties["AutoIncrement"].Value = true;
澳门新浦京娱乐场网站 49            table.Columns.Append(column, DataTypeEnum.adInteger, 9);
澳门新浦京娱乐场网站 50            table.Keys.Append("FirstTablePrimaryKey", KeyTypeEnum.adKeyPrimary, column, null, null);
澳门新浦京娱乐场网站 51            table.Columns.Append("CustomerName", DataTypeEnum.adVarWChar, 50);
澳门新浦京娱乐场网站 52            table.Columns.Append("Age", DataTypeEnum.adInteger, 9);
澳门新浦京娱乐场网站 53            table.Columns.Append("Birthday", DataTypeEnum.adDate, 0);
澳门新浦京娱乐场网站 54            catalog.Tables.Append(table);
澳门新浦京娱乐场网站 55         
澳门新浦京娱乐场网站 56            cn.Close();
澳门新浦京娱乐场网站 57        }
澳门新浦京娱乐场网站 58    }
澳门新浦京娱乐场网站 59}
澳门新浦京娱乐场网站 60

catalog.Create("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" filePath ";Jet OLEDB:Engine Type=5");
}
catch (System.Exception ex)
{

  1. /// <summary>  
  2.      /// 创建数据库  
  3.      /// </summary>  
  4.      /// <param name="mdbPath">路径</param>  
  5.      public void Create(string mdbPath)  
  6.      {  
  7.          if (File.Exists(mdbPath)) //检查数据库是否已存在     
  8.          {  
  9.              throw new Exception("目标数据库已存在,无法创建");  
  10.          }  
  11.          // 可以加上密码,这样创建后的数据库必须输入密码后才能打开     
  12.   
  13.          mdbPath = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source="   mdbPath;  
  14.          // 创建一个CatalogClass对象的实例,     
  15.   
  16.          ADOX.CatalogClass cat = new ADOX.CatalogClass();  
  17.   
  18.          // 使用CatalogClass对象的Create方法创建ACCESS数据库     
  19.   
  20.          cat.Create(mdbPath);  
  21.   
  22.          //创建数据库后关闭连接  
  23.          System.Runtime.InteropServices.Marshal.FinalReleaseComObject(cat.ActiveConnection);  
  24.          System.Runtime.InteropServices.Marshal.FinalReleaseComObject(cat);  
  25.      }  
  26.      /// <summary>  
  27.      /// 连接数据库  
  28.      /// </summary>  
  29.      /// <param name="filename">文件名包含路径</param>  
  30.      /// <returns>返回连接字符串</returns>  
  31.      public ADODB.Connection Connection(string filename)  
  32.      {  
  33.          ADODB.Connection con = new ADODB.Connection();  
  34.          con.Open("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" filename, null, null, -1);  
  35.           
  36.          return con;  
  37.            
  38.            
  39.      }  
  40.      /// <summary>  
  41.      /// 创建数据表  
  42.      /// </summary>  
  43.      /// <param name="con">连接字符串</param>  
  44.      /// <param name="table_name">表的名称</param>  
  45.      /// <param name="column">字段</param>  
  46.      public void CreateTable(ADODB.Connection con,string table_name,params Column[] column)  
  47.      {  
  48.          CatalogClass cat = new CatalogClass();  
  49.          cat.ActiveConnection = con;  
  50.          Table table = new Table();  
  51.   
  52.          Column col = new Column();  
  53.          col.ParentCatalog = cat;  
  54.          col.Type = DataTypeEnum.adInteger;  
  55.          col.Name = "ID";  
  56.          col.DefinedSize = 9;  
  57.          col.Properties["AutoIncrement"].Value = true;  
  58.   
  59.          table.Columns.Append(col, DataTypeEnum.adInteger, 9);  
  60.          table.Keys.Append("FirstPrimaryKey",KeyTypeEnum.adKeyPrimary,col, null, null);  
  61.          table.Name = table_name;  
  62.          foreach (Column item in column)  
  63.          {  
  64.              table.Columns.Append(item);  
  65.          }  
  66.          cat.Tables.Append(table);  
  67.          //创建数据库后关闭连接  
  68.          System.Runtime.InteropServices.Marshal.FinalReleaseComObject(cat.ActiveConnection);  
  69.          System.Runtime.InteropServices.Marshal.FinalReleaseComObject(cat);  
  70.      }  

      object oWindow = oApp.GetType().InvokeMember("ActiveWindow", BindingFlags.GetProperty, null, oApp, null);
      object oDocument = oWindow.GetType().InvokeMember("Document", BindingFlags.GetProperty, null, oWindow, null);
      oDocument.GetType().InvokeMember("Save", BindingFlags.InvokeMethod, null, oDocument, null);
     }
    }
    catch (Exception)
    {
    }
   }

System.Runtime.InteropServices.Marshal.FinalReleaseComObject(catalog.ActiveConnection);  
System.Runtime.InteropServices.Marshal.FinalReleaseComObject(catalog);

      上面的代码中,创建了一个名为FirstTable的表,在表里加入了4个字段,并设置了一个主键。表里的字段分别输入4中不同的常用类型,第一个字段是一个自动增长的整数类型,这个类型比较特殊,你必须为这个字段设置ParentCatalog属性,并将“AutoIncrement”的属性值设为true.。Access里的Text类型对应的就是adVarWchar,而日期类型对应的是adDate。
键的设置如table.Keys.Append("FirstTablePrimaryKey", KeyTypeEnum.adKeyPrimary, column, null, null)所示,如果是外键的话,你还必须要设置关联的表和关联的字段,也就是Append方法的后两个字段。
你也可以参照上边的代码创建索引和视图。 

}
}
ADODB.Connection cn = new ADODB.Connection();

示例:

   if (myApplicationType == InfoVistaConst.ExcelType)
   {
    try
    {
     object oApp;
     object oBook;
     object oBooks;
     //object oSheets;
     //object oSheet;
     //object[] Parameters;

using ADOX;  ``// csc ... /r:Interop.ADOX.dll ...

cn.Open("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" filePath, null, null, -1);
catalog.ActiveConnection = cn;
ADOX.Table table = new ADOX.Table();
table.Name = tableName;
foreach (var column in colums)
{
table.Columns.Append;
}
// column.ParentCatalog = catalog;

[csharp] view plaincopy

     // Get the class type and instantiate Excel.
     //Type objClassType = Type.GetTypeFromProgID("Excel.Application");
     //object oApp = Activator.CreateInstance(objClassType);
     oApp = System.Runtime.InteropServices.Marshal.GetActiveObject("Excel.Application");

// ... other code ...

//column.Properties["AutoIncrement"].Value = true; //设置自动增长

  1. private void button1_Click(object sender, EventArgs e)  
  2.         {  
  3.             Create(Path.Combine(Application.StartupPath, "test.mdb"));  
  4.             Column col=new Column();  
  5.             col.Name="Name";  
  6.             col.Type=DataTypeEnum.adVarWChar;  
  7.             col.DefinedSize=50;  
  8.             CreateTable(Connection(Path.Combine(Application.StartupPath, "test.mdb")),"testtable", col);  
  9.         }   

     if (oApp != null)
     {
      //Get the workbooks collection.
      oBooks = oApp.GetType().InvokeMember("Workbooks", BindingFlags.GetProperty, null, oApp, null);

public bool CreateDataFile()

//table.Keys.Append("FirstTablePrimaryKey", KeyTypeEnum.adKeyPrimary, column, null, null); //定义主键
catalog.Tables.Append;
cn.Close();
}

      //object[] argsForOpen = new object[3];
      //argsForOpen[0] = OfficeFile;
      //argsForOpen[1] = true;
      //argsForOpen[2] = true;
      //oBook = oBooks.GetType().InvokeMember("Open", BindingFlags.InvokeMethod, null, oBooks, argsForOpen);

{

//========================================================================================调用
//ADOX.Column[] columns = {
// new ADOX.Column(){Name="id",Type=DataTypeEnum.adInteger,DefinedSize=9},
// new ADOX.Column(){Name="col1",Type=DataTypeEnum.adWChar,DefinedSize=50},
// new ADOX.Column(){Name="col2",Type=DataTypeEnum.adLongVarChar,DefinedSize=50}
// };
// AccessDbHelper.CreateAccessTable("d:\111.mdb", "testTable", columns);
}
}

      //oBook = oBooks.GetType().InvokeMember("Add", BindingFlags.InvokeMethod, null, oBooks, null);

``ADOX.Catalog catalog = ``new Catalog();

      oBook = oApp.GetType().InvokeMember("ActiveWorkbook", BindingFlags.Default | BindingFlags.GetProperty, null, oApp, null);

``try

      oBook.GetType().InvokeMember("Save", BindingFlags.InvokeMethod, null, oBook, null);

``{

      ////Get the worksheets collection.
      //oSheets = oBook.GetType().InvokeMember("Worksheets", BindingFlags.GetProperty, null, oBook, null);

``catalog.Create(ConnString);

      ////Get the first worksheet.
      //Parameters = new Object[1];
      //Parameters[0] = 1;
      //oSheet = oSheets.GetType().InvokeMember("Item", BindingFlags.GetProperty, null, oSheets, Parameters);

``System.Runtime.InteropServices.Marshal.FinalReleaseComObject(catalog.ActiveConnection);

      //Return control of Excel to the user.
      //Parameters = new Object[1];
      //Parameters[0] = true;
      //oApp.GetType().InvokeMember("Visible", BindingFlags.SetProperty, null, oApp, Parameters);
      //oApp.GetType().InvokeMember("UserControl", BindingFlags.SetProperty, null, oApp, Parameters);
     }

``System.Runtime.InteropServices.Marshal.FinalReleaseComObject(catalog);

     Application.DoEvents();
    }
    catch (Exception ex)
    {
     MessageBox.Show(ex.Message);
    }
   }
  }

``return true``;

调用 Quit 方法可以这么做
  
  public void QuitOffice()
  {
   if (myApplicationType == InfoVistaConst.ExcelType)
   {
    try
    {
     object oApp = System.Runtime.InteropServices.Marshal.GetActiveObject("Excel.Application");
     if (oApp != null)
     {
      oApp.GetType().InvokeMember("Quit", System.Reflection.BindingFlags.InvokeMethod, null, oApp, null);
      oApp = null;
     }
    }
    catch (Exception)
    {
    }
   }

``}

   if (myApplicationType == InfoVistaConst.WordType)
   {
    try
    {
     object oApp = System.Runtime.InteropServices.Marshal.GetActiveObject("Word.Application");
     if (oApp != null)
     {
      oApp.GetType().InvokeMember("Quit", System.Reflection.BindingFlags.InvokeMethod, null, oApp, null);
      oApp = null;
     }
    }
    catch (Exception)
    {
    }
   }

``catch (Exception ex)

  }

``{

有时候关闭Office相关进程可以这么做

``Console.WriteLine(ex.Message);

  private void KillOffice()
    {
   if (myApplicationType == InfoVistaConst.ExcelType)
   {
    try
    {
     object obj = System.Runtime.InteropServices.Marshal.GetActiveObject("Excel.Application");
     if (obj != null)
     {
      System.Runtime.InteropServices.Marshal.ReleaseComObject(obj);
      obj = null;
     }

``return false``;

     foreach (Process proc in Process.GetProcessesByName("EXCEL"))
     {
      proc.Kill();
     }
     GC.Collect();
     Application.DoEvents();
    }
    catch (Exception)
    {
    }
   }
   if (myApplicationType == InfoVistaConst.WordType)
   {
    try
    {
     object obj = System.Runtime.InteropServices.Marshal.GetActiveObject("Word.Application");
     if (obj != null)
     {
      System.Runtime.InteropServices.Marshal.ReleaseComObject(obj);
      obj = null;
     }

``}

     foreach (Process proc in Process.GetProcessesByName("WINWORD"))
     {
      proc.Kill();
     }
     GC.Collect();
     Application.DoEvents();
    }
    catch (Exception)
    {
    }
   }
  }
  
  在 快手() 工具里面就用了以上代码。
  这也许不是最佳办法关闭进程,希望可以指正。

}

    
  进一步的资料可以从这里得到
        

 

 

本文由澳门新浦京娱乐场网站发布于www.146.net,转载请注明出处:澳门新浦京娱乐场网站:调用ADOX创建ACCESS数据文