好了,Data命名空间了解得差不多了,现在进入Data.SqlClient命名空间吧。Let’s go!
一、概述
SqlClient是一个数据提供程序,其地位与OracleClient、Odbc、OleDb相当。可以协助应用程序快速访问数据库。
简单地说,SqlClient的应用就是:利用SqlConnection连接数据库,数据源由SqlCommand确定;利用SqlDataAdapter来桥接DataSet与数据源。如果想自动同步DataSet与数据库,SqlCommandBuild就有用了。如果你只想读而不想更改数据,那么用SqlDataReader吧。当然了,事务是必不可少的,SqlTransaction就是用来做这事的。
出错啦——SQL Server返回错误时,会引发SqlException异常,同时创建SqlError与SqlErrorCollection。
SqlParameter及SqlParameterCollection是什么意思?
如何保证数据库访问安全级别——SqlClientPermission与SqlClientPermissionAttribute。
有两种访问数据库的方式:
1、仅使用SqlCommand与SqlConnection访问数据库。在这种情况下,SqlCommand的内容通常为跟更新数据库有关的SQL。例:
public void insertRow()
{
string myConnectionString = “Initial Catalog=Northwind;Data Source=localhost;Integrated Security=SSPI;";
SqlConnection myConnection = new SqlConnection(myConnectionString);
String myInsertQuery = “insert into Customers (customerID,companyName) values ('NWIND', 'Northwind Traders')”;
SqlCommand myCommand = new SqlCommand(myInsertQuery);
MyCommand.Connection = myConnection;
MyCommand.Open();
MyCommand.ExecuteNonQuery();
MyCommand.Collection.Close();
}
2、使用SqlCommand与SqlConnection、SqlDataAdapter、DataSet访问数据库。在这种情况下,SqlCommand的内容通常为查询。例:
public DataSet SelectSqlRows(DataSet dataSet,string connection,string query)
{
SqlConnection conn = new SqlConnection(connection);
SqlDataAdapter adapter = new SqlDataAdapter();
Adapter.SelectCommand = new SqlCommand(query,conn);
Adapter.Fill(dataSet);
Return dataSet;
}
二、SqlConnection
SqlConnection表示与数据源的一个唯一的会话。必须使用close或dispose关闭。如果执行SqlCommand生成SqlException时,严重度小于等于19时,不会关闭连接。大于19时会关闭连接。
三、SqlCommand
表示要对数据库执行的一个Sql或存储过程。
有四种方式:
ExecuteReader:主要用于Select等查询语句。例:
cmd.CommandText = “select a,b from k”;
SqlDataReader myReader = cmd.ExecuteReader();
Try
{
while (myReader.Read())
{
Console.WriteLine(myReader.GetInt32(0)+” “+myReader.GetInt32(1));
}
}
catch
{
myReader.Close();
//关闭连接
}
ExecuteNonQuery:主要用于数据库操作语句。
ExecuteScalar:主要用于聚合查询语句,或返回一个值的查询,或结果集中第一行的第一列或空引用(如果结果集为空)。例:
Cmd.CommandText = “select count(*) from orders”;
Int32 I = (Int32)cmd.ExecuteScalar();
ExecuteXMLReader:将 CommandText 发送到 Connection 并生成一个 XmlReader 对象。
四、SqlDataReader
上面已举过例了。需要说明的是:在读数之前,SqlDataReader默认位置在所有记录前。需调用Read()来访问数据。
Read()的作用是行进到下一条记录,是Bool型的,如有记录返true,否则返false。
四、SqlDataAdapter
用得较多了。
五、事务
DataSet中的事务只用于DataSet,真正的事务控制在这里进行。
一般的过程是这样的:
//建立并打开连接
SqlConnection conn = new SqlConnection(…………);
SqlConnection.Open();
//创建myCommand;
SqlCommand myCommand = SqlConnection.CreateCommand();
//创建事务
SqlTransaction trans = SqlConnection.BeginTransaction(IsolationLevel.ReadCommitted,"SampleTransaction");
//将事务、连接与Command对象相关
MyCommand.Connection = myConnection; //这句是多余的,上面已有同样功能
MyCommand.Transaction = trans;
Try
{
myCommand.CommandText = “ “;
myCommand.ExcuteNonQuery();
trans.Commit(); //提交事务
}
catch(SqlException s)
{
trans.Rollback(“SampleTransaction”); //回滚事务
}
从这个程序可以很清楚地表明:事务是由SqlConnection创建,并必须关联到SqlCommand,最后由事务自身来进行提交或回滚操作的。
同时可以看到:一个连接可以打开多个不同名的事务。
还有:IsolationLevel事务隔离级别(枚举)有如下几种:
Chaos:无法改写隔离级别更高的事务中挂起的操作。
ReadCommitted:在正在读取数据时保持共享锁,避免脏读。
ReadUncommitted:可以脏读。
RepeatableRead:可重复读取。
Serializable:最高级别。
分别与SQL Server中四种隔离级别对应。