好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

学习写个Sqlserver的帮助类

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()一样方便(自我感觉)。

 

学习写个Sqlserver的帮助类

标签:

查看更多关于学习写个Sqlserver的帮助类的详细内容...

  阅读:26次