数据访问层的第二个类(针对sqlserver)

原创 2004年06月23日 11:21:00

/// <summary>
 /// 提供对数据库的操作服务:SQL语句的执行,存储过程的调用
 /// </summary>
 public abstract class SQLHelper
 {
  private static void AttachParameters(SqlCommand command, SqlParameter[] commandParameters)
  {
   foreach (SqlParameter p in commandParameters)
   {
    if ((p.Direction == ParameterDirection.InputOutput) && (p.Value == null))
    {
     p.Value = DBNull.Value;
    }
    
    command.Parameters.Add(p);
   }
  }

  
  private static void AssignParameterValues(SqlParameter[] commandParameters, object[] parameterValues)
  {
   if ((commandParameters == null) || (parameterValues == null))
   {
    return;
   }

   if (commandParameters.Length != parameterValues.Length)
   {
    throw new ArgumentException("Parameter count does not match Parameter Value count.");
   }

   for (int i = 0, j = commandParameters.Length; i < j; i++)
   {
    commandParameters[i].Value = parameterValues[i];
   }
  }

  private static SQLServer PrepareCommand(SqlCommand cmd,CommandType cmdType, string cmdText, SqlParameter[] intCmdParms,SqlParameter[] outCmdParms)
  {
   SQLServer sqlServer = SQLServer.Instance();
   cmd.Connection = sqlServer.Connection;
   cmd.CommandText = cmdText;
   cmd.CommandType = cmdType;

   if (intCmdParms != null)
   {
    foreach (SqlParameter parm in intCmdParms)
     cmd.Parameters.Add(parm);
   }
   if(outCmdParms != null)
   {
    foreach (SqlParameter parm in outCmdParms)
     cmd.Parameters.Add(parm);
   }
   return sqlServer;
  }

  private static Hashtable parmCache = Hashtable.Synchronized(new Hashtable());
  /// <summary>
  /// 参数数组存入缓存
  /// </summary>
  /// <param name="cacheKey">键</param>
  /// <param name="cmdParms">值:参数数组</param>
  public static void CacheParameters(string cacheKey, params SqlParameter[] cmdParms)
  {
   parmCache[cacheKey] = cmdParms;
  }

  /// <summary>
  /// 取出参数数组
  /// </summary>
  /// <param name="cacheKey">键</param>
  /// <returns>参数数组</returns>
  public static SqlParameter[] GetCachedParameters(string cacheKey)
  {
   SqlParameter[] cachedParms = (SqlParameter[])parmCache[cacheKey];
   
   if (cachedParms == null)
    return null;
   
   SqlParameter[] clonedParms = new SqlParameter[cachedParms.Length];

   for (int i = 0, j = cachedParms.Length; i < j; i++)
    clonedParms[i] = (SqlParameter)((ICloneable)cachedParms[i]).Clone();

   return clonedParms;
  }

  /// <summary>
  /// 对连接执行 Transact-SQL 语句并返回受影响的行数。
  /// </summary>
  /// <param name="cmdType">指定如何解释命令字符串</param>
  /// <param name="cmdText">T-SQL 命令行 或 存储过程名</param>
  /// <param name="cmdParms">参数数组</param>
  /// <returns>受影响的行数</returns>
  public static int ExecuteNonQuery(CommandType cmdType, string cmdText, params SqlParameter[] cmdParms)
  {
   SqlCommand cmd = new SqlCommand();
   SQLServer sqlServer = PrepareCommand(cmd, cmdType, cmdText, cmdParms,null);
   try
   {
    sqlServer.Connection.Open();
    sqlServer.BeginTransaction();
    int val = cmd.ExecuteNonQuery();    
    sqlServer.CommitTransaction();
    cmd.Parameters.Clear();
    return val;
   }
   catch
   {
    sqlServer.RollbackTransaction();
    throw;
   }
   finally
   {
    sqlServer.Connection.Close();
   }
   
  }

  /// <summary>
  /// 生成DataReader
  /// </summary>
  /// <param name="cmdType">指定如何解释命令字符串</param>
  /// <param name="cmdText">T-SQL 命令行 或 存储过程名</param>
  /// <param name="cmdParms">参数数组</param>
  /// <returns>受影响的行数</returns>
  public static SqlDataReader ExecuteReader(CommandType cmdType, string cmdText, params SqlParameter[] cmdParms)
  {
   SqlCommand cmd = new SqlCommand();
   SQLServer sqlServer = PrepareCommand(cmd, cmdType, cmdText, cmdParms,null);

   try
   {
    SqlDataReader dr = cmd.ExecuteReader(CommandBehavior.CloseConnection);
    cmd.Parameters.Clear();
    return dr;
   }
   catch
   {
    sqlServer.Connection.Close();
    throw;
   }
  }

  /// <summary>
  /// 执行查询,并返回查询所返回的结果集中第一行的第一列。忽略额外的列或行。
  /// </summary>
  /// <param name="cmdType">指定如何解释命令字符串</param>
  /// <param name="cmdText">T-SQL 命令行 或 存储过程名</param>
  /// <param name="cmdParms">参数数组</param>
  /// <returns>结果集中第一行的第一列</returns>
  public static object ExecuteScalar(CommandType cmdType, string cmdText, params SqlParameter[] cmdParms)
  {
   SqlCommand cmd = new SqlCommand();
   SQLServer sqlServer = PrepareCommand(cmd, cmdType, cmdText, cmdParms,null);
   try
   {
    sqlServer.Connection.Open();
    sqlServer.BeginTransaction();
    object val = cmd.ExecuteScalar();    
    sqlServer.CommitTransaction();
    cmd.Parameters.Clear();
    return val;
   }
   catch
   {
    sqlServer.RollbackTransaction();
    throw;
   }
   finally
   {
    sqlServer.Connection.Close();
   }
  }

  /// <summary>
  /// 执行存储过程,带输出参数
  /// </summary>
  /// <param name="StoredProcedure">存储过程名</param>
  /// <param name="outValue">输出值引用</param>
  /// <param name="outCmdParms">输出参数数组</param>
  /// <param name="cmdParms">输入参数数组</param>
  public static void ExecuteStoredProcedure(string StoredProcedure,ref object[] outValue,SqlParameter[] outCmdParms, params SqlParameter[] cmdParms)
  {
   SqlCommand cmd = new SqlCommand();
   SQLServer sqlServer = PrepareCommand(cmd, CommandType.StoredProcedure, StoredProcedure, cmdParms,outCmdParms);
   try
   {
    sqlServer.Connection.Open();
    sqlServer.BeginTransaction();
    cmd.ExecuteNonQuery();   
    sqlServer.CommitTransaction();
    if(outCmdParms != null)
     for(int i=0;i<outCmdParms.Length;i++)
      outValue[i] = outCmdParms[i].Value;
    cmd.Parameters.Clear();
   }
   catch
   {
    sqlServer.RollbackTransaction();
    throw;
   }
   finally
   {
    sqlServer.Connection.Close();
   }
  }

  /// <summary>
  /// 执行存储过程,返回结果集
  /// </summary>
  /// <param name="StoredProcedure">存储过程名</param>
  /// <param name="cmdParms">参数数组</param>
  /// <returns>结果集</returns>
  public static DataTable ExecuteStoredProcedure(string StoredProcedure,params SqlParameter[] cmdParms)
  {
   SqlDataAdapter sda = new SqlDataAdapter();
   SqlCommand cmd = new SqlCommand();
   SQLServer sqlServer = PrepareCommand(cmd, CommandType.StoredProcedure, StoredProcedure, cmdParms,null);
   DataTable dt = new DataTable();
   sda.SelectCommand = cmd;
   try
   {
    sqlServer.Connection.Open();
    sqlServer.BeginTransaction();
    sda.Fill(dt);
    sqlServer.CommitTransaction();
    cmd.Parameters.Clear();
    return dt;
   }
   catch
   {
    sqlServer.RollbackTransaction();
    throw;
   }
   finally
   {
    sqlServer.Connection.Close();
   }
  }

设计模式学习之抽象工厂模式(实现数据访问层)

1 什么是抽象工厂模式 抽象工厂模式(Abstract Factory):提供一个创建一系列相关或相互依赖对象的接口,而无需制定他们的具体类。结构图如下:   分析一下抽象工厂模式,1提供一系列...
  • wziyx513225244
  • wziyx513225244
  • 2011年08月03日 09:56
  • 3129

.net中的数据访问层的封装

当年.net项目中自己封装的数据访问层,个人感觉使用非常方便
  • kevin_xf
  • kevin_xf
  • 2016年12月05日 15:53
  • 809

数据访问层的第一个类(针对sqlserver)

数据访问的服务类 只在数据访问组建内可用 internal class SQLServer {  private SqlConnection connection;  private static S...
  • xinyulou
  • xinyulou
  • 2004年06月23日 11:07
  • 1104

数据访问层异常处理

业务逻辑层、数据访问层通过接口进行隔离,通过实现接口进行访问。为了方便统一处理异常,可以建立单独的异常来接收、处理异常。如果在定义接口的同时就抛出异常,那么耦合度将增加。 下面来看一个示例:由Doma...
  • a600423444
  • a600423444
  • 2011年06月06日 23:57
  • 1703

数据访问层实现的一些个人想法

个人感觉数据访问层应该实现以下几个主要目的:1) 分离业务层与数据层2)屏蔽具体数据库的差异(如SQLServer、Oracle、OLEDB、ODBC等)3)简化数据访问层的代码,经常写一些 Para...
  • JOHNCOOLS
  • JOHNCOOLS
  • 2006年09月15日 17:18
  • 1383

