zoukankan      html  css  js  c++  java
  • 微软企业库5.0学习笔记(十二)

    企业库数据库访问模块通过抽象工厂模式,允许用户通过简单的配置选择不同的数据库作为程序的数据源,大大解决了切换数据库时带来的麻烦.因为我本机只安装了SQL Server 2005,所以在此只做SQL的演示,需要深究的朋友可以访问以下网站:

    http://msdn.microsoft.com/en-us/library/ff664408%28v=PandP.50%29.aspx

     

    企业库数据库访问模块的几大功能:

    1.        最简单的功能,通过ExecuteNonQuery.方法执行SQL语句.

    2.        执行ExecuteDataSet,返回DataSet类型的数据集.

    3.        执行ExecuteScalar,获取影响的行数.

    4.        执行存储过程.

    5.        通过代码实现事务.

    6.        通过DataSet更新数据库.

    7.        返回值XML化.

    8.       将返回的数据对象化.

    9.       异步访问数据库.


    以上的功能我会在下面一一介绍,测试程序我已打包,大家可以点击这里下载.

     

    下面介绍如何使用Microsoft Enterprise Library 5.0中的数据库访问模块.

     

    1.   首先创建一个测试数据库,创建数据库的SQL文件我打包在压缩包里了,大家可以点击上面的下载链接下载.执行完SQL文件后,可以看到我们创建好的TestDB数据库:

     

     

    2.   下载安装好MicrosoftEnterprise Library 5.0,然后在运行EntLibConfig.exe,选择Blocks菜单 ,单击 AddDatabase Settings .

     


    3.    配置好文件之后保存为App.config文件,并添加到创建好的应用程序中.并添加相应的引用,在此我不再多讲,大家下载我打包好的程序运行即可看到

     

     

    4.      下面来介绍我在应用程序中实现的各个功能:

    (1)     通过ExecuteNonQuery.方法执行SQL语句:      

     

    /// <summary>
    /// 执行ExecuteNonQuery
    /// </summary>
    private void ExecuteNonQuery_Click(object sender, EventArgs e)
    {
    db.ExecuteNonQuery(CommandType.Text, "INSERT INTO [College] ([CollegeID],[Name]) values (6,'体育学院')");
    }

     


     

    (2)    执行ExecuteDataSet,返回DataSet类型的数据集.

     

    /// <summary>
    /// 执行ExecuteDataSet,返回College列表
    /// </summary>
    /// <returns></returns>
    private void ExecuteDataSet_Click(object sender, EventArgs e)
    {
    string sql = "select * from College";
    DbCommand dw = db.GetSqlStringCommand(sql);

    dataGridView1.DataSource = db.ExecuteDataSet(dw).Tables[0];
    }

     

    (3)    执行ExecuteScalar,获取影响的行数.

     

    /// <summary>
    /// 执行ExecuteScalar,返回单一的值
    /// </summary>
    /// <returns></returns>
    private void ExecuteScalar_Click(object sender, EventArgs e)
    {
    Database db = DatabaseFactory.CreateDatabase("ConnectionString");

    string sql = "select count(*) from College";
    DbCommand dc = db.GetSqlStringCommand(sql);

    string str = "影响的行数:" + (int)db.ExecuteScalar(dc);

    MessageBox.Show(str);
    }

     

     

     

    (4)    执行存储过程.

     

    /// <summary>
    /// 执行存储过程
    /// </summary>
    private void StoredProcCommand_Click(object sender, EventArgs e)
    {
    DbCommand dc = db.GetStoredProcCommand("usp_College_LoadByID");

    db.AddInParameter(dc, "@CollegeID", System.Data.DbType.Int32, 5);

    dataGridView1.DataSource = db.ExecuteDataSet(dc).Tables[0];
    }

     

     

     

    (5)    通过代码实现事务.

     

    /// <summary>
    /// 事务
    /// </summary>
    private void Transaction_Click(object sender, EventArgs e)
    {
    DbCommand dc1 = db.GetStoredProcCommand("usp_College_Insert");

    db.AddInParameter(dc1, "@CollegeID", DbType.Int32, 7);
    db.AddInParameter(dc1, "@Name", DbType.String, "文旅学院");

    DbCommand dc2 = db.GetStoredProcCommand("usp_College_Insert");

    db.AddInParameter(dc2, "@CollegeID", DbType.Int32, 7);
    db.AddInParameter(dc2, "@Name", DbType.String, "化工学院");

    using (DbConnection conn = db.CreateConnection())
    {
    conn.Open();
    DbTransaction trans = conn.BeginTransaction();

    try
    {
    //添加一个ID为7的学院
    db.ExecuteNonQuery(dc1, trans);

    //添加一个ID为7的学院,主键重复,事务将回滚
    db.ExecuteNonQuery(dc2, trans);

    //提交事务.
    trans.Commit();
    }
    catch
    {
    //回滚
    trans.Rollback();
    }
    conn.Close();
    }

    //查看数据库,数据未被添加,说明事务已回滚
    ExecuteDataSet_Click(null, null);
    }

     

     

     

    (6)    通过DataSet更新数据库.

     

    /// <summary>
    /// 通过DataSet更新数据库
    /// </summary>
    private void DataSetUpdate_Click(object sender, EventArgs e)
    {
    DataSet productsDataSet = new DataSet();

    string sql = "Select * From College";
    DbCommand cmd = db.GetSqlStringCommand(sql);

    string CollegeTableName = "College";

    //恢复原始数据
    db.LoadDataSet(cmd, productsDataSet, CollegeTableName);

    //获取数据表格
    DataTable dTable = productsDataSet.Tables[CollegeTableName];

    //添加一个新信息入DataSet中
    DataRow addedRow = dTable.Rows.Add(new object[] { 8, "外国语学院" });

    //修改一个原有数据
    dTable.Rows[0]["Name"] = "国教院";

    //提供插入,更新,删除存储过程
    DbCommand insertCommand = db.GetStoredProcCommand("usp_College_Insert");
    db.AddInParameter(insertCommand, "@CollegeID", DbType.Int32, "CollegeID", DataRowVersion.Current);
    db.AddInParameter(insertCommand, "@Name", DbType.String, "Name", DataRowVersion.Current);

    DbCommand deleteCommand = db.GetStoredProcCommand("usp_College_Delete");
    db.AddInParameter(deleteCommand, "@CollegeID", DbType.Int32, "CollegeID", DataRowVersion.Current);

    DbCommand updateCommand = db.GetStoredProcCommand("usp_College_Update");
    db.AddInParameter(updateCommand, "@CollegeID", DbType.Int32, "CollegeID", DataRowVersion.Current);
    db.AddInParameter(updateCommand, "@Name", DbType.String, "Name", DataRowVersion.Current);

    //通过DataSet更新数据库
    int rowsAffected = db.UpdateDataSet(productsDataSet, CollegeTableName, insertCommand, updateCommand, deleteCommand,
    Microsoft.Practices.EnterpriseLibrary.Data.UpdateBehavior.Standard);

    MessageBox.Show("影响的行数:" + rowsAffected);
    }

     

     

     

    (7)    返回值XML化.

     

    /// <summary>
    /// 返回值XML化
    /// </summary>
    private void ReturnXML_Click(object sender, EventArgs e)
    {
    //使用"FOR XML AUTO"参数使得SQL返回XML格式的信息
    SqlDatabase sqldb = (SqlDatabase)DatabaseFactory.CreateDatabase("ConnectionString");

    DbCommand cmd = sqldb.GetSqlStringCommand("SELECT * FROM College FOR XML AUTO");
    IEnumerable<string> productList;

    using (var reader = sqldb.ExecuteXmlReader(cmd))
    {
    if (reader.IsStartElement())
    {
    var root = (XElement)XNode.ReadFrom(reader);
    productList = root.Elements("CollegeID")
    .Attributes("Name")
    .Select(a => a.Value).ToArray();

    MessageBox.Show(((XElement)root).ToString());
    }
    }
    }

     

     

     

    (8)    将返回的数据对象化.

     

    /// <summary>
    /// DataAsObject
    /// </summary>
    private void DataAsObject_Click(object sender, EventArgs e)
    {
    //将返回的数据对象化
    var results = db.ExecuteSprocAccessor<College>("usp_College_LoadAll");

    MessageBox.Show(results.ElementAt(0).ToString());
    }

     

     

     

     

    (9)    异步访问数据库.

     

    /// <summary>
    /// 异步访问数据库
    /// </summary>
    private void Async_Click(object sender, EventArgs e)
    {
    //创建新的数据库连接,属性必须添加:Asynchronous Processing=true
    String connectionString = @"server=(local); database=TestDB; Integrated Security=true; Asynchronous Processing=true";
    Database Sqldb = new SqlDatabase(connectionString);
    DbCommand cmd = Sqldb.GetStoredProcCommand("usp_College_LoadbyID");
    Sqldb.AddInParameter(cmd, "@CollegeID", DbType.Int32, 1);

    try
    {
    IAsyncResult result = Sqldb.BeginExecuteReader(cmd, MyEndExecuteCallback, Sqldb);
    }
    catch (Exception ex)
    {
    MessageBox.Show(ex.ToString());
    }
    }

    //当获取完毕执行该函数
    private void MyEndExecuteCallback(IAsyncResult result)
    {
    try
    {
    Database Sqldb = (Database)result.AsyncState;
    IDataReader reader = db.EndExecuteReader(result);

    College c = new College((int)reader[0], (string)reader[1]);

    MessageBox.Show(c.ToString());
    }
    catch(Exception ex)
    {
    MessageBox.Show(ex.ToString());
    }
    }

     

    唉,不得不承认我们学校的老师大多数都很有实力,但为什么就是不懂怎么教书呢.....

     

     

    出处:http://www.cnblogs.com/huangcong/archive/2010/05/31/1748672.html  

  • 相关阅读:
    7月的尾巴,你是XXX
    戏说Android view 工作流程《下》
    “燕子”
    Android开机动画bootanimation.zip
    戏说Android view 工作流程《上》
    ViewController里已连接的IBOutlet为什么会是nil
    My first App "Encrypt Wheel" is Ready to Download!
    iOS开发中角色Role所产生的悲剧(未完)
    UIScrollView实现不全屏分页的小技巧
    Apple misunderstood my app,now my app status changed to “In Review”
  • 原文地址:https://www.cnblogs.com/Leo_wl/p/1749973.html
Copyright © 2011-2022 走看看