刚转学c#,写了一点点代码 ,请指点下,我这样写行不? 
最好多发表自己的意见。。
万分感谢!using System;
using System.Collections.Generic;
using System.Text;
using System.Data.SqlClient;
using System.Data;namespace Member_database
{
     public class sqldbconnection
    {
         public static SqlConnection mysqlcon = new SqlConnection("server=.;userid=sa;password=123;database=member");
         
         public void Mysql_conOpen() 
         {
             try{
                 if (mysqlcon.State == ConnectionState.Open){ 
                 }
                 if (mysqlcon.State == ConnectionState.Closed){
                     mysqlcon.Open();
                 }
             
             }catch (Exception ex){
                 if (ex!= null) mysqlcon  = null;
              }
         }         public void Mysql_conClose()
         {
             try{
                 if (mysqlcon.State == ConnectionState.Open){
                     mysqlcon.Close();
                     mysqlcon.Dispose();
                 }
                 if (mysqlcon.State == ConnectionState.Closed){
                     mysqlcon.Dispose();
                 }
             }catch (Exception ex){
                 if (ex != null) mysqlcon = null;
              }
         }
   
         public static SqlDataReader SqlReader(string SqlCmd)
         {
             SqlDataReader sqldr = null;
           //  Mysql_conOpen;
             SqlCommand cmd = new SqlCommand(SqlCmd, mysqlcon);
             try{
                 sqldr = cmd.ExecuteReader();
             }catch (Exception ex){
                 if (ex != null) sqldr = null;
             }
             return sqldr;
         }         public static   SqlCommand  Ex_SqlCmd(string sqlcmd)
         {
             SqlCommand cmd = null;
            // Mysql_conOpen();
             cmd = new SqlCommand(sqlcmd, mysqlcon);
             try{
                 cmd.ExecuteNonQuery();
             }catch (Exception ex){
                 if (ex != null) cmd = null;
             }
             return cmd;
         }         public static DataTable Read_table(string sqlcmd)
         {
             DataTable dt = null;
             dt = new DataTable();
             SqlDataAdapter da = new SqlDataAdapter(sqlcmd, mysqlcon);
             try{
                 da.Fill(dt);
             }catch (Exception ex){
                 if (ex != null) dt = null;
             }
             return dt;
         }         public static DataSet Read_Dataset(string sqlcmd)
         {
             DataSet ds = null;
             ds = new DataSet();
             SqlDataAdapter da = new SqlDataAdapter(sqlcmd, mysqlcon);
             try{
                 da.Fill(ds);
             }catch (Exception ex){
                 if (ex != null) ds = null;
             }
             return ds;
         }
    }
}

