Enterprise Library 2006,Data Access Application Block 精简增强版
先说明一下
精简:为了便于学习先去掉了对其他 Application Block 的引用,就剩下基本 SQL 操作的功能
增强:
- 加入了 Oracle 多游标的支持
- 外挂一个函数转换 sql 语句中 : 或 @ 参数标号 Oracle 会把sql中的 @ 变为 : ,SqlService 会把 :变成 @
- 集成若干效验函数都是泛行的,主要用途 把数据库取得的数据转换为某种类型
免得整天在,控件 to DB ,DB 到 控件 之间浪费时间
===说明(1.2007.4.1).txt==
本工程源于 Microsoft Enterprise Library January 2006 中的
Microsoft.Practices.EnterpriseLibrary.Data
由曲滨于 2007-4 修改并精简,并加入一些新功能
去除了原有 Microsoft.Practices.EnterpriseLibrary.Data 对其他 Microsoft Enterprise Library January 的引用
并且只保留正常对于数据库的操作功能
数据库的操作使用方式和原来的 Microsoft.Practices.EnterpriseLibrary.Data 是一样的,
其他功能和引用已经被精简
修改的目的只是为了减少代码,便于学习 现在的版本只适合那些 就是需要 Microsoft.Practices.EnterpriseLibrary.Data 功能而不需要其他
Microsoft Enterprise Library 的项目
如需要原始版本请到 微软下载,如果还需要本版本内的功能可以直接 copy 代码到原版即可
注:
Microsoft.Practices.EnterpriseLibrary.Data 是为了兼容各种数据库,而且前题是你对 sqlservice,Oracle 的区别很是了解的情况下使用
否则请尽量不要直接用 SQL 语句在代码里,因为 SQL Service 和 Oracle 在很多机制上是不同的
1) 数据类上的不同
2) 关键字的不同
3) 有些使用方式的不同
如:a:自动序列号 oracle 是没有的,也就是说 oracle 插入要多插入一列,如果直接用 sql 语句来写程序
oracle ,需要一个 SEQUENCE 来生成,且 直接在 insert 后面跟一个 out 型的返回参数即可取得主键
insert into table(col01 ,col02 ) values( seq.nextvalue ,:col02) returning col01 into :col01
sql service
insert into table(col02 ) values(:col02);
select SCOPE_IDENTITY();
在sql 语句模样上就不一样,如果直接把 sql 写在代码里一定是不行的
必须郑重说明:
因为我看见很多人用 Microsoft.Practices.EnterpriseLibrary.Data 直接把sql 写在代码中
如果您对各种数据库的 sql 不是很了解,还是最好将全部数据库操作封装到 存储过程,数据库函数中
否则本人不建议用 Microsoft.Practices.EnterpriseLibrary.Data,
如果想将sql 写在代码里还是建议使用 .NET Pet Shop 那种简单工厂模式
今天把代码放出,日后有时间再讲。
1) 效验类
{
object o = null;
o = Database.CheckString<int>(textBox1, textBox1.Text.Trim(), "编号1", true, new CheckMin<int>(100));
o = Database.CheckString<int>(textBox2, textBox2.Text.Trim(), "编号2", false, new CheckRegex<int>("^[1-9][0-9]{3}[1-9][0-9]{3}$", "必须符合:8位长度且第1位和第4为不可为零"));
o = Database.CheckString<decimal>(textBox3, textBox3.Text.Trim(), "编号3", false, new CheckBetween<decimal>(700M, 999.99M));
o = Database.CheckString<decimal>(textBox4, textBox4.Text.Trim(), "编号4", false, new CheckIn<decimal>(9, 6, 4, 2));
o = Database.CheckString<decimal>(textBox5, textBox5.Text.Trim(), "编号5", false, new CheckMax<decimal>(6));
int i = Database.CheckString<int>(textBox11, textBox11.Text.Trim(), "编号6", new CheckMin<int>(-10));
MessageBox.Show("效验成功:");
}
catch (StringCheckException ex)
{
MessageBox.Show(ex.Message);
Control ctl = ex.ChkObject as Control;
if(ctl!=null)
{
ctl.Focus();
}
}
二、效验类二
{
//如果 textBox1.Text.Trim() 为空串会被处理为 0,否则进行 Check,没有附加对象
int i = Database.CheckStringNVL<int>(0, textBox9.Text.Trim(), "编号9", new CheckMin<int>(-10));
MessageBox.Show("成功:i=" + i);
}
catch (StringCheckException ex)
{
MessageBox.Show(ex.Message);
}
三,sql 替换,如果链接了 Oracle 数据库,sql 中的 @ 都替换为 :
Database dbbase = DatabaseFactory.CreateDatabase(comboBox1.Text);
using (DbConnection conn = dbbase.CreateConnection())
{
//对原有 sqlService 的代参数的sql 进行处理
string execSql = dbbase.ConversionSQL(sql, SQLTextType.SQLService);
using (DbCommand cmd = dbbase.GetSqlStringCommand(execSql))
{
dbbase.AddInParameter(cmd, "APP_KEY", DbType.String, "xmp.app");
dbbase.AddInParameter(cmd, "VALUE_KEY", DbType.String, textBox12.Text.Trim() );
OutCmd(cmd);
using (IDataReader reader = dbbase.ExecuteReader(cmd))
{
while (reader.Read())
{
//如果为DBNull 返回,new byte[0]
byte[] bytes = Database.NVL<byte[]>(reader[0], new byte[0]);
Console.WriteLine(bytes.Length);
}
}
}
}
联合应用
string vlaue_key = null;
byte[] bytes = {0,1,2,3,4,5,6,7,8,9};
try
{
vlaue_key = Database.CheckString<string>(textBox12
, textBox12.Text.Trim()
, "key01"
, new CheckRegex<string>("key[0-9]{5}","请输入 key开头+任何五个数组")
);
Database dbbase = DatabaseFactory.CreateDatabase(comboBox1.Text);
using (DbConnection conn = dbbase.CreateConnection())
{
//对原有 Oracle 的代参数的 sql 进行处理
string execSql = dbbase.ConversionSQL(sql, SQLTextType.Oracle);
Console.WriteLine(dbbase.DbProviderFactory.ToString());
using (DbCommand cmd = dbbase.GetSqlStringCommand(execSql))
{
dbbase.AddInParameter(cmd, "APP_KEY", DbType.String, "xmp.app");
dbbase.AddInParameter(cmd, "VALUE_KEY", DbType.String, vlaue_key );
dbbase.AddInParameter(cmd, "OBJ_VALUE", DbType.Binary, bytes);
OutCmd(cmd);
int reader = dbbase.ExecuteNonQuery(cmd);
}
}
}
catch (StringCheckException ex)
{
MessageBox.Show(ex.Message);
Control ctl = ex.ChkObject as Control;
if (ctl != null)
{
ctl.Focus();
}
}
catch(Exception ex)
{
MessageBox.Show(ex.Message);
}