Enterprise Library 2.0 中的 Cryptography Application Block

它为我们开发者提供了对数据处理的大部分通用的方法。其内容包括:
1、使用DataReader返回多行数据
2、使用DataSet返回多行数据
3、返回一个输出型参数
4、返回一个单一值
5、事务处理
6、返回XML数据
7、使用DataSet来修改数据库

None.gif<?xml version="1.0" encoding="utf-8"?>
None.gif
<configuration>
None.gif  
<configSections>
None.gif    
<section name="dataConfiguration" type="Microsoft.Practices.EnterpriseLibrary.Data.Configuration.DatabaseSettings, Microsoft.Practices.EnterpriseLibrary.Data, Version=2.0.0.0, Culture=neutral, PublicKeyToken=null" />
None.gif  
</configSections>
None.gif  
<dataConfiguration defaultDatabase="Connection String" />
None.gif  
<connectionStrings>
None.gif    
<add name="Connection String" connectionString="Database=EnterpriseLibrary;Server=shy;Integrated Security=SSPI;uid=sa;pwd=;"
None.gif      providerName
="System.Data.SqlClient" />
None.gif  
</connectionStrings>
None.gif
</configuration>
在其中的ConnectionStrings节里我们可以看到我们刚刚配置时输入的数据库信息。

  下面我们重点来说一下DataAccess Application Block操作数据库的方法。
1、创建一个数据库实例DataBase

None.gif         // 创建一个默认的数据库实例
None.gif
            Database defaultdb  =  DatabaseFactory.CreateDatabase();
None.gif            
// 创建一个名为Connection String的数据库实例
None.gif
            Database db  =  DatabaseFactory.CreateDatabase( " Connection String " );
