数据访问函数库 for ado.net2.0

前言

源代码和调用演示下载:http://www.cnblogs.com/jyk/archive/2008/04/25/1170979.html

数据访问函数库for ado.net 1.1 的说明:http://www.cnblogs.com/jyk/category/67121.html

    由于一直在使用vs2003开发,所以自己使用的数据访问函数库(以下简称:访问库)也就一直没有能够考虑到ado.net2.0。虽然ado.net2.0在调用的时候没有什么变化,但是内部结构却发生了不小的变化,加了一系列的基类,使得更换数据库更容易。

    虽然把把现在的数据访问函数库使用vs2008打开,进行升级,然后就可以使用了,但是这样的话就不能应用ado.net2.0的新的特性,而且原来不方便的地方也不能得到修正,所以打算这一回升级的彻底一点。

先贴一个屠大家看看

一、新的数据访问函数库的优点:

1、支持多种数据库。

2、支持SQL语句、存储过程、存储过程的参数,对这些作了一些处理(封装),使得调用的时候可以更方便。

3、支持ado.net的事务。

4、如果在运行的时候出现异常,可以把异常信息、函数名称和SQL语句写入“错误日志”里面,这样很方便程序员查找错误,上线使用后,也可以做一个记录。

5、默认的数据库类型和连接字符串在webconfig里面设置。

<appSettings>
     <add key="DataType" value ="1"/>
   </appSettings>
  <connectionStrings>
   <add name="ConnStr" connectionString="Data Source=.;Initial Catalog=Northwind;Integrated Security=True" providerName="System.Data.SqlClient"/>
  </connectionStrings>

最主要的目的就是想要在调用的时候尽可能的方便!

二、新的知识点

    升级的时候使用了一些以前不会的东东,比如 Dictionary字典、静态初始化 等,当然第一次使用,可能用法不一定正确。还有就是用了几个vs2008里的新特性。

三、重复制造轮子

    我知道企业库都到了4.0了,但是我还是喜欢使用自己访问库。一是可以向下兼容,方便以前的项目(vs2003)升级到vs2008;二是习惯了,从03年开始使用.net,就一直使用自己写的访问库操作数据库;再有就是想自己写一个锻炼锻炼。

四、一个自己看着都别扭的地方

    ado.net1.1 的访问库比较简单,所有相关的代码都写在了一个类里面,想用那个函数就调用哪个函数,但是这样总感觉有点浪费,因为这个访问库是需要实例化的,即使只使用里面的一个函数,也要把整个类都实例化出来一个,当然我不知道这个过程到底占用多少资源,至少感觉上是很浪费的。

    由于自己对于静态函数还没有很了解,所以还不敢把访问库改成静态的方式,所以还的试用实例化的方式。那么能不能使用哪一个部分就实例化那一部分,其他的先暂时不实例化呢?

    于是我就把这几个部分分成了五个类,在“主类”里面定义一个,然后在需要的时候再实例化。(还是看代码吧:))

 public partial class DataAccessHelp : DbBase 
     {//这个是主类,在里面定义三个成员,这时并不实例化,DataAccessHelp 初始化的时候也不实例化。
 /// 处理存储过程参数的管理部分
         public ManagerStore ParameterMgr;
        /// 处理事务的管理部分
         public ManagerTran TranMgr;
        /// 填充结构数组的部分
         public ManagerWebStruct WebStructMgr;
 
         //然后再需要的时候再实例化
        /// 加载处理存储过程参数的实例。用这个实例来添加存储过程的参数
         public void LoadParameter()
         {
             if (ParameterMgr == null)
             {
                 ParameterMgr = new ManagerStore();
             }
             else
             {
                 //清除Command里面的参数
                 ParameterMgr.ClearParameter();
             }
 ParameterMgr.dal = this;    //把主类的实例传递进去 
         }
     }
 public class ManagerStore 
     {
         /// <summary>
         /// 数据访问函数库的实例,主要是想操作Command
         /// </summary>
         public DataAccessHelp dal;        //接收 DataAccessHelp  的实例
        /// 添加int型的参数。
         /// <param name="ParameterName">参数名称。比如 @UserName</param>
         /// <param name="ParameterValue">参数值</param>
         public virtual  void addNewParameter(string ParameterName, Int32 ParameterValue)
         {
             DbParameter par = dal.CreateParameter(ParameterName);
             par.DbType = DbType.Int32;
             par.Value = ParameterValue;
             //添加存储过程的参数
 dal.myCommand.Parameters.Add(par);
        }
     }

    我都感觉别扭的地方就是上面粗体的部分。有一种互相调用的感觉,但是编译和测试都通过了。

