ADO.Net 浅析(三)
对于第一篇文章,我个人比较满意,至少是把代码注释得比较浅显易懂了.
下面是对前面文章的一些补充
关于sqlcommand,
而其后又对这个进行了一些补充
如果使用 SQL Server 2005 之前的 SQL Server 版本,在使用 SqlDataReader 时,关联的 SqlConnection 将忙于为 SqlDataReader 服务。当处于此状态时,除了关闭 SqlConnection 外,不能对其执行其他任何操作。除非调用 SqlDataReader 的 Close 方法,否则会一直处于此状态。从 SQL Server 2005 开始,多活动结果集 (MARS) 功能允许多个操作使用同一连接。
关于ExecuteReader 方法的一些细节:
1.执行返回行的命令。为了提高性能,ExecuteReader 使用 Transact-SQL sp_executesql 系统存储过程调用命令。因此,如果 ExecuteReader 用于执行命令(例如 Transact-SQL SET 语句),则它可能不会产生预期的效果。
MSSQL 为我们提供了两种动态执行SQL语句的命令,分别是EXEC和sp_executesql;通常,sp_executesql则更具有优势,它提供了输入输出接口,而EXEC没有。还有一个最大的好处就是利用sp_executesql,能够重用执行计划,这就大大提供了执行性能(对于这个我在后面的例子中会详加说明),还可以编写更安全的代码。EXEC在某些情况下会更灵活。除非您有令人信服的理由使用EXEC,否侧尽量使用 sp_executesql.
下面是一个使用datareader的实例
{
string dp = ConfigurationManager.ConnectionStrings["AdWEntities"].ProviderName;//取得config文件中的providername
string connstr = ConfigurationManager.ConnectionStrings["AdWEntities"].ConnectionString;//取得ConnectionString
DbProviderFactory df = DbProviderFactories.GetFactory(dp);//创建provierfactory实例,用来生成connection和command对象的实例;
DbConnection conn = df.CreateConnection();
conn.ConnectionString = connstr;
conn.Open();
DbCommand dbcmd = df.CreateCommand();
dbcmd.Connection = conn;
dbcmd.CommandType = CommandType.StoredProcedure;//设置CommandType 为存储过程
dbcmd.CommandText = "uspGetEmployeeManagers";//设置存储过程名
DbParameter dbp = new SqlParameter("@BusinessEntityID", SqlDbType.Int);
dbp.Value = "2";//生成参数对象
dbcmd.Parameters.Add(dbp);
DbDataReader rd = dbcmd.ExecuteReader(CommandBehavior.CloseConnection);//CommandBehavior.CloseConnection参数,当rd.close()时,关闭connection
while (rd.Read())
{
Console.WriteLine("empName {0} {1},\r\nmanagerName{2} {3}", rd[2], rd[3],rd[5],rd[6]);
}
rd.Close();
}
首先是一段对配置文件的使用.
ConfigurationManager.ConnectionStrings属性可以使用config文件中的节点如下
<add name="AdWEntities" connectionString="Data Source=localhost;Initial Catalog=AdventureWorks2008;User ID=sa;Password=pass;" providerName="System.Data.SqlClient"/>
</connectionStrings>
通过工厂模式,以字符串的方式来生成实例,可以使datareader的生成与具体数据库无关,很好的封装了变化,sqlparameter的使用破坏了这种封装,以后的篇幅里会有关于设计模式的讨论