• Enterprise Library v5.0 Data Access Application Block 开发向导(2)


    Data Access 应用程序块是最常用的Application block之一,因为它可以更容易地实现大多数数据访问操作,不必重复编写数据访问代码,甚至不必关心应用程序的数据库。如果使用DAAB,你可以很容易转换应用程序使用不同的数据库,不必重写代码、编译和部署。管理员可以更改目标数据库到不同的服务器,甚至到不同的数据库类型(如SQL Server或Oracle等等)。DAAB包含了SQL Server、SQL Server Compact Edition 和Oracle数据库提供程序。
     
    DAAB 能够做什么?
    DAAB抽象了实际使用的数据库,暴露了一系列方法,更容易访问数据库,完成通用的任务。例如,你可简单创建一个合适的Database类实例,然后使用该对象获取一个合适的Command实例,接着传递给Database类的ExecuteDataSet方法,最终得到一个DataSet对象。你不必创建DataAdapter或者调用Fill方法。ExecuteDataSet方法管理数据库连接,并执行填充DataSet的所有任务。相同地,也可以通过Database类获得DataReader对象。
     
    如何使用DAAB?
    首先需要添加DAAB 的程序集,配置需要访问的数据库,添加其他相关的程序集到项目中。接着创建数据库对象实例,并读取和操作数据。
     
    创建数据库对象实例
    可以使用多种方法获取想访问的Database 实例。下面的范例代码通过调用EnterpriseLibraryContainer的静态属性Current的GetInstance方法,来获得Database实例。
            static Database defaultDB = null;
     
            private void Form1_Load(object sender, EventArgs e)
            {
                // Resolve the default Database object from the container.
                // The actual concrete type is determined by the configuration settings.
                defaultDB = EnterpriseLibraryContainer.Current.GetInstance<Database>();
            }
     
    上述代码演示了如何获取默认数据库的实例。当然,也可使用连接字符串(Connection string)的名称,来获取命名的数据库实例。
    static Database namedDB = null;
    // Resolve a Database object from the container using the connection string name.
    namedDB = EnterpriseLibraryContainer.Current.GetInstance<Database>("ExampleDatabase");
     
    上述代码引用了Database基类的实例,其中一些功能仅仅适用于具体的数据库类型。如ExecuteXmlReader方法仅仅适用于SqlDatabase类。如果你想使用这一功能,你必须转换数据库类型为具体的类型。如下范例代码创建一个SqlDatabase对象实例。
    static SqlDatabase sqlServerDB = null;
    // Resolve a SqlDatabase object from the container using the default database.
    sqlServerDB = EnterpriseLibraryContainer.Current.GetInstance<Database>() as SqlDatabase;
     
    读取多条数据记录
    简单的查询包含一个SQL语句或一个存储过程,不接收参数,执行ExecuteReader方法。如下代码演示一个简单的调用存储过程的方法,你可以忽略CommandType参数,默认为CommandType.StoredProcedure(在ADO.NET中,默认为CommandType.Text)。
    // Call the ExecuteReader method by specifying just the stored procedure name.
    using (IDataReader reader = namedDB.ExecuteReader("MyStoredProcName"))
    {
    // Use the values in the rows as required.
    }
     
    如果使用SQL脚本,则必须指定CommandType参数,如下所示。
    // Call the ExecuteReader method by specifying the command type
    // as a SQL statement, and passing in the SQL statement.
    using (IDataReader reader = namedDB.ExecuteReader(CommandType.Text,
    "SELECT TOP 1 * FROM OrderList"))
    {
    // Use the values in the rows as required ‐ here we are just displaying them.
    DisplayRowValues(reader);
    }
    private static void DisplayRowValues(IDataReader reader)
    {
    while (reader.Read())
    {
    for (int i = 0; i < reader.FieldCount; i++)
    {
    Console.WriteLine("{0} = {1}", reader.GetName(i), reader[i].ToString());
    }
    Console.WriteLine();
    }
    }
     
    输出结果为数据列和相对应的字段值列表,如下所示。
    Id = 1
    Status = DRAFT
    CreatedOn = 01/02/2009 11:12:06
    Name = Adjustable Race
    LastName = Abbas
    FirstName = Syed
    ShipStreet = 123 Elm Street
    ShipCity = Denver
    ShipZipCode = 12345
    ShippingOption = Two‐day shipping
    State = Colorado
     
    使用参数数组读取多条数据记录
    上述范例代码演示了不带参数的存储过程和SQL语句,然而在多数情况下,我们需要采用接收传入参数的查询。如果你仅仅使用传入参数,可以包裹传入参数为Object数组,并传递给存储过程或SQL语句。注意,必须按照查询需要的参数次序,将参数值添加到数组中 – 你仅仅需要提供实际的参数值。如下范例代码演示如何传入一个字符串参数给存储过程。
    // Call the ExecuteReader method with the stored procedure
    // name and an Object array containing the parameter values.
    using (IDataReader reader = defaultDB.ExecuteReader("ListOrdersByState",
    new object[] { "Colorado" }))
    {
    // Use the values in the rows as required ‐ here we are just displaying them.
    DisplayRowValues(reader);
    }
     
    使用带命名参数的查询,读取多条数据记录
    上述带参数值数组的范例代码简单且有效,但是有一些限制。首先,它不支持你指定参数的方向(如输入或输出),或数据类型 – 如传入参数的数据类型不完全匹配(或者不能隐式转化)存储过程的参数类型,将发生错误。
     
    为了使用命名参数或定义类型的参数,你必须访问Command对象,该对象用来执行查询,并操作参数集合。DAAB通过Database类提供GetSqlStringCommand 和 GetStoredProcCommand 方法,使创建和访问 Command 对象更加容易。这些方法为配置的数据库返回一个合适的Command实例。
     
    在创建好合适的Command实例之后,你可使用Database类的大量方法来操作参数集合。如使用AddInParameter或AddOutParameter方法,添加特定方向的参数。或者使用AddParameter方法,且带ParameterDirection参数值。你可以使用GetParameterValue和SetParameterValue方法,更改已经加入到Command实例的参数值。
     
    下面范例代码演示如何轻松创建Command实例,添加输入参数,并执行SQL语句和存储过程。注意Database类添加参数到Command实例,包括参数名、数据类型和参数值。
    // Read data with a SQL statement that accepts one parameter.
    string sqlStatement = "SELECT TOP 1 * FROM OrderList WHERE State LIKE @state";
    // Create a suitable command type and add the required parameter.
    using (DbCommand sqlCmd = defaultDB.GetSqlStringCommand(sqlStatement))
    {
    defaultDB.AddInParameter(sqlCmd, "state", DbType.String, "New York");
    // Call the ExecuteReader method with the command.
    using (IDataReader sqlReader = namedDB.ExecuteReader(sqlCmd))
    {
    Console.WriteLine("Results from executing SQL statement:");
    DisplayRowValues(sqlReader);
    }
    }
    // Now read the same data with a stored procedure that accepts one parameter.
    string storedProcName = "ListOrdersByState";
    // Create a suitable command type and add the required parameter.
    using (DbCommand sprocCmd = defaultDB.GetStoredProcCommand(storedProcName))
    {
    defaultDB.AddInParameter(sprocCmd, "state", DbType.String, "New York");
    // Call the ExecuteReader method with the command.
    using (IDataReader sprocReader = namedDB.ExecuteReader(sprocCmd))
    {
    Console.WriteLine("Results from executing stored procedure:");
    DisplayRowValues(sprocReader);
    }
    }
  • 相关阅读:
    Restful
    RESTful
    UUID使用
    Security注解:@PreAuthorize,@PostAuthorize, @Secured, EL实现方法安全
    java Spring定时器 每个季度执行一次
    给文字加小手样式
    java 根据年月获取当前年月的最后一天,获取当前年月有多少天
    mui Picker DtPicker 固定内容以及变动内容Picker 不同情况下的应用 提高效率
    java封装返回结果应用 利用反射机制 返回结果以及错误信息
    java 封装返回结果实体类 返回结果以及错误信息
  • 原文地址:https://www.cnblogs.com/Rising/p/1762807.html
Copyright © 2020-2023  润新知