Asp.net中打造通用数据访问类(c#)

Asp.net中打造通用数据访问类(c#)     刚刚写的,可能里面会有漏洞,望指正.     ASP。NET开发中, 业务实体需要通过数据访问层与数据库交互,因此,你必须为每个业务实体类编写相对应...
  • tielu0144
  • tielu0144
  • 2007年01月23日 21:24
  • 634

EmployeesTableAdapter dataset当实体层 和 数据访问层

   //EmployeesTableAdapter的怎么 来的?private EmployeesTableAdapter _employeesAdapter = null;    protecte...
  • luckxiaonan
  • luckxiaonan
  • 2007年04月03日 17:38
  • 351

Asp.net mvc 数据访问层

理解了一些概念,本节开始尝试创建属于自己的数据访问层,说道数据访问层那必须有数据库咯(数据集合也算,此处以数据库为例),没有数据库就没有数据访问层。 1、先创建属于自己的数据库       打开已...
  • u013108485
  • u013108485
  • 2016年04月14日 16:19
  • 4929

Spring的注解类(@Component、@Repository、@Service、@Controller )

1、@controller 控制器(注入服务) 2、@service 服务(注入dao) 3、@repository dao(实现dao访问) 4、@component (把普通pojo实例化到...
  • liu251890347
  • liu251890347
  • 2014年06月27日 08:47
  • 833

数据访问层的设计和实现(分布式系统七)

(1)如何对外提供数据访问层的功能 数据访问层就是方便应用进行数据读写访问的抽象层,在该层上解决各个应用通用的访问数据库的问题。 上图显示了三种方式,第一种是为用户提供专有API,不过不推...
  • u011393781
  • u011393781
  • 2016年10月08日 17:41
  • 1578
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:数据访问层的第二个类(针对sqlserver)
举报原因:
原因补充:

(最多只允许输入30个字)