一、ADO.NET五大对象理论
1、 Connection:与数据源建立连接。
2、 Command:对数据源执行SQL命令并返回结果。
Command对象在执行的的时候有几个比较重要的方法,如ExecuteNonQuery方法,执行增删改命令。查询方法有2种:一个是ExecuteReader方法,返回一个DataReader对象。还有ExecuteScale方法,返回首行首列。
3、 DataReader:读取数据源的数据,只允许对将数据源以只读、顺向的方式查看其中所存储的数据。
用于从数据源中检索只读数据集,并且必须有连接时才可以用。
4、 DataAdapter:数据适配器,对数据源执行操作并返回结果;
在DataSet与数据源之间建立通信,将数据源中的数据写入DataSet中,或根据DataSet中的数据绑定数据源。
DataAdapter使用中主要有4个命令对象比较重要。它们分别是:SelectCommand、InsertCommand、UpdateCommand、DeleteCommand.
SelectCommand,主要是从数据库中检索数据,InsertCommand、UpdateCommand、DeleteCommand这3个命令对象主要负责把本地数据集DataSet中的数据上传回服务器。
DataAdapter的Fill方法,用于使用DataAdapter的SelectCommand的结果来填充DataSet。
5、 DataSet:内存中的数据库,是数据表的集合,它可以包含任意多个数据表。
是ADO.NET的核心,相当于本地数据库,它与数据库无关的,它和远程数据库连接的桥梁就是.NET数据提供程序。它是由多个表构成,每个表都是一个DataTable对象。
DataSet中主要的对象时DataTable,每一列都是DataColumn对象,每一行都是一个DataRow对象。在里面可以加入一些约束,一个是UniqueConstraint(唯一约束),一个是ForeignKeyConstraint(外键约束)。
DataSet下面有两个重要的集合,一个是DataTables,一个是DataRelations.DataTables里面放置的都是DataTable对象。
关系图:
二、实践
这里将对数据库的操作大致分为两类,一类是对数据库的查询,需要返回查询数据。一类是对数据库的增、删、改,不需要返回查询数据。下面就以这两类,结合实例说明。
查询:从上图中可以看到,想得到查询结果有三种方式:
- 通过Command对象的ExecuteScalar方法(),但是这种方法只能返回由查询返回的结果集中的第一行的第一列,并且其返回值为object类型,其他列或行将被忽略。 ExecuteScalar()经常使用于当需要返回单一值时的情况。例如你刚插入一行数据,想要立即知道它的ID号,则可以使用ExecuteScalar()方法。通过MSDN给出的一个例子说明。
static public int AddProductCategory(string newName, string connString)
{
Int32 newProdID = 0;
string sql = "INSERT INTO Production.ProductCategory (Name) VALUES (@Name); "+ "SELECT CAST(scope_identity() AS int)";
using (SqlConnection conn = new SqlConnection(connString))
{
SqlCommand cmd = new SqlCommand(sql, conn);
cmd.Parameters.Add("@Name", SqlDbType.VarChar);
cmd.Parameters["@name"].Value = newName;
try
{
conn.Open();
newProdID = (Int32)cmd.ExecuteScalar();
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
}
return (int)newProdID;
}
- 通过DataReader对象接收Command对象的ExecuteReader方法()的返回值,DataReader从数据库中检索只读、只进的数据流。 使用DataReader可以提高应用程序的性能,原因是它只要数据可用就立即检索数据,并且(默认情况下)一次只在内存中存储一行,减少了系统开销。下面是MSDN实例。
private static void ReadOrderData(string connectionString)
{
string queryString = "SELECT OrderID, CustomerID FROM dbo.Orders;";//sql语句
using (SqlConnection connection = new SqlConnection(connectionString))
{
SqlCommand command = new SqlCommand(queryString, connection);
connection.Open();
SqlDataReader reader = command.ExecuteReader();
try
{
while (reader.Read())
{
Console.WriteLine(String.Format("{0}, {1}",reader[0], reader[1]));
}
}
finally
{
// 读完数据后,调用关闭
reader.Close();
}
}
}
- 通过DataAdapter对象将查询到的数据填充到DataSet中。
private void Button_Click(object sender, RoutedEventArgs e)
{
string conStr = "";//连接字符串
using (SqlConnection conn = new SqlConnection(conStr))
{
conn.Open();//打开连接
string sql = "";//sql语句
SqlDataAdapter sda = new SqlDataAdapter(sql,conn);//实例化SqlDataAdapter对象
DataSet ds = new DataSet();
sda.Fill(ds);//填充数据集
}
}
添加、修改、删除,从上图中可以看到,有两种方式:
- 通过Command对象的ExecuteNonQuery 方法 (),可以使用 ExecuteNonQuery来执行目录操作(例如查询数据库的结构或创建诸如表等的数据库对象),或通过执行 UPDATE、INSERT 或 DELETE 语句。
private static void CreateCommand(string queryString,string connectionString)
{
using (SqlConnection connection = new SqlConnection(connectionString))
{
SqlCommand command = new SqlCommand(queryString, connection);
command.Connection.Open();
command.ExecuteNonQuery();
}
}
- 使用DataSet来更数据库中的数据。
static private DataSet UpdateDataSet(string connectionString)
{
DataSet dataSet = new DataSet();//实例化数据集dataset
using (SqlConnection connection = new SqlConnection(connectionString))
{
connection.Open();//打开连接
SqlDataAdapter adapter = new SqlDataAdapter();//实例化SqlDataAdapter对象
SqlCommandBuilder builder = new SqlCommandBuilder(adapter);
adapter.Fill(dataSet);//填充数据集dataset
dataSet.Tables[0].Rows[0][0] = 2;//修改数据
adapter.Update(dataSet);//更新dataset
}
return dataSet;
}