None.gif            
// 上面两种创建数据库实例的方法的数据库可以是任何类型的数据库,取决于Config文件中的配置信息
None.gif            
// 下面的这种方面展示了创建一个SQL数据库的实例,需引用Microsoft.Practices.EnterpriseLibrary.Data.Sql程序集
None.gif
            SqlDatabase dbsql  =  DatabaseFactory.CreateDatabase( " Connection String " as  SqlDatabase;
None.gif            
// 我们同样也可以不通过配置文件来创建数据库实例,如下
None.gif
             string  connString  =   " server=.;database=EnterpriseLibrary;uid=sa;pwd= " ;
None.gif            SqlDatabase nocofigdb 
=   new  SqlDatabase(connString);

2、创建DbCommand
      DbCommand的创建方式有两种:一种是为了调用存储过程创建,一种是为了执行一般的SQL语句而创建,具体用哪一种方式,就要看你需要执行的是存储过程还是SQL语句了。

None.gif          // 创建一个SQL语句的DbCommand
None.gif
            Database db  =  DatabaseFactory.CreateDatabase();
None.gif            
string  sql  =   " Select * from person " ;
None.gif            DbCommand Sqldbcomm 
=  db.GetSqlStringCommand(sql);
None.gif            
// 创建一个存储过程的DbCommand
None.gif            
// 存储过程名称为GetAllPersonByName
None.gif
             string  procName  =   " GetAllPersonByName " ;
None.gif            DbCommand Procdbcomm 
=  db.GetStoredProcCommand(procName);

3、存储过程中的参数处理
DataBase类中包含多种传递存储过程参数的方法,也包含了得到和设置参数值的方法,如下:
AddParameter. 为存储过程传递一个参数(输入型或输出型)
AddInParameter. 为存储过程传递一个输入型参数
AddOutParameter. 为存储过程传递一个输出型参数
GetParameterValue. 获取某存储过程指定参数的值
SetParameterValue. 为存储过程的某个参数赋值,当你需要用同一个方法来执行插入多条记录时,就可参数给参数赋值的方法来进行

None.gif // 创建一个存储过程的DbCommand
None.gif            
// 存储过程名称为GetAllPersonByName
None.gif
             string  procName  =   " GetAllPersonByName " ;
None.gif            DbCommand Procdbcomm 
=  db.GetStoredProcCommand(procName);
None.gif
None.gif            
// 添加一个输入型的参数
None.gif
            db.AddInParameter(Procdbcomm,  " @sex " , DbType.String);
None.gif            
// 添加一个输出型的参数
None.gif
            db.AddOutParameter(Procdbcomm,  " @name " , DbType.String, 20 );
None.gif            
// 设置参数的值
None.gif
            db.SetParameterValue(Procdbcomm,  " @sex " " " );
None.gif
None.gif            
// 执行存储过程
None.gif
            db.ExecuteNonQuery(Procdbcomm);
None.gif
None.gif            
// 得到输出参数的值,注意转化返回值类型
None.gif
             string  outvalue  =  ( string ) db.GetParameterValue(Procdbcomm,  " @name " );

4、执行ExecuteReader方法返回一个IDataReader类型的数据集

       因为ExecuteReader方法在一开始执行时就打开了一个与数据库的连接,所以我们必须注意在使用结束时关闭连接,而用using(){}语句块就能确保ExecuteReader方法在执行完毕时关闭与数据库的连接。
       什么时候使用此方法:
 返回的数据仅仅用来显示,并不对其进行修改,删除等操作;  
 绑定返回的数据到WebForm Control
 不需要缓存返回的数据,用完就释放

None.gif          using  (IDataReader reader  =  db.ExecuteReader(CommandType.Text,  " select * from person " ))
ExpandedBlockStart.gifContractedBlock.gif            
dot.gif {
InBlock.gif                DataGrid1.DataSource 
= reader;
InBlock.gif                DataGrid1.DataBind();
ExpandedBlockEnd.gif            }

5、执行ExecuteDataSet方法返回一个DataSet
    

None.gif public  DataSet GetPersonList()
ExpandedBlockStart.gifContractedBlock.gif        
dot.gif {
InBlock.gif            Database db 
= DatabaseFactory.CreateDatabase();
InBlock.gif            DbCommand dbcomm 
= db.GetSqlStringCommand("select * from person");
InBlock.gif
InBlock.gif            
return db.ExecuteDataSet(dbcomm);
ExpandedBlockEnd.gif        }

什么时候使用此方法:
    需要返回多表数据;
    如果你需要逐一访问数据库的每一条记录,这个时候如果使用DataReader的话,则会使与数据库的连接一直处于打开的状态,长此以往,就会使应用程序的性能和可伸缩性大大降低;
    需要和其他的应用程序交换数据;

6、执行ExecuteNonQuery
   该方法返回的是SQL语句执行影响的行数,我们可以利用该方法来执行一些没有返回值的操作(Insert,Update,Delete)

None.gif      public   void  AddPerson()
ExpandedBlockStart.gifContractedBlock.gif        
dot.gif {
InBlock.gif            Database db 
= DatabaseFactory.CreateDatabase();
InBlock.gif            DbCommand dbcomm 
= db.GetSqlStringCommand("insert into person values(1,'shy','女','123456')");
InBlock.gif
InBlock.gif            db.ExecuteNonQuery(dbcomm);
ExpandedBlockEnd.gif        }

7、执行ExecuteScalar返回单值

None.gif      public   string  GetPersonName()
ExpandedBlockStart.gifContractedBlock.gif        
dot.gif {
InBlock.gif            Database db 
= DatabaseFactory.CreateDatabase();
InBlock.gif            DbCommand dbcomm 
= db.GetSqlStringCommand("select name from person");
InBlock.gif
InBlock.gif            
return (string)db.ExecuteScalar(dbcomm);
ExpandedBlockEnd.gif        }

8、事务处理

None.gif       public   void  UseTransaction()
ExpandedBlockStart.gifContractedBlock.gif        
dot.gif {
InBlock.gif            Database db 
= DatabaseFactory.CreateDatabase();
InBlock.gif            DbCommand dbcomm1 
= db.GetSqlStringCommand("update person set name='pw'");
InBlock.gif            DbCommand dbcomm2 
= db.GetSqlStringCommand("delete from person where id=1");
InBlock.gif
InBlock.gif            
using (DbConnection conn = db.CreateConnection())
ExpandedSubBlockStart.gifContractedSubBlock.gif            
dot.gif{
InBlock.gif                
//打开连接
InBlock.gif
                conn.Open();
InBlock.gif                
//创建事务
InBlock.gif
                DbTransaction trans = conn.BeginTransaction();
InBlock.gif
InBlock.gif                
try
ExpandedSubBlockStart.gifContractedSubBlock.gif                
dot.gif{
InBlock.gif                    db.ExecuteNonQuery(dbcomm1);
InBlock.gif
InBlock.gif                    db.ExecuteNonQuery(dbcomm2);
InBlock.gif
InBlock.gif                    
//都执行成功则提交事务
InBlock.gif
                    trans.Commit();
ExpandedSubBlockEnd.gif                }

InBlock.gif                
catch(Exception)
ExpandedSubBlockStart.gifContractedSubBlock.gif                
dot.gif{
InBlock.gif                    
//发生异常,事务回滚
InBlock.gif
                    trans.Rollback();
ExpandedSubBlockEnd.gif                }

InBlock.gif                
//关闭连接
InBlock.gif
                conn.Close();
ExpandedSubBlockEnd.gif            }

ExpandedBlockEnd.gif        }

9、执行ExecuteXmlReader返回XML数据
   支持Sql Server 2000 及以后版本的数据库,对微软以外的数据库应该不支持。

None.gif      public   void  UseXMLReader()
ExpandedBlockStart.gifContractedBlock.gif        
dot.gif {
InBlock.gif            SqlDatabase dbSQL 
= DatabaseFactory.CreateDatabase("Connection String"as SqlDatabase;
InBlock.gif
InBlock.gif            
// 要返回XML数据需要在SQL语句后加 FOR XML AUTO
InBlock.gif
            string sqlCommand = "SELECT ProductID, ProductName FROM Products FOR XML AUTO";
InBlock.gif            DbCommand dbCommand 
= dbSQL.GetSqlStringCommand(sqlCommand);
InBlock.gif
InBlock.gif            XmlReader personReader 
= null;
InBlock.gif            StringBuilder personlist 
= new StringBuilder();
InBlock.gif
InBlock.gif            
try
ExpandedSubBlockStart.gifContractedSubBlock.gif            
dot.gif{
InBlock.gif                personReader 
= dbSQL.ExecuteXmlReader(dbCommand);
InBlock.gif
InBlock.gif                
// 循环向XML中写入我们查询得到的数据
InBlock.gif
                while (!personReader.EOF)
ExpandedSubBlockStart.gifContractedSubBlock.gif                
dot.gif{
InBlock.gif                    
if (personReader.IsStartElement())
ExpandedSubBlockStart.gifContractedSubBlock.gif                    
dot.gif{
InBlock.gif                        personlist.Append(personReader.ReadOuterXml());
InBlock.gif                        personlist.Append(Environment.NewLine);
ExpandedSubBlockEnd.gif                    }

ExpandedSubBlockEnd.gif                }

ExpandedSubBlockEnd.gif            }

InBlock.gif            
finally
ExpandedSubBlockStart.gifContractedSubBlock.gif            
dot.gif{
InBlock.gif                
// 关闭 Reader.
InBlock.gif
                if (personReader != null)
ExpandedSubBlockStart.gifContractedSubBlock.gif                
dot.gif{
InBlock.gif                    personReader.Close();
ExpandedSubBlockEnd.gif                }

InBlock.gif
InBlock.gif                
// 关闭数据库连接
InBlock.gif
                if (dbCommand.Connection != null)
ExpandedSubBlockStart.gifContractedSubBlock.gif                
dot.gif{
InBlock.gif                    dbCommand.Connection.Close();
ExpandedSubBlockEnd.gif                }

ExpandedSubBlockEnd.gif            }

InBlock.gif
InBlock.gif
ExpandedBlockEnd.gif        }

10、用DataSet批量的添加,修改,删除数据

None.gif public   void  UpdateDataBase()
ExpandedBlockStart.gifContractedBlock.gif        
dot.gif {
InBlock.gif            Database db 
= DatabaseFactory.CreateDatabase();
InBlock.gif
InBlock.gif            DataSet personDataSet 
= new DataSet();
InBlock.gif
InBlock.gif            
string sqlCommand = "Select * from person";
InBlock.gif            DbCommand dbCommand 
= db.GetSqlStringCommand(sqlCommand);
InBlock.gif
InBlock.gif            
string personTable = "person";
InBlock.gif
InBlock.gif            
// 得到初始化数据
InBlock.gif
            db.LoadDataSet(dbCommand, personDataSet, personTable);
InBlock.gif
InBlock.gif            
// 得到未修改前的数据集
InBlock.gif
            DataTable table = personDataSet.Tables[personTable];
InBlock.gif
InBlock.gif            
// 往DataSet中添加一行数据
ExpandedSubBlockStart.gifContractedSubBlock.gif
            DataRow addedRow = table.Rows.Add(new object[] dot.gif18"New person""""654321" });
InBlock.gif
InBlock.gif            
// 修改
InBlock.gif
            table.Rows[0]["ProductName"= "Modified product";
InBlock.gif
InBlock.gif            
// 下面分别创建添加,修改,删除的操作
InBlock.gif
            DbCommand insertCommand = db.GetStoredProcCommand("AddPerson");
InBlock.gif            db.AddInParameter(insertCommand, 
"Name", DbType.String, "Name", DataRowVersion.Current);
InBlock.gif            db.AddInParameter(insertCommand, 
"Sex", DbType.String, "Sex", DataRowVersion.Current);
InBlock.gif            db.AddInParameter(insertCommand, 
"ID", DbType.Int32, "ID", DataRowVersion.Current);
InBlock.gif
InBlock.gif            DbCommand deleteCommand 
= db.GetStoredProcCommand("DeletePerson");
InBlock.gif            db.AddInParameter(deleteCommand, 
"ID", DbType.Int32, "ID", DataRowVersion.Current);
InBlock.gif
InBlock.gif            DbCommand updateCommand 
= db.GetStoredProcCommand("UpdatePerson");
InBlock.gif            db.AddInParameter(updateCommand, 
"Name", DbType.String, "Name", DataRowVersion.Current);
InBlock.gif            db.AddInParameter(updateCommand, 
"Sex", DbType.String, "Sex", DataRowVersion.Current);
InBlock.gif            db.AddInParameter(insertCommand, 
"ID", DbType.Int32, "ID", DataRowVersion.Current);
InBlock.gif
InBlock.gif            
// 提交对DataSet的修改,并返回影响的行数
InBlock.gif
            int rowsAffected = db.UpdateDataSet(productsDataSet, "Products", insertCommand, updateCommand, deleteCommand, Microsoft.Practices.EnterpriseLibrary.Data.UpdateBehavior.Standard);
ExpandedBlockEnd.gif        }

转载于:https://www.cnblogs.com/Javel/archive/2007/08/07/846109.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值