五、疑问

public static Dictionary<string, DbParameter> BaseParameter = new Dictionary<string, DbParameter>();
BaseParameter.Add("1", new System.Data.SqlClient.SqlParameter());
public DbParameter CreateParameter(string myParameterName)
         {
             DbParameter par = BaseParameter[this.DataType];    
 //new System.Data.SqlClient.SqlParameter();  //为了能够正确运行,暂时用这一行的代码代替。
             par.ParameterName = myParameterName;
             return par;
         }

    这样的用法是不是每次调用的时候,par都会得到一个新的实例呢?

    实际测试中却发现:第一次调用的时候,par可以得到一个实例,但是在第二次调用的时候,得到的却是上一次的调用产生的实例。是因为使用了静态变量的原因吗?还是说本来就是这样的?

    那么如果我每次调用都想得到一个新的实例的话,上面的代码应该怎么写呢?

六、调用

    我习惯直接在 .aspx.cs 文件里面调用,但是并不是说只能在这里调用,也是可以在业务层或者是数据层里调用,因为都是在类里面调用。:)

    简单写几个,其他的在 http://www.cnblogs.com/jyk/archive/2008/04/25/1170979.html 这里下载吧。当然如果您感觉这个不值一提,那就不占用您的宝贵时间了。

演示用的数据库:Northwind。

 private void DALTest()
         {
             //测试默认数据库的sql语句
             DataAccessHelp dal = new DataAccessHelp();
             string str1 = dal.RunSqlGetFirstColValue("select ProductName from Products where ProductID = 1");
             Response.Write("RunSqlGetFirstColValue测试:" + str1);
            string[] str2 = dal.RunSqlStrings("select * from Products where ProductID = 2");
             GV_strings.DataSource = str2;
             GV_strings.DataBind();
            string[] str3 = dal.RunSqlStringsByRow("select ProductName from Products ");
             GV_Arr.DataSource = str3;
             GV_Arr.DataBind();
 
             DataRow dr1 = dal.RunSqlDataRow("select * from Products where ProductID = 3");
             GV_DataRow.DataSource = dr1.Table;
             GV_DataRow.DataBind();
            DataTable dt1 = dal.RunSqlDataTable("select * from Products where ProductID = 4");
             GV_DataTable.DataSource = dt1;
             GV_DataTable.DataBind();
            dal.Dispose();
         }
        private void StoreTest()
         {//存储过程的参数的测试
             DataAccessHelp dal = new DataAccessHelp();
             dal.LoadParameter();
            dal.ParameterMgr.ClearParameter();  //清除参数
             dal.ParameterMgr.AddNewParameter("@ProductName","产品名称的测试",40);
             dal.ParameterMgr.AddNewParameter("@SupplierID", 23);
             dal.ParameterMgr.AddNewParameter("@CategoryID", 1);
             dal.ParameterMgr.AddNewParameter("@QuantityPerUnit","5 ml",20);
             dal.ParameterMgr.AddNewParameter("@UnitPrice",decimal.Parse("2.34"));
             dal.ParameterMgr.AddNewParameter("@UnitsInStock", 2);
             dal.ParameterMgr.AddNewParameter("@UnitsOnOrder", 3);
             dal.ParameterMgr.AddNewParameter("@ReorderLevel", 4);
             dal.ParameterMgr.AddNewParameter("@Discontinued",true);
            dal.ParameterMgr.RunStore("Proc_AddProduct");
            DataRow dr1 = dal.RunSqlDataRow("select top 1 * from Products order by ProductID desc");
             GV_DataRow.DataSource = dr1.Table;
             GV_DataRow.DataBind();
             dal.Dispose();
 
         }
        private void StoreShowDataTest()
         {
             DataAccessHelp dal = new DataAccessHelp();
             dal.LoadParameter();
             dal.ParameterMgr.AddNewParameter("@OrderID", 10250);
            this.GV_DataTable.DataSource = dal.ParameterMgr.RunStoreDataTable("CustOrdersDetail");
             this.GV_DataTable.DataBind();
             dal.Dispose();
         }
        private void OleDbTest()
         {//非默认数据库的调用方法,以access数据库为例
             string cnString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=E:\\VS2008\\a.mdb;";
             DataAccessHelp dal = new DataAccessHelp("2", cnString);
            this.GV_DataTable.DataSource = dal.RunSqlDataTable("select * from Manage_Table");
             this.GV_DataTable.DataBind();
             dal.Dispose();
         }

