我的数据访问函数库的源代码(一)—— 共用部分

本文涉及的产品
日志服务 SLS,月写入数据量 50GB 1个月
简介: /* 2008 4 25 更新 */ 我的数据访问函数库的源码。整个类有1400多行,原先就是分开来写的,现在更新后还是分开来发一下吧。 第一部分:内部成员,初始化设置等。    1using System;  2using System.
/* 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

相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
相关文章
|
1月前
|
数据库连接 数据库
实现加载驱动、得到数据库对象、关闭资源的代码复用,将代码提取到相应的工具包里边。优化程序
该博客文章展示了如何通过创建工具类`Connectiontools`实现数据库连接、语句执行以及资源关闭的代码复用,以优化程序并提高数据库操作的效率和安全性。
|
4月前
|
开发工具 C语言
调用外部函数库:加入链接的函数库
【5月更文挑战第14天】调用外部函数库:加入链接的函数库。
30 1
|
3月前
|
前端开发 JavaScript Shell
简述框架和函数库的区别
简述框架和函数库的区别
|
4月前
|
设计模式 API 开发者
框架和函数库的区别
框架和函数库的区别
26 1
|
4月前
|
设计模式 开发框架 测试技术
框架和函数库的区别?
框架和函数库的区别?
24 0
|
4月前
|
设计模式 JavaScript 前端开发
简述框架与函数库的区别
简述框架与函数库的区别
30 1
|
API C语言 芯片
创建自己的函数库
创建自己的函数库
创建自己的函数库
|
缓存 Linux
7.16 Linux函数库(静态函数库和动态函数库)及其安装过程
Linux 系统中存在大量的函数库。简单来讲,函数库就是一些函数的集合,每个函数都具有独立的功能且能被外界调用。我们在编写代码时,有些功能根本不需要自己实现,直接调用函数库中的函数即可。
370 0
7.16 Linux函数库(静态函数库和动态函数库)及其安装过程
|
存储 SQL
数据访问函数库的使用方法(一)——添加修改数据
由于这个类库是需要实例化的,如果每一次都要实例化,然后用完了在销毁,无形中就多了不少的代码,而且很容易忘记销毁实例。 同时在用户的一次访问的过程中不断地实例化、销毁,也是比较浪费资源的。 所以我建立了一个基类,在基类里面同意获得实例、统一销毁实例,这样在编码的时候就不用考虑有没有实例化,也不用担心是否销毁实例了, 另外用起来(使用方式)也和静态类的使用方式很像了。
870 0
|
SQL
我的数据访问函数库的源代码(三)——返回结构数组
/* 2008 4 25 更新 */ 我的数据访问函数库的源码。整个类有1400行,原先就是分开来写的,现在更新后还是分开来发一下吧。 第三部分:返回结构数组,这个是专门针对网页来设计的。就是在网页上更方便的显示一组数据。
679 0