65.9K
CodeProject 正在变化。 阅读更多。
Home

ADO.NET基本类入门

2002年2月22日

3分钟阅读

viewsIcon

263906

downloadIcon

1624

如果你想开始学习ADO.NET,从这里开始

Sample Image - ADODotNet.jpg

引言

当我开始学习ADO.NET的第一天,我被微软在.NET框架中引入的新类搞糊涂了。在这篇文章中,我想介绍一些ADO.Net的基本类,希望能帮助那些想学习ADO.NET的初学者,避免像我一样感到困惑。

ADO.NET中的类和对象概述

我们可以将ADO.NET类分为提供程序对象和使用者对象。提供程序对象是每种数据源的类型,实际的读取和写入数据源是由特定于提供程序的对象完成的。使用者对象是我们用来访问和操作从内存中读取的数据的工具。使用者对象以断开连接模式工作。提供程序对象需要一个活动连接;我们首先使用它们来读取数据,然后,根据我们的需要,我们可以使用使用者对象在内存中处理数据,和/或使用提供程序对象将更改写回数据源来更新数据源。

提供程序对象

这些对象在每个.NET数据提供程序中定义。名称以提供程序唯一的名称作为前缀。例如,OLE DB提供程序的实际连接对象是OleDBConnection(用于MS Access、Oracle...)。SQLServer的提供程序是SqlConnection,而ODBC .NET提供程序连接类是OdbcConnection

连接对象

我在前一段中提到了它们,这个对象是我们必须使用的第一个对象,并且在使用任何其他ADO.NET对象之前都需要它。显而易见,它创建到数据源的连接字符串。

OleDBConnection myConnection = 
       new OleDBConnection(@"Provider=Microsoft.Jet.OLEDB.4.0;" +
                           @"Data Source=C:\Test.MDB");
	
// open connection

myConnection.Open();

或者这个

SqlConnection myConnection = new SqlConnection("Data Source=(local);" +
                                               "Integrated Security=SSPI;"+ 
                                               "Initial Catalog=Test");

// Open connection

myConnection.Open();

命令对象

我们使用此对象向数据源发出命令,例如SQL查询,例如SELECT * FROM TABLE。 提供程序特定的名称是SqlCommandOleDBCommand

SqlCommand myCommand = myConnection.CreateCommand();
//this code is from MSDN with a little change

myCommand.CommandText = "select count(*) as NumberOfRegions from region";
Int count = (int) myCommand.ExecuteScalar();

ExecuteScalar()返回结果集中第一行的第一列。有关此方法的更多信息,您可以查看MSDN

CommandBuilder对象

此对象用于从基于单个表查询的对象构建用于数据修改的SQL命令。 提供程序名称为SqlCommandBuilderOleDBCommandBuilder。我稍后会给你一个例子。

DataReader对象

这是一个快速简单的对象,用于从数据源读取仅向前读取、只读的数据流。 此对象为简单读取数据提供了最高的性能。提供程序名称对于SQLServer是SqlDataReader,对于OLE DB是OleDBDataReader。 想象一下控制台应用程序中的这些代码行

// create connection object for Microsoft Access OLE DB Provider

OleDbConnection myConnection
         = new OleDbConnection(@"Provider=Microsoft.Jet.OLEDB.4.0;" + 
                               @"Data Source=C:\Test.MDB");

// open connection object

myConnection.Open();

// create SQL command object on this connection 

OleDbCommand myCommand = myConnection.CreateCommand();

// initialize SQL SELECT command to retrieve desired data

myCommand.CommandText = "SELECT Column1 FROM Table1";

// create a DataReader object based on previously defined command object

OleDbDataReader myReader = myCommand.ExecuteReader();

while (myReader.Read())
{
	Console.WriteLine("{0}",  myReader["Column1"]);
}
myReader.Close();
myConnection.Close();

此代码的输出是table1column1的所有行。不要忘记在操作结束时关闭ConnectionDataReader

DataAdapter对象

此类适用于通用目的。它可以对数据源执行许多操作,例如更新已更改的数据和其他操作。 提供程序名称对于SQLServer是SqlDataAdapter,对于OLE DB是OledbDataAdapter

OleDbConnection myConnection
          = new OleDbConnection(@"Provider=Microsoft.Jet.OLEDB.4.0;" +
                                @"Data Source=C:\Test.MDB");
myConnection.Open();

OleDbDataAdapter myAdapter
         = new OleDbDataAdapter("SELECT Column1 from Table1", myConnection);
Console.WriteLine("{0}\n",myAdapter.SelectCommand.CommandText);

OleDbCommandBuilder myBuilder = new OleDbCommandBuilder(myAdapter);
OleDbCommand insertCommand = myBuilder.GetInsertCommand();
Console.WriteLine("{0}\n",insertCommand.CommandText);

输出非常精彩

SELECT Column1 from  Table1
INSERT INTO 'Column1' ('Column1') VALUES (?)

太好了,我喜欢它!

使用者对象

DataSet 对象

它代表应用程序中引用为一个单元的一组相关表。 例如,Table1Table2Table3可能都是一个DataSet中的表。 使用此对象,您可以快速获取每个表中的所有数据,检查、更改它,同时与服务器断开连接,然后通过一个高效的操作使用更改更新服务器。

// Create DataAdapter object for update and other operations

SqlDataAdapter myAdapter
          = new SqlDataAdapter("SELECT * FROM Table1", myConnection);

// Create DataSet to contain related data tables, rows, and columns

DataSet myDataSet = new DataSet();

// Fill DataSet using query defined previously for DataAdapter

myAdapter.Fill(myDataSet, "Table1");

// Show data before change

Console.WriteLine("Record before change: {0}",
                  myDataSet.Tables["Table1"].Rows[3]["Column1"]);

// Change data in Table1, row 3, Column1

myDataSet.Tables["Table1"].Rows[3]["Column1"] = "Hello";

// Show data after change

Console.WriteLine("Record after change: {0}",
                  myDataSet.Tables["Table1"].Rows[3]["Column1"]);

// Call Update command to mark change in table

myAdapter.Update(myDataSet, "Table1");

不要忘记,您必须对DataSet类使用Fill()方法才能在其中进行操作。

其他对象

还有一些其他简单的对象,DataTable,DataColumn,DataRow,它们的作用非常清楚。 此代码将新行添加到数据源。

DataRow myRow = myDataSet.Tables["Table1"].NewRow();
myRow["Column1"] = "Hi";
myRow["Column2"] = "How do you do?";
myDataSet.Tables["Table1"].Rows.Add(myRow);

myAdapter.Update(myDataSet, "Table1");

当你编写代码并使用SQLServerMSAccess时,你可以确定只有前缀名称和连接字符串是不同的,但当然,它们的性能之间存在很多差异。

在演示项目中,还有另一个例子,我在那里放了一些注释。

© . All rights reserved.