解决方案 »

  1.   

    整体很好,有一点小的瑕疵,算是鸡蛋里挑骨头吧:
    Mysql_conOpen里有一个空分支。(当然考虑到.NET的代码优化问题不大)
    Ex_SqlCmd应当返回ExecuteNonQuery()的返回值
    使用SQLCommand或DataAdapter的地方最好能用using语句块或手动Dispose。(当然也可以信任垃圾回收)
    如果函数无论如何都要返回的话return最好写在finally块中。
      

  2.   


     try{ 
                    if (mysqlcon.State == ConnectionState.Open){ 
                    } 
                    if (mysqlcon.State == ConnectionState.Closed){ 
                        mysqlcon.Open(); 
                    } 
               }catch (Exception ex){ 
                    if (ex!= null) mysqlcon  = null; 
                  }
    这不多余的try catch 吗?
      

  3.   

    我发现很多人都喜欢以静态变量的形式来保存连接对象。然后所有对数据库的操作都只使用这个连接。其实我认为这是对资源的一种浪费,同时使程序变得不可控:
    第一:对数据库的操作相对来说是一个很慢长的过程,只使用一个连接,在多线程处理的时候,造成所有线程挂起等待。
    第二:在b/s结构的软件中,请求处理往往是多线程的,对同一连接的操作,如果不作串行处理,对数据库的操作很容易造成混乱(如:事务处理,连接Close, 连接open,DataReader对应Connection等等)
    第三:大部分ado.net的实现,一般都在内部实用了连接池。连接池里有许多连接,而我们却只用了其中的一个,太浪费资源了。
      

  4.   

    还不错,随便说说,不一定对,仅供参考。(1)最好把static去掉,用非静态成员,资源可回收.
    (2)连接字符串 userid --> uid
    (3)Ex_SqlCmd方法
       返回结果 可以是成功与否 
    (4)Read_table方法
       DataTable dt = null;
         dt = new DataTable();
       改为一行(简洁):
       DataTable dt = new DataTable();
    (5)Read_Dataset
         DataSet ds = null;
         ds = new DataSet();
       改为一行(简洁):
         DataSet ds = new DataSet();
      

  5.   

    语法层面上,命名没有统一的规范,一会使用"_"来区分多个单词(如:Read_Dataset),一会使用每个单词的首字母大写来区分(如:SqlReader),一会儿又上面两种方式的结合(如:Read_table)
    具体代码段:
    try{
                    if (mysqlcon.State == ConnectionState.Open){  // 多余
                    }
                    if (mysqlcon.State == ConnectionState.Closed){
                        mysqlcon.Open();
                    }
               
                }catch (Exception ex){
                    if (ex!= null) mysqlcon  = null; // 多余, ex肯定 != null
                  } // .....个人意见:很多代码段我觉得莫名其秒。
    if (mysqlcon.State == ConnectionState.Closed){
                        mysqlcon.Dispose();  // 已经dispose掉了,mysqlcon就不能重用了。再调用Mysql_conOpen()就会有问题
                    } 下面方法,如果连接没有打开,支持肯定会出错。
    SqlReader
    Ex_SqlCmd
    Read_table
    Read_dataset
      

  6.   

    SqlCommand里多使用using,try catch尽量少
    ExecuteReader(CommandBehavior.CloseConnection);
      

  7.   

    提一点,一般SqlDataReader,SqlCommand等用完就应该清了,不需长时间保留,比如
    using (SqlDataReader sqldr= SqlCmd.ExecuteReader())
    {
                       
    }
    SqlCmd.Dispose();
      

  8.   

     删除这行 if (mysqlcon.State == ConnectionState.Open){    } 
    catch (Exception ex)
    最好改为cath(SqlException ex) 
      

  9.   

    能不用try catch就不用。节省系统资源
      

  10.   

    一个小意见:命名问题,“Mysql***" 我一眼看上去还以为是用于MySQL的。
      

  11.   

    执行完操作,最好关闭连接,mysqlcon.close();在每个方法中首行调用Mysql_conOpen,避免连接为关闭状态;if (mysqlcon.State == ConnectionState.Open){ 

    这句是多余的,看着有些别扭SqlReader在连接关闭时,返回的值也就会不复存在,所以不适宜放在此类中
      

  12.   

    说的比较好,本来有更详细的信息,被你的cath(Exception ex)抹杀了
    这就好象,你明知道你的肾脏有问题导致脸色鸡黄,你却只是用擦脸油去遮盖,这种事情做多了以后,系统出了问题,却再也找不到问题的根节
    我记得有本书上说到了这一点,印象中应该是:核心编程 或者 .Net框架设计
    什么时候cath(Exception ex)可以用呢
    在遇到无法解决的问题,导致程序崩溃的时候,也就是说你的catch块里应该只有类似的代码
    cath(Exception ex)
    {
      Exist(0);
    }
    个人意见,仅供参考
      

  13.   

    不错。。try,catch分的太多感觉没必要
      

  14.   

    无用代码太多
    catch (Exception ex){ 
                    if (ex!= null) mysqlcon  = null; 
                  } 
    这个判断没有意义,ex肯定不会为null的
    不要一直打开着连接。用using结构比较好,连接用完就释放掉
    using (SqlConnection Connection=new SqlConnection(...))
    {
       ...
    }
    否则控制会很烦,
    你把异常给吃掉会有很多麻烦
    比如这么三条语句1 Mysql_conOpen() ;
    2 执行dataadapter/command
    3 Mysql_conClose();如果1 Mysql_conOpen()发生了异常会发生什么?
    catch (Exception ex){ 
                    if (ex!= null) mysqlcon  = null; 
                  } 你直接把异常吃掉而且连接=null
    于是程序继续运行,执行2和3,因为连接=null 所以 2的时候一定会出错了,所以你又要try
    {
    1 Mysql_conOpen() ;
    2 执行dataadapter/command
    3 Mysql_conClose();
    }
    catch
    {
      ...
    }那Mysql_conOpen里异常捕获就没有意义了,还不如不写还有如果再开了事务,
    1 Mysql_conOpen() ;
    2 执行dataadapter/command 
    3 Mysql_conClose();2里开了事务,但开完后又发生了异常,所以还是要trytry
    {
    1 Mysql_conOpen() ;
    2 执行dataadapter/command 
    3 Mysql_conClose();
    }
    finally
    {
      if   开了事务?
         回滚事务
    }代码看起来还是很累赘,内部异常捕获还是没用所以这样比较好using (SqlConnection Connection=new SqlConnection(...))
    try
    {
       Connection.Open();  // 如果是dataadapter.fill数据连open都不需要
       ...
    }
    catch(Exception e)
    {
       比如事务回滚
    }