新手的我,写的一个数据库类(单例模式),大家来找错,谢谢。

时间:2021-09-07 09:10:53
新手的我,写的一个数据库类(单例模式),大家来找错,谢谢。
-------------------------------------------------
这个类代码不全是我的,是网上下的然后修改的,但是我修改成“单例模式”了,我不知代码有没有不对的地方,谢谢。


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data.SqlClient;
using System.Windows.Forms;

namespace gongjijin
{
    class clsdb
    {
        private static clsdb theSingleton = null;   //单例模式对象
        public SqlConnection conn = null;           //连接对象
        private SqlDataReader dataReader = null;    //dataRader  对象
        private SqlCommand command = null;          //命令对象
       
        /// <summary>
        /// 构造函数
        /// </summary>
        private clsdb()
        {           
            //连接数据库字符串
            string connStr = "Data source=.;Initial Catalog=db1;User id=sa;pwd=0000";
            conn = new SqlConnection(connStr);
            //打开数据库连接
            conn.Open();
            command = new SqlCommand();
            command.Connection = conn;
        }

        //实例方法
        public static clsdb Instance()
        {
            if (null == theSingleton)
            {
                theSingleton = new clsdb();
            }
            return theSingleton;
        }

        /// <summary>
        /// 增删改查
        /// </summary>
        /// <param name="sql"></param>
        /// <returns></returns>
        public int UpdateDeleteAdd(string sql)
        {
            command.CommandText = sql;
            int rows = command.ExecuteNonQuery();
            return rows;
        }

        /// <summary>
        /// 查询多个值的方法
        /// </summary>
        /// <param name="sql"></param>
        /// <returns></returns>
        public SqlDataReader SelectAll(string sql)
        {
            command.CommandText = sql;
            dataReader = command.ExecuteReader();
            return dataReader;
        }

        /// <summary>
        /// 查询单个值的方法
        /// </summary>
        /// <param name="sql"></param>
        /// <returns></returns>
        public double SelectOne(string sql)
        {
            double count;
            command.CommandText = sql;
            if (command.ExecuteScalar() is DBNull)
            {
                count = 0;                
            }
            else
            {
                count = Convert.ToDouble(command.ExecuteScalar());               
            }
            return count;
        }

        /// <summary>
        /// 关闭数据库连接 
        /// </summary>
        public void GetClose()
        {
            conn.Close();
        }
    }
}


11 个解决方案

#1


SqlHelper
大量使用实例的时候,使用singletone
否则静态变量public   static   Singleton   GetInstance()   
            {   
                        if   (instance==null)   
                        {   
                                    lock   (padlock)   
                                    { 
                                                if   (instance==null)   
                                                instance   =   new   Singleton();   
                                    }   
                        }   
                        return   instance; 
            }   

#2


SqlHelper
大量使用实例的时候,使用singletone
否则静态变量public static Singleton GetInstance()   
  {   
  if (instance==null)   
  {   
  lock (padlock)   
  {  
  if (instance==null)   
  instance = new Singleton();   
  }   
  }   
  return instance;  
  }   

#3


没有什么不对的,只补过你可以好好的从性能上,从开发的角度上去优化一下你的代码。
 好好的封装一下你代码~

#4


我不知我的单例模式这样写行不行,请大家提点意见,谢谢了。

#5


没什么问题,这是最普遍的用法,平常我也是这样写的。但我看过Robert C.Martion的一篇文章,他说这样的话会“多次使用的if进行判断,做成不必要的开销”
引用
public static clsdb Instance()
{
            if (null == theSingleton)
            {
                theSingleton = new clsdb();
            }
            return theSingleton;
 }
 
可以用一个静态变量来代替IF
private static Clsdb cladb1=new Clsdb();
public static clsdb Instance()
{
      return cladb1;
}

#6


单例模式有3种写法
你这个是其中之一

#7


如果为了混一个“知道模式”的考试结果,这样写无所谓。

如果你真的懂.net,要知道sqlConnection是专门设计来使用连接池的,用不着画蛇添足搞什么对象共享。而你的所谓单利,不但彻底毁掉了连接池的能力,而且自然在多用户时直接造成各种崩溃性异常。

随便搜了一个文章你可以做参考: http://blog.163.com/henan_lujun/blog/static/19538333200781715121731/

#8


你去充分而实际地了解自己常用的系统框架的源代码和设计思路,还用的着纠缠什么模式这种沽名钓誉的东西吗?

#9


只在自己的电脑上“学习”别人的“范例”,而没有实际做过多用户的营运系统,很可能根本不知道系统可用性方面(这是多么简单的概念啊)的深浅。

#10


得加锁,不然同时访问怎么解决,

#11


应该把sqlconnection 做成单利。

#1


SqlHelper
大量使用实例的时候,使用singletone
否则静态变量public   static   Singleton   GetInstance()   
            {   
                        if   (instance==null)   
                        {   
                                    lock   (padlock)   
                                    { 
                                                if   (instance==null)   
                                                instance   =   new   Singleton();   
                                    }   
                        }   
                        return   instance; 
            }   

#2


SqlHelper
大量使用实例的时候,使用singletone
否则静态变量public static Singleton GetInstance()   
  {   
  if (instance==null)   
  {   
  lock (padlock)   
  {  
  if (instance==null)   
  instance = new Singleton();   
  }   
  }   
  return instance;  
  }   

#3


没有什么不对的,只补过你可以好好的从性能上,从开发的角度上去优化一下你的代码。
 好好的封装一下你代码~

#4


我不知我的单例模式这样写行不行,请大家提点意见,谢谢了。

#5


没什么问题,这是最普遍的用法,平常我也是这样写的。但我看过Robert C.Martion的一篇文章,他说这样的话会“多次使用的if进行判断,做成不必要的开销”
引用
public static clsdb Instance()
{
            if (null == theSingleton)
            {
                theSingleton = new clsdb();
            }
            return theSingleton;
 }
 
可以用一个静态变量来代替IF
private static Clsdb cladb1=new Clsdb();
public static clsdb Instance()
{
      return cladb1;
}

#6


单例模式有3种写法
你这个是其中之一

#7


如果为了混一个“知道模式”的考试结果,这样写无所谓。

如果你真的懂.net,要知道sqlConnection是专门设计来使用连接池的,用不着画蛇添足搞什么对象共享。而你的所谓单利,不但彻底毁掉了连接池的能力,而且自然在多用户时直接造成各种崩溃性异常。

随便搜了一个文章你可以做参考: http://blog.163.com/henan_lujun/blog/static/19538333200781715121731/

#8


你去充分而实际地了解自己常用的系统框架的源代码和设计思路,还用的着纠缠什么模式这种沽名钓誉的东西吗?

#9


只在自己的电脑上“学习”别人的“范例”,而没有实际做过多用户的营运系统,很可能根本不知道系统可用性方面(这是多么简单的概念啊)的深浅。

#10


得加锁,不然同时访问怎么解决,

#11


应该把sqlconnection 做成单利。