更正:

    由于对Dictionary 和静态变量不够了解,造成了一个错误,现在已经改正。原先想使用Dictionary 来避免switch(根据不同的数据库类型创建不同的实例),现在还得改用 switch的方式来创建实例。

    下载文件已经更新。

修改后的代码

public DbParameter CreateParameter(string myParameterName)
         {
             DbParameter par = null;
             switch (this.DataType)
             {
                 case "1": par = new System.Data.SqlClient.SqlParameter(); break;
                 case "2": par = new System.Data.OleDb.OleDbParameter(); break;
                 case "3": par = new System.Data.Odbc.OdbcParameter(); break;
             } 
             par.ParameterName = myParameterName;
             return par;
         }

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏微信终端开发团队的专栏

JSPatch 实现原理详解

JSPatch 是一个 iOS 动态更新框架,只需在项目中引入极小的引擎,就可以使用就可以使用 JavaScript 调用任何 Objective-C 原生接口...

47780
来自专栏张善友的专栏

初识Opserver,StackExchange的监控解决方案

Opserver是闻名遐迩的网站Stack Overflow的开源监控解决方案,由Stack Exchange发布。它基于.NET框架构建,这在监控工具领域有些...

25560
来自专栏腾讯大数据的专栏

【揭秘】腾讯大数据 98.8 秒完成 100TB 数据排序的架构和算法

上周,腾讯云大数据联合团队以98.8秒的成绩完成100TB数据排序,摘得2016 Sort Benchmark全球排序竞赛冠军。在这次竞赛中,腾讯云数智分布式计...

32280
来自专栏向治洪

svn错误对照表

#, c-format msgid "Destination '%s' is not a directory" msgstr "目的 “%s” 不是目录" ...

43450
来自专栏张善友的专栏

SQL Server 2008 FILESTREAM特性管理文件

在SQL Server 2008中,新的FILESTREAM(文件流)特性和varbinary列配合,你可以在服务器的文件系统上存储真实的数据,但可以在数据库上...

26460
来自专栏张善友的专栏

SQL Server : Browser服务

SQL Server : Browser服务是SQL Server 2005新增的,简单的说,如果一个物理服务器上面有多个SQL Server实例,那么为了确保...

25450
来自专栏向治洪

搜索附近人和商铺功能

越来越多的Android应用都加入了“附近的人”的功能,比如微信、陌陌、淘宝等,今天分享一个demo,简单的来实现这一功能。主要原理为:手机端上传gps数据到...

38550
来自专栏数据库

JPA之使用JPQL语句进行增删改查

JPA支持两种表达查询的方法来检索实体和来自数据库的其他持久化数据:查询语句(Java Persistence Query Language,JPQL)和条件A...

28460
来自专栏张善友的专栏

系统监控工具 Tsar

Tsar是淘宝的一个用来收集服务器系统和应用信息的采集报告工具,如收集服务器的系统信息(cpu,mem等),以及应用数据(nginx、swift等),收集到的数...

26460
来自专栏张善友的专栏

SQLite vs MySQL vs PostgreSQL:关系型数据库比较

自1970年埃德加·科德提出关系模型之后,关系型数据库便开始出现,经过了40多年的演化,如今的关系型数据库种类繁多,功能强大,使用广泛。面对如此之多的关系型数据...

39750

扫码关注云+社区

领取腾讯云代金券

年度创作总结 领取年终奖励