zoukankan      html  css  js  c++  java
  • 学习写个Sqlserver的帮助类

    前两天上课的内容总结了下,一般在连接层基本就调用那几个类。

    一般包括System.Data.SqlClient和System.Data下的SqlConnection,SqlCommand,SqlDataReader这三个类。如果,要想从配置文件中读取的话,还需要System.Configuration。

    到底怎么连接我想书上都有,就不写了。写单私货,和老师在上课时讲的不一样的。

    方法大家一开始是这么写的

            static string connStr = @"Data Source=.Test;Initial Catalog=test;Integrated Security=True";
            public static SqlDataReader GetReader(string sql,params SqlParameter[] pars)
            {
                using (SqlConnection conn = new SqlConnection(connStr))
                {
                    using (SqlCommand comm = new SqlCommand(sql, conn))
                    {
                        comm.Parameters.AddRange(pars);
                        conn.Open();
                        return comm.ExecuteReader(CommandBehavior.CloseConnection);
                    }
                }
            }

    先获取连接字符串(这里用变量意思一下),然后传SqlParameters数组和sql语句。大多数人也都这么写。但定义参数数组太麻烦了,有好多字,也挺麻烦的。

    后来想了想,有没有更好的办法呢。要是能让他自己摘开sql变量多好。于是就写了下面方法

            //拆解sql得到变量数组,返回list<string>类型的Sql变量数组
            private static List<string> GetParamaters(string sql)
            {
                string meat = sql;
                char[] cArray = " ,=()><".ToCharArray();
                for (int i = 0; i < cArray.Length; i++)
                {
                    meat = meat.Replace(cArray[i], '');
                }
                List<string> list = meat.Split('').Where(s => s.Contains("@")).ToList();
                list = RemoveRepeatPars(list);
                return list;
            }

    原理其实就是,sql变量前后字符毕竟也就那么几个么“ ,=()<>”,然后用一个稀有的字符替换下(比如上面那个小星星),以免破坏变量名。再用string.Split

    把他们按照没用的字符截断扔进一个集合里,这样我们把变量前后都打断,再拿出包含'@'字符的字符串,这些就都是干净的变量名了。是吧。

    不过之前还有一步,就是把重复的变量去掉!(有些时候用update的时候set一个变量where一个变量有可能会重复)

            private static List<string> RemoveRepeatPars(List<string> list)
            {
                for (int i = 0; i < list.Count; i++)
                {
                    string s = list[i];
                    while (true)
                    {
                        if (list.IndexOf(s) != list.LastIndexOf(s))
                            list.RemoveAt(list.LastIndexOf(s));
                        else
                            break;
                    }
                }
                return list;
            }

    前后索引都不一样的,八成就是重复的。排除之后就剩下纯净的sql参数了!

    然后就这么改下原来的方法

            private static List<string> GetParamaters(string sql)
            {
                string meat = sql;
                char[] cArray = " ,=()><".ToCharArray();
                for (int i = 0; i < cArray.Length; i++)
                {
                    meat = meat.Replace(cArray[i], '');
                }
                List<string> list = meat.Split('').Where(s => s.Contains("@")).ToList();
                list = RemoveRepeatPars(list);
                return list;
            }

    把这两个方法合并,sql的加工就写好了。下面再改下之前的方法

            public static SqlDataReader GetReader(string sql, params object[] pars)
            {
                List<string> list = GetParamaters(sql);//上来就先截成参数集合
                if (list.Count != pars.Length)
                {
                    throw new Exception("语句中参数个数与给定参数不相符!");//判断一下sql中的参数是不是和给的参数一样多,万一写错了呢
                }
                using (SqlConnection conn = new SqlConnection(connStr))
                {
                    using (SqlCommand comm = new SqlCommand(sql, conn))
                    {
                        for (int i = 0; i < pars.Length; i++)//反正两个数组数量一样多,随便选一个直接加就行了
                        {
                            comm.Parameters.AddWithValue(list[i], pars[i]);
                            conn.Open();
    
                        }
                        return comm.ExecuteReader();
                    }
                }
            }

    然后就用加params的object[]的数组代替原来的Sqlparameters参数了,这样就方便多了,再也不用定义SqlParameters了

    如果下次再要写参数就直接这样写

    GetReader(sql,1,"name",0.14,1m)

    就好了。就像Console.WriteLine()一样方便(自我感觉)。

  • 相关阅读:
    【C/C++】例题5-4 反片语/算法竞赛入门经典/C++与STL入门/映射:map
    【VSCode】如何打开全屏模式/退出全屏模式
    【合同】电子科技大学/外协合同/采购合同
    新的开始
    ubuntu server 1604 搭建FTP服务器
    vim的查找功能
    Ubuntu改坏sudoers后无法使用sudo的解决办法
    ubuntu server 1604 配置网络信息
    ubuntu server 1604 关机和重启
    ubuntu server 1604 设置笔记本盒盖 不操作
  • 原文地址:https://www.cnblogs.com/stupidanimal/p/4516115.html
Copyright © 2011-2022 走看看