• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
flashelf
博客园    首页    新随笔    联系   管理    订阅  订阅

Enterprise Library 2006,Data Access Application Block 精简增强版

文章的名字有点问题啊呵呵 先说明一下 精简:为了便于学习先去掉了对其他 Application Block 的引用,就剩下基本 SQL 操作的功能 增强: 加入了 Oracle 多游标的支持 外挂一个函数转换 sql 语句中 : 或 @ 参数标号 Oracle 会把sql中的 @ 变为 : ,SqlService 会把 :变成 @ 集成若干效验函数都是泛行的,主要用途 把数据库取得的数据转换为某种类型 免得整天在,控件 to DB ,DB 到 控件 之间浪费时间
文章的名字有点问题啊呵呵
先说明一下
精简:为了便于学习先去掉了对其他 Application Block 的引用,就剩下基本 SQL 操作的功能
增强:
  1. 加入了 Oracle 多游标的支持
  2. 外挂一个函数转换 sql  语句中 :  或 @ 参数标号 Oracle 会把sql中的 @ 变为 : ,SqlService 会把 :变成 @
  3. 集成若干效验函数都是泛行的,主要用途 把数据库取得的数据转换为某种类型
    免得整天在,控件 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) 效验类

try
            {
                
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();
                }
                
            }

二、效验类二

try
            {
                
                
//如果 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 中的 @ 都替换为 :

const string sql = @"SELECT OBJ_VALUE FROM XRSS_TEST WHERE APP_KEY = @APP_KEY AND VALUE_KEY = @VALUE_KEY";

            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);
                        }
                    }
                }
            }

联合应用

const string sql = @"INSERT INTO XRSS_TEST VALUES ( :APP_KEY , :VALUE_KEY, :OBJ_VALUE )";
            
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);
            }



下载

posted @ 2007-04-01 23:12  曲滨*銘龘鶽  阅读(4576)  评论(12)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3