ADO.Net 浅析(三)

对于第一篇文章,我个人比较满意,至少是把代码注释得比较浅显易懂了.



下面是对前面文章的一些补充

关于sqlcommand,

ADO.Net 浅析(三)_第1张图片

而其后又对这个进行了一些补充

如果使用 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的使用破坏了这种封装,以后的篇幅里会有关于设计模式的讨论

你可能感兴趣的:(.net)