/* 2008 4 25 更新 */
我的数据访问函数库的源码。整个类有1400多行,原先就是分开来写的,现在更新后还是分开来发一下吧。
第一部分:内部成员,初始化设置等。
1
using
System;
2
using
System.Data;
3
using
System.Data.SqlClient;
4
using
HBS.DataStruct;
5
using
HBS.Form;
6
7
//
using System.Security.Principal;
8
9
namespace
HBS
10
{
11 /**//// <summary>
12 /// 存储过程的参数的类型,在输出型的参数里使用。
13 /// </summary>
14 public enum ParameterKind
15 {
16 Int,Double,Decimal,NVarChar,Bit
17 }
18
19 /**//// <summary>
20 /// 这是一个通用的数据访问层接口。对ADO.NET的封装。功能类似于 SQLHelper ,但是需要实例化。
21 /// </summary>
22 public sealed class DataAccessLayer
23 {
24 属性#region 属性
25 private string errorMsg; //出错信息
26 private static bool isShowErrorSQL; //是否显示出错的查询语句(包括存储过程名程)
27 private int executeRowCount; //获取执行SQL查询语句后影响的行数
28 private SqlCommand cm ; //建立Command对象
29 private SqlTransaction sqlTrans ; //用于事务处理
30 public bool isUseTrans; //是否启用了 .net 的事务处理
31
32 /**//// <summary>
33 /// 读取出错信息,用于判断是否出现异常
34 /// </summary>
35 public string ErrorMsg
36 {
37 get{return errorMsg;}
38 }
39
40 /**//// <summary>
41 /// 修改连接字符串,在同时访问两个或两个以上的数据库的时候使用。限于同一类型的数据库,这里是SQL Server
42 /// </summary>
43 public string cnString
44 {
45 set{cm.Connection.ConnectionString = value;}
46 get{return cm.Connection.ConnectionString;}
47 }
48
49 /**//// <summary>
50 /// 获取执行SQL查询语句后影响的行数
51 /// </summary>
52 public int ExecuteRowCount
53 {
54 get{return executeRowCount;}
55 }
56
57 /**//// <summary>
58 /// 释放资源
59 /// </summary>
60 public void Dispose()
61 {
62 if (isUseTrans)
63 sqlTrans.Dispose();
64
65 errorMsg = null;
66 cm.Parameters.Clear();
67 cm.Connection.Close();
68 cm.Dispose();
69 }
70 #endregion
71
72 public DataAccessLayer() //构造函数
73 {
74 //默认不使用事务
75 isUseTrans = false;
76 //得到 SqlCommand 的实例
77 cm = new SqlCommand();
78 //获取连接字符串
79 cm.Connection = new SqlConnection(HBS.Config.Connection.ConnectionString );
80 //初始化错误信息
81 errorMsg = "0";
82 isShowErrorSQL = true; //本地运行,显示出错的查询语句(包括存储过程名程)
83 //isShowErrorSQL = false; //服务器运行,不显示出错的查询语句(包括存储过程名程)
84 }
85
86 内部函数#region 内部函数
87
88 //设置初始值
89 /**//// <summary>
90 /// 设置 errorMsg = "0" ;cm.CommandText 和 cm.CommandType
91 /// </summary>
92 /// <param name="commandText">查询语句或者存储过程</param>
93 /// <param name="commandType">1:存储过程;2:查询语句</param>
94 private void SetCommand(string commandText,int commandType)
95 {
96 errorMsg = "0"; //清空错误信息
97 executeRowCount = 0;
98 cm.CommandText = commandText;
99 if (commandType == 1)
100 cm.CommandType = CommandType.Text;
101 else
102 cm.CommandType = CommandType.StoredProcedure;
103 }
104
105 //设置出错信息
106 /**//// <summary>
107 /// 当发生异常时,所作的处理
108 /// </summary>
109 /// <param name="FunctionName">函数名称</param>
110 /// <param name="commandText">查询语句或者存储过程</param>
111 /// <param name="message">错误信息</param>
112 private void SetErrorMsg(string FunctionName,string commandText,string message)
113 {
114 //设置返回给调用者的错误信息
115 errorMsg = FunctionName + "函数出现错误。<BR>错误信息:" + message;
116 if (isShowErrorSQL ) errorMsg += "<BR>查询语句:" + commandText ;
117 if (isUseTrans)
118 {
119 this.TranRollBack(); //事务模式下:自动回滚事务,不用调用者回滚
120 }
121
122 cm.Connection.Close(); //关闭连接
123 addLogErr(commandText,errorMsg); //记录到错误日志
124 }
125
126 #endregion
127
128 记录错误日志#region 记录错误日志
129 //如果要使用的话,根据你的需要进行修改。
130 public void addLogErr(string SPName,string ErrDescribe)
131 {
132 //记录到错误日志
133 string FilePath = System.Web.HttpContext.Current.Server.MapPath("/log/" + DateTime.Now.ToString("yyyyMMdd") + ".txt");
134 System.Text.StringBuilder str = new System.Text.StringBuilder();
135 str.Append(DateTime.Now.ToString());
136 str.Append("\t");
137 str.Append(System.Web.HttpContext.Current.Request.Url.PathAndQuery);
138 str.Append("\r\n");
139 str.Append(SPName);
140 str.Append("\r\n");
141 str.Append(ErrDescribe.Replace("<BR>",""));
142 if (isUseTrans)
143 {
144 str.Append("\r\n");
145 str.Append("启动事务下出现异常!");
146 isUseTrans = false; //修改事务标志。设置为不使用事务
147 }
148 str.Append("\r\n\r\n");
149
150 System.IO.StreamWriter sw = null;
151 try
152 {
153 sw = new System.IO.StreamWriter(FilePath,true,System.Text.Encoding.Unicode );
154 sw.Write(str.ToString());
155 }
156 catch(Exception ex)
157 {
158 System.Web.HttpContext.Current.Response.Write("没有访问日志文件的权限!或日志文件只读!");
159 }
160 finally
161 {
162 if (sw != null)
163 sw.Close();
164 }
165 }
166 #endregion
167
168 //事务日志
169 事务处理部分。并没有做太多的测试,有不合理的地方请多指教#region 事务处理部分。并没有做太多的测试,有不合理的地方请多指教
170 /**//// <summary>
171 /// 打开连接,并且开始事务。
172 /// </summary>
173 public void TranBegin()
174 {
175 cm.Connection.Open(); //打开连接,直到回滚事务或者提交事务。
176 sqlTrans = cm.Connection.BeginTransaction(); //开始一个事务
177 cm.Transaction = sqlTrans; //交给Command
178 isUseTrans = true; //标记为启用事务
179 }
180 /**//// <summary>
181 /// 提交事务,并关闭连接
182 /// </summary>
183 public void TranCommit()
184 {
185 if (isUseTrans)
186 {
187 sqlTrans.Commit(); //提交事务
188 cm.Connection.Close(); //关闭连接
189 isUseTrans = false; //修改事务标志。
190 }
191 else
192 {
193 //没有启用事务,或者已经回滚,或者已经提交了事务
194 addLogErr("误操作","在没有启用事务,或者已经回滚,或者已经提交了事务的情况下再次提交事务。请注意查看程序流程!");
195 }
196
197 }
198 /**//// <summary>
199 /// 回滚事务,并关闭连接。在程序出错的时候,自动调用。
200 /// </summary>
201 public void TranRollBack()
202 {
203 if (isUseTrans)
204 {
205 sqlTrans.Rollback(); //回滚事务
206 cm.Connection.Close(); //关闭连接
207 isUseTrans = false; //修改事务标志。
208 }
209 else
210 {
211 //没有启用事务,或者已经回滚,或者已经提交了事务
212 addLogErr("误操作","在没有启用事务,或者已经回滚,或者已经提交了事务的情况下再次回滚事务。请注意查看程序流程!");
213 }
214 }
215
216 #endregion
217
218}
219}
下载全部源文件。
http://www.cnblogs.com/jyk/archive/2008/04/25/1170979.html