Wintle·旧居

个人blog移至:http://www.wintle.cn,欢迎光临。
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

个性化Microsoft Data Access V2.0以适用于应用系统开发

Posted on 2004-08-09 21:52  Wintle  阅读(4012)  评论(11编辑  收藏  举报

      微软提供的Microsoft Application Blocks for .NET 中的Data Access V2.0 相比之前的V1.0有了很大的性能提升,基于它可以开发高性能和伸缩性的.Net数据库应用系统。但Data Access V2.0毕竟是一个通用性的代码,要适应实际应用系统的开发,还需要进行一定的个性化。

     我们在做应用系统时,采用了(DataAccess + DAL + Model + BLL + PRES)的结构,与Sql Server打交道的方式一致采用DataAccess执行数据库存储过程来实现。

     那么,个性化的需求即可以大致定义为:

  • 统一暴露执行各种存储过程的静态方法。
  • 连接字符串内部化,不在调用过程中定置。(这一点很重要,每次调用都设定的弊端不言而明)。
  • 连接字符串应该是加密的。因此在读取的时候,要解密。
  • 能高效利用Data Access V2.0提供的参数缓存支持。

     在这些原则下,我们改进出如下的Data Access , 希望高手不吝指正!


 

// ===============================================================================
// 来源于 Microsoft Data Access Application Block for .NET 2.0
// 修改者 Wintle
// 修改时间 2004年4月20日
// 修订:
// Wintle,040805
// 将AssignParameterValues()public化,对外提供public static bool GetCachedParameterSet(string connectionString,string spName,out SqlParameter[] parms)方法
// 使CodePlus生成的代码可以直接智能缓存。
// 内部版本: 1.1
// ===============================================================================

using System;
using System.Data;
using System.Configuration;
using System.Xml;
using System.Data.SqlClient;
using System.Collections;

namespace DataAccess
{
    
/// <summary>
    
/// 数据访问层,提供处理Sql Server 2000数据库的各种方法
    
/// </summary>

    public sealed class Database
    
{
        
private utility methods & constructors private utility methods & constructors

        
ExecuteNonQuery ExecuteNonQuery


        
public static DataSet ExecuteDataset(string connectionString, CommandType commandType, string commandText)
         
         这里省略了,因为和ExecuteNonQuery结构都一样了。
         
         进入正题:
         
        
RunProc

        
Make SqlParameters

    }

 
    
/// <summary>
    
/// 用来存取缓存SqlParameter[]
    
/// </summary>

    public sealed class ParamsCache
    
{
        
private methods, variables, and constructors caching functions
      下面是取回存储过程参数的代码了,略去。
}

// ===============================================================================
// 来源于 Microsoft Data Access Application Block for .NET 2.0
// 修改者 Wintle
// 修改时间 2004年4月20日
// 修订:
// Wintle,040805
// 将AssignParameterValues()public化,对外提供public static bool GetCachedParameterSet(string connectionString,string spName,out SqlParameter[] parms)方法
// 使CodePlus生成的代码可以直接智能缓存。
// 内部版本: 1.1
// ===============================================================================

using System;
using System.Data;
using System.Configuration;
using System.Xml;
using System.Data.SqlClient;
using System.Collections;

namespace DataAccess
{
    
/// <summary>
    
/// 数据访问层,提供处理Sql Server 2000数据库的各种方法
    
/// </summary>

    public sealed class Database
    
{
        
private utility methods & constructors private utility methods & constructors

        
ExecuteNonQuery ExecuteNonQuery


        
public static DataSet ExecuteDataset(string connectionString, CommandType commandType, string commandText)
         
         这里省略了,因为和ExecuteNonQuery结构都一样了。
         
         进入正题:
         
        
RunProc

        
Make SqlParameters

    }

 
    
/// <summary>
    
/// 用来存取缓存SqlParameter[]
    
/// </summary>

    public sealed class ParamsCache
    
{
        
private methods, variables, and constructors caching functions
      下面是取回存储过程参数的代码了,略去。
}


代码完。

 

调用DataAccess可如下代码:

        public bool Create(String name,String shortName,Int32 universityId,String code)
        
{
            SqlParameter[] prams 
= {
                                       Database.MakeInParam(
"@Name",System.Data.SqlDbType.VarChar,60,name),
                                       Database.MakeInParam(
"@ShortName",System.Data.SqlDbType.VarChar,30,shortName),
                                       Database.MakeInParam(
"@UniversityId",System.Data.SqlDbType.Int,4,universityId),
                                       Database.MakeInParam(
"@Code",System.Data.SqlDbType.VarChar,30,code)
                                   }
;
            
int reval = Database.RunProc("BSCollege_Create",prams);
            
if(reval != -1)
            
{
                
return true;
            }

            
else
            
{
                
return false;
            }

        }

 
如果需要缓存支持,则采用如下调用方法:
        
public void SelectSubNodes(int universityId,int codeLength,String code,out OfficiateCollection list)
        
{
            SqlDataReader reader 
= null;
            list 
= new OfficiateCollection();
            SqlParameter[] prams;
            
if(ParamsCache.GetCachedParameterSet(Database.ConnectionString,"BSOfficiate_SelectSubNodes",out prams))
            
{
                Database.AssignParameterValues(prams,universityId,codeLength,code);
            }

            
else
            
{
                prams 
= new SqlParameter[3]{
                                               Database.MakeInParam(
"@UniversityId",System.Data.SqlDbType.Int,4,universityId),
                                               Database.MakeInParam(
"@CodeLength",System.Data.SqlDbType.Int,4,codeLength),
                                               Database.MakeInParam(
"@Code",System.Data.SqlDbType.VarChar,300,code)
                                           }
;
                ParamsCache.CacheParameterSet(Database.ConnectionString,
"BSOfficiate_SelectSubNodes",prams);
            }

            Database.RunProc(
"BSOfficiate_SelectSubNodes",prams,out reader);
            
while(reader.Read())
            
{
                OfficiateInfo officiateInfo 
= new OfficiateInfo();
                officiateInfo.ID 
= Int32.Parse(reader["ID"].ToString());
                officiateInfo.Name 
= reader["Name"].ToString();
                officiateInfo.Code 
= reader["Code"].ToString();
                officiateInfo.Ordinal 
= Int32.Parse(reader["Ordinal"].ToString());
                list.Add(officiateInfo);
            }

            reader.Close();
        }

 


     基于这个Data Access ,我们的新版 CodePlus  代码生成器 即可自动生成以上的调用代码。详情请见:

http://blog.csdn.net/wintle/archive/2004/08/09/68851.aspx

     对于这个DataAccess,各位如果有什么好的建议,请告诉我,谢谢。

     基于这个Data Access ,我们的新版 CodePlus  代码生成器 即可自动生成以上的调用代码。详情请见:

http://blog.csdn.net/wintle/archive/2004/08/09/68851.aspx

     对于这个DataAccess,各位如果有什么好的建议,请告诉我,谢谢。

        public bool Create(String name,String shortName,Int32 universityId,String code)
        
{
            SqlParameter[] prams 
= {
                                       Database.MakeInParam(
"@Name",System.Data.SqlDbType.VarChar,60,name),
                                       Database.MakeInParam(
"@ShortName",System.Data.SqlDbType.VarChar,30,shortName),
                                       Database.MakeInParam(
"@UniversityId",System.Data.SqlDbType.Int,4,universityId),
                                       Database.MakeInParam(
"@Code",System.Data.SqlDbType.VarChar,30,code)
                                   }
;
            
int reval = Database.RunProc("BSCollege_Create",prams);
            
if(reval != -1)
            
{
                
return true;
            }

            
else
            
{
                
return false;
            }

        }

 
如果需要缓存支持,则采用如下调用方法:
        
public void SelectSubNodes(int universityId,int codeLength,String code,out OfficiateCollection list)
        
{
            SqlDataReader reader 
= null;
            list 
= new OfficiateCollection();
            SqlParameter[] prams;
            
if(ParamsCache.GetCachedParameterSet(Database.ConnectionString,"BSOfficiate_SelectSubNodes",out prams))
            
{
                Database.AssignParameterValues(prams,universityId,codeLength,code);
            }

            
else
            
{
                prams 
= new SqlParameter[3]{
                                               Database.MakeInParam(
"@UniversityId",System.Data.SqlDbType.Int,4,universityId),
                                               Database.MakeInParam(
"@CodeLength",System.Data.SqlDbType.Int,4,codeLength),
                                               Database.MakeInParam(
"@Code",System.Data.SqlDbType.VarChar,300,code)
                                           }
;
                ParamsCache.CacheParameterSet(Database.ConnectionString,
"BSOfficiate_SelectSubNodes",prams);
            }

            Database.RunProc(
"BSOfficiate_SelectSubNodes",prams,out reader);
            
while(reader.Read())
            
{
                OfficiateInfo officiateInfo 
= new OfficiateInfo();
                officiateInfo.ID 
= Int32.Parse(reader["ID"].ToString());
                officiateInfo.Name 
= reader["Name"].ToString();
                officiateInfo.Code 
= reader["Code"].ToString();
                officiateInfo.Ordinal 
= Int32.Parse(reader["Ordinal"].ToString());
                list.Add(officiateInfo);
            }

            reader.Close();
        }

 


     基于这个Data Access ,我们的新版 CodePlus  代码生成器 即可自动生成以上的调用代码。详情请见:

http://blog.csdn.net/wintle/archive/2004/08/09/68851.aspx

     对于这个DataAccess,各位如果有什么好的建议,请告诉我,谢谢。

     基于这个Data Access ,我们的新版 CodePlus  代码生成器 即可自动生成以上的调用代码。详情请见:

http://blog.csdn.net/wintle/archive/2004/08/09/68851.aspx

     对于这个DataAccess,各位如果有什么好的建议,请告诉我,谢谢。