1. 通过sql语句查询数据库
2. 通过存储过程查询数据库
3. 使用异步方式读取数据
1. 通过sql语句查询数据库
1.1 添加引用,如下:
1.2 添加配置文件App.config,使用Entlib配置工具形成如下配置:
生成配置文件如下:
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<configSections>
<section name="dataConfiguration" type="Microsoft.Practices.EnterpriseLibrary.Data.Configuration.DatabaseSettings, Microsoft.Practices.EnterpriseLibrary.Data, Version=5.0.414.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" requirePermission="true" />
</configSections>
<dataConfiguration defaultDatabase="QuickStarts Instance" />
<connectionStrings>
<add name="QuickStarts Instance" connectionString="Data Source=xuqiang-pc;Initial Catalog=EntLibQuickStarts;Integrated Security=True"
providerName="System.Data.SqlClient" />
</connectionStrings>
</configuration>
1.3 开始编写代码,引入命名空间:
using Microsoft.Practices.EnterpriseLibrary.Data;
using Microsoft.Practices.EnterpriseLibrary.Common.Configuration;
如果想要得到单个值,例如查询符合某个条件的数据库实体的数量,可以这样使用:
// 得到Database对象,data access中主要是在该对象上进行操作
Database db = EnterpriseLibraryContainer.Current.GetInstance<Database>("QuickStarts Instance");
String sql = "select count(*) from Customers";
// 带有返回值,需要强制转换成int
int count = (int)db.ExecuteScalar(CommandType.Text, sql);
如果想要返回一个DataSet类型的话,可以调用 Database的 ExecuteDataSet方法,如下:
Database db = EnterpriseLibraryContainer.Current.GetInstance<Database>();
String sql = "select * from Customers";
// 根据sql返回数据库中的多行,这里暂时是没有参数的
DataSet ds = db.ExecuteDataSet(CommandType.Text, sql);
1.4 代码下载
/Files/xuqiang/entlib/DataAccessBlockTestSqlString.rar
2. 通过存储过程查询数据库
2.1 通过存储过程读取数据
得到 Database:
private Database m_db = EnterpriseLibraryContainer.Current.
GetInstance<Database>("QuickStarts Instance");
读取数据:
// ExecuteReader参数是存储过程的名字
using (IDataReader dataReader = this.m_db.ExecuteReader("GetCategories"))
{
// 处理reader得到的数据
while (dataReader.Read())
{
Category item = new Category
(
dataReader.GetInt32(0),
dataReader.GetString(1),
dataReader.GetString(2)
);
this.cmbCategory.Items.Add(item);
}
}
如果想要直接将结果存储在DataSet中,可以调用LoadDataSet方法:
// 加载ds,但是这里传递了参数
// GetProductsByCategory:调用的存储过程名字
// dsProducts:调用完成之后,将结果填充到该参数中
// new String[] { "Products" }:ds中填充的表名
// CategoryId:传递给该存储过程的参数
this.m_db.LoadDataSet("GetProductsByCategory", this.dsProducts,
new String[] { "Products" },
selectedCategory.CategoryId);
2.2 通过存储过程删除,修改,更新数据库中数据
System.Data.Common.DbCommand insertCommand = null;
insertCommand = this.m_db.GetStoredProcCommand("HOLAddProduct");
this.m_db.AddInParameter(insertCommand, "ProductName", DbType.String, "ProductName", DataRowVersion.Current);
this.m_db.AddInParameter(insertCommand, "CategoryID", DbType.Int32, "CategoryID", DataRowVersion.Current);
this.m_db.AddInParameter(insertCommand, "UnitPrice", DbType.Currency, "UnitPrice", DataRowVersion.Current);
.......
// 如果仅仅是执行其中的一个操作(插入,删除,修改之一),只需要
// 将其他参数设置成null即可。
// 通过查看重载版本可以发现该方法是能够支持事务,使用的话就是在
// 该下面的参数中添加一个DbTransaction
int rowsAffected = this.m_db.UpdateDataSet(this.dsProducts, "Products", insertCommand, updateCommand, deleteCommand, UpdateBehavior.Standard);
2.3 代码下载
/Files/xuqiang/entlib/DataAccssBlockStoreProcdure.rar
3. 异步方式读取数据
最终效果图:
关键代码:
// 开始异步读取,注册回调事件
db.BeginExecuteReader(CommandType.Text,
sql,
EndExecuteReaderCallback,
db);
如果数据读取完成:
private void EndExecuteReaderCallback(IAsyncResult result)
{
try
{
// 数据查询完成之后,调用下面的代码
var database = (Database)result.AsyncState;
var ds = new DataSet();
using (var reader = database.EndExecuteReader(result))
{
ds.Load(reader, LoadOption.PreserveChanges, "data");
}
Invoke(new Action<DataSet>(FillGrid), ds);
}
catch (Exception exp)
{
MessageBox.Show(exp.Message);
}
}
需要注意的是由于需要使用异步的连接,所以应在连接字符串中应包含Asynchronous Processing=true。代码下载:
/Files/xuqiang/entlib/AsynchronousDataAccess.rar