摘要:C#是用于.NET开发的一种语言,并且是唯一为.NET Framework设计的语言,ADO是微软极力推荐使用的最新的数据库访问技术,Access数据库是用户通常选择的方便易用的数据库,具有广泛的应用基础。
  关键词:C#;Access数据库;ADO;ADOX
  一、引言
  在程序开发过程中,有时需要面对这样一个问题:如何让用户在程序运行过程中动态地建立自己所需的数据库和表以提高程序的灵活性呢?在程序运行过程中建立自己所需的数据库和表,其本质就是用代码(或者说通过编程)来建立数据库和表。众所周知,在Foxpro或ASP编程中,这是很容易的一件事件。那么在C#.NET数据库编程中又是怎样来操作的呢?如果使用DAO(数据访问对象)作为数据库访问技术,在微软的MFC类库中提供了相关的DAO类(CDaoDatabase类和CDaoTableDef类),通过定义这些类的对象并调用相应的成员函数就可以实现Access数据库和表的动态创建。但是,使用DAO数据库接口相当麻烦,要用到很多API,而ADO(ActiveX数据对象)是微软极力推荐使用的最新的数据库访问技术,它已经成为目前数据库开发的主流。因此,针对A-DO数据库访问技术,如何实现数据库和表的创建,就成为编程人员较为关心的一项技术,将给出利用C#.NET创建Access数据库并进行数据访问的方法。
  二、ADO创建数据库技术
  ADO.NET的名称起源于ADO(ActiveX Data Objects),这是一个广泛的类组,ADO.NET是一组向.NET程序员公开数据访问服务的类。ADO.NET为创建分布式数据共享应用程序提供了一组丰富的组件。它提供了对关系数据、XML和应用程序数据的访问,因此是.NET Framework中不可缺少的一部分。ADO.NET是用于数据访问的.NET Framework API,它提供的强大功能和易用性是以前的数据访问解决方案所无法匹敌的。ADOX是ADO Extensions for Data Definition Languageand Security,是微软对ADO技术的扩展,使用它可以操作数据库的结构。ADOX是对ADO对象和编程模型的扩展,它将ADO扩展为包括创建、修改和删除模式对象,如表格和过程。它是一个COM组件,估计以后在ADO.NET中会增加ADOX的一些功能。
  在Visual C#.NET中,使用ADO开发数据库应用程序时,我们要引用对象库“Microsoft ActiveX Data Objects 2.8 Li-brary”,简称为ADO,它是C#.NET数据库最核心的对象,也是C#.NET数据库开发人员经常所引用的对象库,在VisualStudio 2005中可以看到它的各种版本,从2.0版到2.8版都有,很多人对它已经很熟悉,在此不再详细介绍。如果要在程序运行过程中创建数据库和表,还要引用对象库“MicrosoftADO Ext.2.8 for DDL and Security”,简称为ADOX。ADOX常用方法有:Append(包括Colu
mns、Groups、Indexes、Keys、Procedures、Tables、Users、Views)、Create(创建新的目录)、Delete(删除集合中的对象)、Refresh(更新集合中的对象)等等。
  三、数据库访问类和对象
  总的来说,可以把ADO.NET用于数据库访问的类分为.NET数据提供者对象和数据库用户对象。
  3.1 提供者对象
  .NET框架包括了4种数据提供者,SQL Server.NET提供者、Oracle.NET提供者、OLEDB.NET提供者、ODBC.NET提供者,分别用于不同数据库标准。对于每种数据提供者,包括了如下对象。
  (1)数据库连接对象(Connection)
  数据库连接对象是一个与数据库进行连接的对象,包含着与数据源创建连接的信息。用于SQL Server.NET提供者的数据库连接对象是SqlConnection,用于Oracle.NET提供者的数据库连接对象就是OracleConnection,用于OLEDB.NET提供者的数据库连接对象就是OleDbConnection,用于ODBC.NET提供者的数据库连接对象是OdbcConnection。
  (2)数据库命令对象(Command)
  可以使用此对象向数据源发出命令,对于不同的数据提供者,该对象的名称也不同,用于OLEDB.NET提供者的命令对象是OleDbCommand。
  (3)命令构造对象(CommandBuilde)
  此对象用于构建SQL命令,在基于单一表查询的对象中进行数据修改,用于OLEDB.NET提供者的命令对象OleDb-CommandBuilder。
  (4)数据读取对象(DataReade)
  这是一个快速而易用的对象,可以从数据源中读取仅能前向和只读的数据流。对于简单的读取数据来说,此对象的性能最好。用于OLEDB.NET提供者的数据读取对象是OleDb-DataReader。
  (5)数据适配器对象(DataAdapte)
  这是一个通用的类,可以执行针对数据源的各种操作,包括更新变动的数据,填充DataSet对象,该对象取得数据并且在数据与数据集之间建立一座桥梁。用于OLEDB.NET提供者的数据读取对象是OleDbDataAdapter。
  3.2 用户对象
  数据库用户对象用于定义ADO.NET的断开的、客户端的对象,它们与.NET数据提供者不相关,存在于System.Data名称空间中。
  (1)数据集对象(DataSe)
  数据集是数据的内存驻留形式,此对象表示一组相关表,在应用程序中这些表作为一个单元来引用。有了此对象,就可以快速从每个表中获取所需要的数据,当与服务器断开时检查并修改数据,然后在另一个操作中使用这些修改的数据更修服务器。
  (2)数据表对象(DataTable)
  数据表对象代表数据集中的一个表,此对象允许访问其中的行与列,即DataColumn对象和DataRow对象。
  (3)数据关系对象(DataRelation)
  数据关系对象代表通过共享列而
