数据访问层的第二个类(针对sqlserver)
来源:互联网 发布:惠州市房地产数据统计 编辑:程序博客网 时间:2024/06/11 21:07
/// <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();
}
}
- 数据访问层的第二个类(针对sqlserver)
- 数据访问层的第一个类(针对sqlserver)
- 基于.NET平台的分层架构实战(八)—数据访问层的第二种实现:SQLServer+存储过程
- 通用数据访问层--SQLServer版
- 通用数据访问层--SQLServer版
- 【转】通用数据访问层--SQLServer版
- 基于.NET平台的分层架构实战(八)——数据访问层的第二种实现:SQLServer+存储过程
- 基于.NET平台的分层架构实战(八)——数据访问层的第二种实现:SQLServer+存储过程
- 基于.NET平台的分层架构实战(八)——数据访问层的第二种实现:SQLServer+存储过程
- 针对第二层到第四层的攻击
- .Net平台下针对数据访问层的一种单元测试方法
- 基于SQLServer的数据访问基础类
- SQLServer数据层通用类
- 访问SQLServer的通用DAL层
- 数据访问层的帮助类
- 使用微软企业库构建简单的数据访问层,供新人参考(C#+SqlServer)
- .NET : 针对Oracle的LOB数据访问
- 一个针对SQLServer操作的封装类
- .wav文件格式图解
- VB.NET特性---- Dllimport特性
- asdf
- test
- 恭贺开业!
- 数据访问层的第二个类(针对sqlserver)
- 活了这些年了,有一些经验,教训和体会
- 知道CSDN的Blog开通了~好高兴~ “激活”Blog之步骤:
- 太高兴了,呵呵!!
- 终于有地儿写了,欢迎到matq的一方地来做客
- 一条检验SQL基础的语句!
- 模板化控件
- 激活了,庆祝一下!
- 验证EMAIL地址的函数