/**/
/************************
* 金色海洋工作室 —— 数据访问层
*
* 数据访问层(SQL Server 版)
*
* 最后修改时间:2006年8月15日
************************/
using System;
using System.Data;
using System.Data.SqlClient;
using JYK.DataStruct; // 结构,用于“实体类”
// using System.Security.Principal;
namespace JYK
... {
/**//// <summary>
/// 存储过程的参数的类型,在输出型的参数里使用。
/// </summary>
public enum ParameterKind
...{
Int,Double,Decimal,NVarChar,Bit
}
/**//// <summary>
/// 这是一个通用的数据访问层接口。对ADO.NET的封装。功能类似于 SQLHelper ,但是比SQLHelper要简洁和高效。
/// </summary>
public sealed class DataAccessLayer
...{
属性#region 属性
private static string errorMsg; //出错信息
private static bool isShowErrorSQL; //是否显示出错的查询语句(包括存储过程名程)
private int executeRowCount; //获取执行SQL查询语句后影响的行数
private SqlCommand cm ; //建立Command对象
private SqlTransaction sqlTrans ; //用于事务处理
private static bool isUseTrans; //是否启用了 .net 的事务处理
/**//// <summary>
/// 读取出错信息
/// </summary>
public string ErrorMsg
...{
get...{return errorMsg;}
}
/**//// <summary>
/// 修改连接字符串,在同时访问两个或两个以上的数据库的时候使用
/// </summary>
public string cnString
...{
set...{cm.Connection.ConnectionString = value;}
get...{return cm.Connection.ConnectionString;}
}
/**//// <summary>
/// 获取执行SQL查询语句后影响的行数
/// </summary>
public int ExecuteRowCount
...{
get...{return executeRowCount;}
}
/**//// <summary>
/// 释放资源
/// </summary>
public void Dispose()
...{
if (isUseTrans)
sqlTrans.Dispose();
errorMsg = null;
cm.Parameters.Clear();
cm.Connection.Close();
cm.Dispose();
}
#endregion
public DataAccessLayer() //构造函数
...{
//默认不使用事务
isUseTrans = false;
//获取连接字符串
cm = new SqlCommand();
cm.Connection = new SqlConnection("获取连接字符串");
//JYK.Connection.ConnectionString
//初始化错误信息
errorMsg="0";
isShowErrorSQL = true; //本地运行,显示出错的查询语句(包括存储过程名程)
//isShowErrorSQL = false; //服务器运行,不显示出错的查询语句(包括存储过程名程)
}
内部函数#region 内部函数
//设置初始值
/**//// <summary>
/// 设置 errorMsg = "0" ;cm.CommandText 和 cm.CommandType
/// </summary>
/// <param name="commandText">查询语句或者存储过程</param>
/// <param name="commandType">1:存储过程;2:查询语句</param>
private void SetCommand(string commandText,int commandType)
...{
errorMsg = "0"; //清空错误信息
executeRowCount = 0;
cm.CommandText = commandText;
if (commandType == 1)
cm.CommandType = CommandType.Text;
else
cm.CommandType = CommandType.StoredProcedure;
}
//设置出错信息
/**//// <summary>
/// 当发生异常时,所作的处理
/// </summary>
/// <param name="FunctionName">函数名称</param>
/// <param name="commandText">查询语句或者存储过程</param>
/// <param name="message">错误信息</param>
private void SetErrorMsg(string FunctionName,string commandText,string message)
...{
//设置返回到上一层的错误信息
errorMsg = FunctionName + "函数出现错误。<BR>错误信息:" + message;
if (isShowErrorSQL ) errorMsg +="<BR>查询语句:" + commandText ;
if (isUseTrans)
this.TranRollBack(); //事务模式下:回滚事务
cm.Connection.Close(); //关闭连接
addLogErr(commandText,errorMsg); //记录到错误日志
}
#endregion
记录错误日志#region 记录错误日志
//如果要使用的话,根据你的需要进行修改。
public void addLogErr(string SPName,string ErrDescribe)
...{
//记录到错误日志
string FilePath = System.Web.HttpContext.Current.Server.MapPath("/log/" + DateTime.Now.ToString("yyyyMMdd") + ".txt");
System.Text.StringBuilder str = new System.Text.StringBuilder();
str.Append(DateTime.Now.ToString());
str.Append(" ");
str.Append(SPName);
str.Append(" ");
str.Append(ErrDescribe.Replace("<BR>",""));
str.Append(" ");
System.IO.StreamWriter sw = null;
try
...{
sw = new System.IO.StreamWriter(FilePath,true,System.Text.Encoding.Unicode );
sw.Write(str.ToString());
}
catch(Exception ex)
...{
System.Web.HttpContext.Current.Response.Write("没有访问日志文件的权限!或日志文件只读!");
}
finally
...{
if (sw != null)
sw.Close();
}
}
#endregion
//事务日志
事务处理部分。并没有做太多的测试,有不合理的地方请多指教#region 事务处理部分。并没有做太多的测试,有不合理的地方请多指教
/**//// <summary>
/// 打开连接,并且开始事务。
/// </summary>
public void TranBegin()
...{
cm.Connection.Open();
sqlTrans = cm.Connection.BeginTransaction();
cm.Transaction = sqlTrans;
isUseTrans = true;
}
/**//// <summary>
/// 提交事务,并关闭连接
/// </summary>
public void TranCommit()
...{
sqlTrans.Commit();
cm.Connection.Close();
}
/**//// <summary>
/// 回滚事务,并关闭连接。在程序出错的时候,自动调用。
/// </summary>
public void TranRollBack()
...{
sqlTrans.Rollback();
cm.Connection.Close();
}
#endregion
未完,待续......
}
}
* 金色海洋工作室 —— 数据访问层
*
* 数据访问层(SQL Server 版)
*
* 最后修改时间:2006年8月15日
************************/
using System;
using System.Data;
using System.Data.SqlClient;
using JYK.DataStruct; // 结构,用于“实体类”
// using System.Security.Principal;
namespace JYK
... {
/**//// <summary>
/// 存储过程的参数的类型,在输出型的参数里使用。
/// </summary>
public enum ParameterKind
...{
Int,Double,Decimal,NVarChar,Bit
}
/**//// <summary>
/// 这是一个通用的数据访问层接口。对ADO.NET的封装。功能类似于 SQLHelper ,但是比SQLHelper要简洁和高效。
/// </summary>
public sealed class DataAccessLayer
...{
属性#region 属性
private static string errorMsg; //出错信息
private static bool isShowErrorSQL; //是否显示出错的查询语句(包括存储过程名程)
private int executeRowCount; //获取执行SQL查询语句后影响的行数
private SqlCommand cm ; //建立Command对象
private SqlTransaction sqlTrans ; //用于事务处理
private static bool isUseTrans; //是否启用了 .net 的事务处理
/**//// <summary>
/// 读取出错信息
/// </summary>
public string ErrorMsg
...{
get...{return errorMsg;}
}
/**//// <summary>
/// 修改连接字符串,在同时访问两个或两个以上的数据库的时候使用
/// </summary>
public string cnString
...{
set...{cm.Connection.ConnectionString = value;}
get...{return cm.Connection.ConnectionString;}
}
/**//// <summary>
/// 获取执行SQL查询语句后影响的行数
/// </summary>
public int ExecuteRowCount
...{
get...{return executeRowCount;}
}
/**//// <summary>
/// 释放资源
/// </summary>
public void Dispose()
...{
if (isUseTrans)
sqlTrans.Dispose();
errorMsg = null;
cm.Parameters.Clear();
cm.Connection.Close();
cm.Dispose();
}
#endregion
public DataAccessLayer() //构造函数
...{
//默认不使用事务
isUseTrans = false;
//获取连接字符串
cm = new SqlCommand();
cm.Connection = new SqlConnection("获取连接字符串");
//JYK.Connection.ConnectionString
//初始化错误信息
errorMsg="0";
isShowErrorSQL = true; //本地运行,显示出错的查询语句(包括存储过程名程)
//isShowErrorSQL = false; //服务器运行,不显示出错的查询语句(包括存储过程名程)
}
内部函数#region 内部函数
//设置初始值
/**//// <summary>
/// 设置 errorMsg = "0" ;cm.CommandText 和 cm.CommandType
/// </summary>
/// <param name="commandText">查询语句或者存储过程</param>
/// <param name="commandType">1:存储过程;2:查询语句</param>
private void SetCommand(string commandText,int commandType)
...{
errorMsg = "0"; //清空错误信息
executeRowCount = 0;
cm.CommandText = commandText;
if (commandType == 1)
cm.CommandType = CommandType.Text;
else
cm.CommandType = CommandType.StoredProcedure;
}
//设置出错信息
/**//// <summary>
/// 当发生异常时,所作的处理
/// </summary>
/// <param name="FunctionName">函数名称</param>
/// <param name="commandText">查询语句或者存储过程</param>
/// <param name="message">错误信息</param>
private void SetErrorMsg(string FunctionName,string commandText,string message)
...{
//设置返回到上一层的错误信息
errorMsg = FunctionName + "函数出现错误。<BR>错误信息:" + message;
if (isShowErrorSQL ) errorMsg +="<BR>查询语句:" + commandText ;
if (isUseTrans)
this.TranRollBack(); //事务模式下:回滚事务
cm.Connection.Close(); //关闭连接
addLogErr(commandText,errorMsg); //记录到错误日志
}
#endregion
记录错误日志#region 记录错误日志
//如果要使用的话,根据你的需要进行修改。
public void addLogErr(string SPName,string ErrDescribe)
...{
//记录到错误日志
string FilePath = System.Web.HttpContext.Current.Server.MapPath("/log/" + DateTime.Now.ToString("yyyyMMdd") + ".txt");
System.Text.StringBuilder str = new System.Text.StringBuilder();
str.Append(DateTime.Now.ToString());
str.Append(" ");
str.Append(SPName);
str.Append(" ");
str.Append(ErrDescribe.Replace("<BR>",""));
str.Append(" ");
System.IO.StreamWriter sw = null;
try
...{
sw = new System.IO.StreamWriter(FilePath,true,System.Text.Encoding.Unicode );
sw.Write(str.ToString());
}
catch(Exception ex)
...{
System.Web.HttpContext.Current.Response.Write("没有访问日志文件的权限!或日志文件只读!");
}
finally
...{
if (sw != null)
sw.Close();
}
}
#endregion
//事务日志
事务处理部分。并没有做太多的测试,有不合理的地方请多指教#region 事务处理部分。并没有做太多的测试,有不合理的地方请多指教
/**//// <summary>
/// 打开连接,并且开始事务。
/// </summary>
public void TranBegin()
...{
cm.Connection.Open();
sqlTrans = cm.Connection.BeginTransaction();
cm.Transaction = sqlTrans;
isUseTrans = true;
}
/**//// <summary>
/// 提交事务,并关闭连接
/// </summary>
public void TranCommit()
...{
sqlTrans.Commit();
cm.Connection.Close();
}
/**//// <summary>
/// 回滚事务,并关闭连接。在程序出错的时候,自动调用。
/// </summary>
public void TranRollBack()
...{
sqlTrans.Rollback();
cm.Connection.Close();
}
#endregion
未完,待续......
}
}
由于代码比较长,所以呢分成几个部分显示。