发生关系的两个表之间的关系。
  四、应用实例
  4.1 设计思路
  本实例将开发一个数据格式转换软件,读取文本文件内容到Access数据库。文本内容包括多行3列用逗号分开的数据,分别代表点号名称、X和Y坐标。其中关键是基于C#.NET利用ADO技术让用户在程序运行过程中建立数据库和表,逐行读取文本数据,并写入到用户自己建立的Access数据库表格中。访问数据库时,ADO.NET提供两种方式,一种是要持续保持连接的,最明显的特征就是用到了DataReader这个对象来访问数据;另一种是不需要持续保持连接的,这个时候要在本地创建一个数据接收对象,需要利用DataSet访问数据。以下核心代码将分别介绍这两种数据访问方法。
  4.2 核心代码
  (1)创建Access数据库和表
  ADOX.Catalog catalog=new Catalog();
  catalog.Create("Provider=Microsoft.Jet.OLEDB.4.0;
  Data Source=d://test.mdb;Jet OLEDB:Engine Type=5");
  ADODB.Connection cn=new ADODB.Connection();
  cn.Open("Provider=Microsoft.Jet.OLEDB.4.0;Data
  Source=d://test.mdb",null,null,-1);
  catalog.ActiveConnection=cn;
  ADOX.Table table=new ADOX.Table();
  table.Name="Coordinates";
  ADOX.Column column=new ADOX.Column();
  column.ParentCatalog=catalog;
  table.Columns.Append("Name",ADOX.DataTypeEnum.
  adVarWChar,10);
  table.Columns.Append("X",ADOX.DataTypeEnum.ad-
  Double,20);
  table.Columns.Append("Y",ADOX.DataTypeEnum.ad-
  Double,20);
  catalog.Tables.Append(table);
  cn.Close();
  (2)读取文本数据
  FileStream fs=new FileStream“(d://”,FileMode.Open);
  StreamReader sr=new StreamReader(fs);
  string strLine=sr.ReadLine();
  (3)访问Access数据库并写入数据
  OleDbConnection conn=new OleDbConnection(@"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=d://test.mdb”);//创建连接数据库的对象
  conn.Open();//打开
  方法一:创建有持续连接的读取数据的对象
  while(strLine!=null)
  {
  string[]line=strLine.Split(',');
  OleDbCommand cmd=new OleDbCommand("Insert Into
  Coordinates(Name,X,Y)values('"+line[0]+"','"+
  line[1]+"','"+line[2]+"')",conn);
  //创建执行SQL语句的命令对象
  cmd.CommandType=CommandType.Text;
  //指定命令的类型
  OleDbDataReader reader=cmd.ExecuteReader();
  //创建有持续连接的读取数据的对象strLine=sr.ReadLine();//读取下一行
  }
  sr.Close();
  conn.Close();
  方法二:创建无持续连接的读取数据的对象
  DataSet thisDataset=new DataSet();
  //创建无持续连接的读取数据的对象
  OleDbDataAdapter thisAdapter=new OleDbDataAdapter("
  select Name,X,Y from Coordinates",conn);
  //把DataSet和具体数据库联系起来的对象
  OleDbCommandBuilder thisBuilder=new OleDbCommand-
  Builder(thisAdapter);
  thisAdapter.Fill(thisDataset,"Coors");
  while(strLine!=null)
  {
  string[]strArray=strLine.Split(',');
  DataRow thisRow=thisDataset.Tables["Coors"].
  NewRow();
  thisRow["Name"]=strArray[0];oracle建立数据库连接
  thisRow["X"]=strArray[1];
  thisRow["Y"]=strArray[2];
  thisDataset.Tables["Coors"].Rows.Add(thisRow);
  thisAdapter.Update(thisDataset,"Coors");
  strLine=sr.ReadLine();
  }
  sr.Close();
  conn.Close();
  4.3 数据库访问技术比较
  用持续连接方式访问数据库的好处是DataReader的读取效率非常快,是DataSet的几倍。但它的劣势也很明显,一是持续保持数据库连接,必然要抢占数据库的资源,如果一个数据库连接有上限限制,这就非常糟糕了。另一方面DataReader虽然效率高,但只读向前,很不灵活。而非持续连接方式的好处是数据读取灵活,操作方便,而且不占用数据库资源,还可以灵活绑定控件。
  五、结语
  阐述了基于C#.NET利用ADO技术在程序运行过程中建立数据库和表的方法,并对ADO.NET中的两种数据库访问方法进行比较,对使用C#.NET语言开发的应用程序对Access数据库的创建和访问有指导作用。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。