/* 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
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!