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

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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: SQL Server第四章-数据的查询(二)主要介绍了SQL Server中数据查询的高级技巧,包括使用多个表进行联合查询、使用子查询进行嵌套查询、使用聚合函数进行数据汇总和分组查询、使用窗口函数进行数据分析和排序等。这些技巧可以帮助用户更加灵活地查询和分析数据,提高数据处理的效率和精度。同时,本章还介绍了一些常用的查询优化技巧,如创建索引、使用视图和存储过程等,以提高查询的性能和可维护性。总之,本章内容丰富,涵盖了SQL Server中数据查询的各个方面,是SQL Server学习和应用的重要一章。 ### 回答2: 本章主要介绍了 SQL Server 中数据的查询操作,包括查询语句的基本框架、关键字、通配符、函数、排序和分组等。其中,查询语句的基本框架包括 SELECT、FROM、WHERE、GROUP BY、HAVING 和 ORDER BY 这几个关键字,每个关键字所代表的含义和在语句中的使用方法都得到了详细讲解。 在查询语句中,WHERE 关键字用于过滤数据,可以使用各种比较运算符和逻辑运算符实现复杂的查询条件。通配符也是查询语句的重要组成部分,可以使用百分号(%)和下划线(_)代表任意字符或一定范围内的字符。同时,SQL Server 中也提供了丰富的函数,如字符串函数、数学函数、日期函数、聚合函数等,可以用于查询结果的处理和整理。 查询数据时,排序和分组是非常实用的功能。ORDER BY 关键字可以按照指定的列或表达式对结果集中的数据进行排序,而 GROUP BY 关键字则可将结果按照指定的列或表达式进行分组,并计算每个组的聚合值。 代码示例也随之出现,并详细讲解了其运行过程和结果。整个章节贯穿 SQL Server 中数据的查询、过滤、排序、分组等基本操作,为读者提供了较为系统化的 SQL Server 基础知识,值得初学者和进阶者一试。 ### 回答3: 在SQL Server的第四章节中,我们学习了如何对数据进行查询。在本节的第二部分,我们将深入探讨SQL Server的查询功能,并介绍一些高级查询技巧。 首先,我们将介绍SQL Server的内置函数。内置函数分为三:数值函数、字符函数和日期/时间函数。数值函数用于执行数学运算,包括SUM、AVG、MIN和MAX等。字符函数用于在字符数据上执行操作,例如LEN(计算字符串长度)、UPPER(将字符串转换为大写)和LOWER(将字符串转换为小写)。日期/时间函数用于在日期和时间上执行操作,例如GETDATE(返回当前日期和时间)和DATEPART(返回日期或时间部分的值)。 接下来,我们将介绍如何使用子查询。子查询是一种查询语句,它嵌套在另一个查询语句中。子查询用于从另一个查询中检索数据,并返回一个结果集。子查询可以用于任何SQL语句,包括SELECT、INSERT、UPDATE和DELETE。在使用子查询时,我们需要确保其返回的结果集不为空。 在SQL Server中,我们还可以使用JOIN操作。JOIN操作用于将两个或多个表连接起来,从而创建新的结果集。JOIN操作分为INNER JOIN、LEFT JOIN、RIGHT JOIN和FULL OUTER JOIN四种型。INNER JOIN返回与两个表关联的行,LEFT JOIN返回与左表关联的行,RIGHT JOIN返回与右表关联的行,FULL OUTER JOIN返回两个表中所有的行。 最后,我们将介绍如何使用GROUP BY和HAVING进行分组和过滤。GROUP BY用于按照一个或多个列对结果集进行分组,HAVING用于在分组结果集上进行过滤。通过使用GROUP BY和HAVING,我们可以创建汇总报表,例如按照地区、产品型和销售额对销售数据进行分组和过滤的报表。 综上所述,SQL Server的查询功能非常强大。通过使用内置函数、子查询、JOIN、GROUP BY和HAVING等高级技巧,我们可以对大量数据进行高效的查询和分析。因此,我们需要不断学习和实践,以便提高我们的查询技能并更好地应对复杂的数据分析需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值