zoukankan      html  css  js  c++  java
  • 再学习sqlhelper

        在机房收费重构系统的时候,第一次学习sqlhelper。当时感觉比较简单,没有写博客总结,现在又经过了图书馆的学习,感觉还是有必要写一写的。

      

             SqlHelper是一个基于。NETFramework的数据库操作组件。组件中包含数据库操作方法。SqlHelper用于简化你重复的去写那些数据库连接(SqlConnection),SqlCommand,SqlDataReader等等。SqlHelper封装过后通常是只需要给方法传入一些参数如数据库连接字符串,SQL参数等,就可以访问数据库了,很方便。 但是做完机房收费系统也是这些感觉,方便了我D层的编写,将很多重复的代码拿了出来。这就是面向对象的思想,抽象,封装。

     

              由于机房收费系统相对来说比较说,或者可以说功能相对来说比较单一:大部分功能都是增删改查四种操作,而且都是简单的sql语句或者存储过程即可实现,所以,看到这个阶段大部分人写的sqlhelper都是这样的:




        简单总结一下就是,




              在做了图书馆管理系统后,又重新学习了,SqlHelper的使用,先大概看一下,图书馆中的SqlHelper的代码:



     

        它将面向对象的思想发挥的淋漓尽致,能抽象就抽象,能封装就封装,可能对于我们做机房收费系统,图书馆管理系统,这样的SqlHelper不免感觉复杂了点,但是对于当今社会的这些系统,几乎100%的都会有数据库,这样与数据库打交道的SqlHelper就会在每个系统中出现,所以来说是非常重要的。下边简单总结一下图书馆中的SqlHelper




         这里我重点说一下,执行多条SQL语句执行事务的方法,下边为带参数和不带参数的两种:

         

         无参数的操作:


     

            /// <summary>
            /// 执行多条SQL语句,实现数据库事务。
            /// </summary>
            /// <param name="SQLStringList">多条SQL语句</param>		
            public static int ExecuteSqlTran(List<String> SQLStringList)//将多条SQL语句写入到集合中
            {
                using (SqlConnection conn = new SqlConnection(connectionString))
                {
                    conn.Open();
                    SqlCommand cmd = new SqlCommand();
                    cmd.Connection = conn;
                    SqlTransaction tx = conn.BeginTransaction();//事务
                    cmd.Transaction = tx;
                    try
                    {
                        //进行循环执行SQL语句
                        int count = 0;
                        for (int n = 0; n < SQLStringList.Count; n++)//利用到集合的总数
                        {
                            string strsql = SQLStringList[n];
                            if (strsql.Trim().Length > 1)
                            {
                                cmd.CommandText = strsql;
                                count += cmd.ExecuteNonQuery();
                            }
                        }
                        tx.Commit();//提交事务
                        return count;
                    }
                    catch
                    {
                        tx.Rollback();//回滚事务
                        return 0;
                    }
                }
            }


          有参数的操作:


     

            /// <summary>
            /// 执行多条SQL语句,实现数据库事务。
            /// </summary>
            /// <param name="SQLStringList">SQL语句的哈希表(key为sql语句,value是该语句的SqlParameter[])</param>
            public static void ExecuteSqlTran(Hashtable SQLStringList)
            {
                using (SqlConnection conn = new SqlConnection(connectionString))
                {
                    conn.Open();
                    using (SqlTransaction trans = conn.BeginTransaction())
                    {
                        SqlCommand cmd = new SqlCommand();
                        try
                        {
                            //循环
                            foreach (DictionaryEntry myDE in SQLStringList)
                            {
                                string cmdText = myDE.Key.ToString();
                                SqlParameter[] cmdParms = (SqlParameter[])myDE.Value;
                                PrepareCommand(cmd, conn, trans, cmdText, cmdParms);//调用处理参数,事务的方法
                                int val = cmd.ExecuteNonQuery();
                                cmd.Parameters.Clear();
                            }
                            trans.Commit();//提交事务
                        }
                        catch
                        {
                            trans.Rollback();//出现错误,回滚事务
                            throw;
                        }
                    }
                }
            }

        当然对于带参数中,它又将参数和事务的处理抽象出来了,大家看这个方法:


     

            private static void PrepareCommand(SqlCommand cmd, SqlConnection conn, SqlTransaction trans, string cmdText, SqlParameter[] cmdParms)
            {
                if (conn.State != ConnectionState.Open)
                    conn.Open();//打开连接
    
                cmd.Connection = conn;
                cmd.CommandText = cmdText;
                if (trans != null)//判断事务是否为空,不空进行处理
                    cmd.Transaction = trans;
                cmd.CommandType = CommandType.Text;//cmdType;
                if (cmdParms != null)//判断参数是否为空,不空进行处理
                {
    
    
                    foreach (SqlParameter parameter in cmdParms)
                    {
                        if ((parameter.Direction == ParameterDirection.InputOutput || parameter.Direction == ParameterDirection.Input) &&
                            (parameter.Value == null))
                        {
                            parameter.Value = DBNull.Value;
                        }
                        cmd.Parameters.Add(parameter);
                    }
                }
            }


        综上为,再学习SqlHelper,感觉真正全面的SqlHelper能够将面向对象发挥的淋漓尽致,对数据库的各种操作都包含了进来。这样对于数据库的操作,在D层我们只要进行简单的调用就非常简单了。


  • 相关阅读:
    什么是 bean 的自动装配?
    什么是 Spring 的内部 bean?
    什么是 Spring 的 MVC 框架?
    Spring AOP and AspectJ AOP 有什么区别?
    解释 JDBC 抽象和 DAO 模块?
    volatile 类型变量提供什么保证?
    一个 Spring Bean 定义 包含什么?
    什么是 Spring MVC 框架的控制器?
    使用 Spring 访问 Hibernate 的方法有哪些?
    什么是 Callable 和 Future?
  • 原文地址:https://www.cnblogs.com/pangblog/p/3278175.html
Copyright © 2011-2022 走看看