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的实例

 

        public void dbprovider()
        {
            
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文件中的节点如下

 

  <connectionStrings>
    
<add name="AdWEntities" connectionString="Data Source=localhost;Initial Catalog=AdventureWorks2008;User ID=sa;Password=pass;" providerName="System.Data.SqlClient"/>
  
</connectionStrings>

 

通过工厂模式,以字符串的方式来生成实例,可以使datareader的生成与具体数据库无关,很好的封装了变化,sqlparameter的使用破坏了这种封装,以后的篇幅里会有关于设计模式的讨论