ADO.NET基本类入门






3.44/5 (22投票s)
2002年2月22日
3分钟阅读

263906

1624
如果你想开始学习ADO.NET,从这里开始
引言
当我开始学习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
。 提供程序特定的名称是SqlCommand
和OleDBCommand
。
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命令。 提供程序名称为SqlCommandBuilder
和OleDBCommandBuilder
。我稍后会给你一个例子。
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();
此代码的输出是table1
中column1
的所有行。不要忘记在操作结束时关闭Connection
和DataReader
。
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 对象
它代表应用程序中引用为一个单元的一组相关表。 例如,Table1
、Table2
和Table3
可能都是一个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");
当你编写代码并使用SQLServer
或MSAccess
时,你可以确定只有前缀名称和连接字符串是不同的,但当然,它们的性能之间存在很多差异。
在演示项目中,还有另一个例子,我在那里放了一些注释。