using System;
using System.Collections.Generic;
using System.Text;
using System.Data;
using System.Data.SqlClient;namespace Common
{
    public class DBCom
    {
        //取得一个数据库的连接
        public static SqlConnection GetConnection()
        {
            SqlConnection sqlconn = new SqlConnection();
            try
            {
                sqlconn.ConnectionString = System.Configuration.ConfigurationManager.ConnectionStrings[1].ConnectionString;
                return sqlconn;
                
            }
            catch(SqlException e)
            {
                System.Console.WriteLine( e.Message.ToString());
                return null;
            }
        }        //========================================================================        //执行sql语句返回所影响的行数
        public static int ExecuteSql(string sql)
        {
            SqlConnection conn = DBCom.GetConnection();
            SqlCommand cmd = conn.CreateCommand();
            cmd.CommandText = sql.Trim();
            try
            {
                conn.Open();
                int count = cmd.ExecuteNonQuery();
                return count;
            }
            catch(SqlException ex)
            {
                System.Console.WriteLine(ex.Message.ToString());
                return 0;
            }
        }        //执行存储过程
        public static int ExecuteProc(string procName, SqlParameter[] sp)
        {
            SqlConnection conn = DBCom.GetConnection();
            conn.Open();
            SqlCommand cmd = conn.CreateCommand();
            cmd.CommandText = procName.Trim();
            cmd.CommandType = CommandType.StoredProcedure;            foreach (SqlParameter s in sp)
            {
                cmd.Parameters.Add(s);
            }            try
            {
                int i = cmd.ExecuteNonQuery();
                conn.Close();
                return i;
            }
            catch (System.Exception ex)
            {
                System.Console.WriteLine(ex.Message.ToString());
                return 0;
            }
        }        //==============================================================================        //根据sql 返回数据
        public static SqlDataReader GetDataReader(string sql)
        {
            SqlConnection conn = DBCom.GetConnection();
            SqlCommand cmd = conn.CreateCommand();
            cmd.CommandText = sql.Trim();
            try
            {
                conn.Open();
                SqlDataReader dr = cmd.ExecuteReader(System.Data.CommandBehavior.CloseConnection);
                return dr;
            }
            catch (SqlException ex)
            {
                System.Console.WriteLine(ex.Message.ToString());
                return null;
            }
        }        //===========================================================================        public static DataSet GetDataSet(string Sql, string TableName)
        {
            SqlConnection conn = DBCom.GetConnection();
            try
            {
                conn.Open();
                SqlDataAdapter adapter = new SqlDataAdapter(Sql, conn);
                DataSet ds = new DataSet();
                adapter.Fill(ds, TableName);
                conn.Close();
                return ds;
            }
            catch (SqlException ex)
            {
                System.Console.WriteLine(ex.Message.ToString());
                return null;
            }
        }
       
        //通过存储过程返回 数据集
        public static DataSet GetDataSet(string procname, SqlParameter[] sp, string tableName)
        {
            SqlConnection conn = DBCom.GetConnection();
            SqlCommand cmd = new SqlCommand();
            SqlDataAdapter adapter = new SqlDataAdapter();
            DataSet ds = new DataSet();            cmd.CommandType = CommandType.StoredProcedure;
            cmd.CommandText = procname.Trim();            try
            {
                conn.Open();
                cmd.Connection = conn;
                foreach (SqlParameter p in sp)
                {
                    if (p == null)
                    {
                        break;
                    }
                    else
                    {
                        cmd.Parameters.Add(p);
                    }
                    
                }                cmd.ExecuteNonQuery();
                adapter.SelectCommand = cmd;
                adapter.Fill(ds, tableName);
                conn.Close();
                return ds;
            }
            catch(SqlException ex)
            {
                System.Console.WriteLine(ex.Message.ToString());
                return null;
            }
        }    }
}
=====================
以上的一些静态方法共用起来会不会产生冲突

解决方案 »

  1.   

    楼主这个是数据库连接的类吧 
    我的 没用到static 也挺好的 
    你就为了不实例化 用static吗?
      

  2.   

    楼主这个是数据库连接的类吧 
    我的 没用到static 也挺好的 
    你就为了不实例化 用static吗?
    ==================================
    是的,省的每次都去实例化对象麻烦,也浪费内存
      

  3.   

    应该这样:
        public class DBCom
    {
     private static DBCom instance; public static SqlConnection GetConnection()
       {
         if ( instance == null )
         {
             instance = new DBCom();
          }
         return instance;
       }
    ....}
    把你的初始化SqlConnection的那些东西放到构造函数中..
      

  4.   

    不好意思,粘贴有点错误,应该这样:
    应该这样:
        public class DBCom
    {
     private static DBCom instance; public static DBCom GetInstance()
       {
         if ( instance == null )
         {
             instance = new DBCom();
          }
         return instance;
       }
    ....}
    把你的初始化SqlConnection的那些东西放到构造函数中..使用时用 DBCom dbc  DBCom.GetInstance();dbc.....即可正常使用该类,保证只有一个实例..
      

  5.   

    其它的Static方法,全部修改一下,不要用Static修饰了.
      

  6.   

    晕,你这样写每次同样要实例化新的对象
    =====================================
    我说的是不要再去实例化 DBCom 类直接调用类 DBCom 下面的方法就行了
      

  7.   

    nutpp() ( ) 信誉:100    Blog  2007-03-12 10:08:08  得分: 0  
     
     
       哪有单态模式?
    ==========================
    你认为什么是单态模式?
      
     
      

  8.   

    难道我要几个 DBCom 类吗?我一个都不要实例化啊,只要直接调用  DBCom类的方法就可以了,当然 应用程序启动的时候还是会创建一个 DBCom 对象的
      

  9.   

    topken(topken) ( ) 信誉:100    Blog 你说的有些道理,可我觉得我的并不比你差,可能比你的还好用
      

  10.   

    最好不要使用Static方法,不安全,多人并发时,调用会出错滴。
      

  11.   

    不会啊
    我在方法里面都有新的对象 比如:DataSet ds = new DataSet();这样每个人调用这个方法时都会有自己的DataSet 存放数据
      

  12.   

    既然楼主用了try catch
    那么 应该
    保证在finally中将conn.close()  dr.close();
      

  13.   

    把你的初始化SqlConnection的那些东西放到构造函数中..使用时用 DBCom dbc = DBCom.GetInstance();dbc.....即可正常使用该类,保证只有一个实例..====================================
    这种单态模式虽好,但是如果几千个Web用户都用一个 Connection 是不是可行啊?难道我的这样写就不叫 单态模式????????????单态模式 只有一个实例,难道我的不是只有一个DBCom类吗?如果按你写的每次都还要  DBCom dbc = DBCom.GetInstance();一次
    然后再
    DataSet ds=dbc.GetDataSet(sql,"tableName");而我的就只要 
    DataSet ds=DBCom.GetDataSet(sql,"tableName")
    就可以了啊.
      

  14.   

    非要一句的话,这样也一样滴...
    DataSet ds=DBCom.GetInstance().GetDataSet(sql,"tableName");
      

  15.   

    hertcloud(·£孙子兵法£·) ( ) 信誉:100    Blog  2007-03-12 11:32:55  得分: 0  
     
     
       既然楼主用了try catch
    那么 应该
    保证在finally中将conn.close()  dr.close();
      
    ===============================
     我写了这个啊
    SqlDataReader dr = cmd.ExecuteReader(System.Data.CommandBehavior.CloseConnection);
    读完之后会自动关了啊
      

  16.   

    如果真出现了"几千个Web用户"同时访问的话,
    那直接访问数据库的方法肯定需要修改了..
    否则系统响应速度会受影响.
    估计要加一个数据库代理层...
      

  17.   

    两个用户能不能并发使用一个 数据库连接Conntion 啊? 仰 望 高手们谈谈
      

  18.   

    两个用户一般不能并发使用一个数据库连接
    如果有大量并发的情况,只有一个连接是不可行的可能会同时打开十几个连接(SqlConnection对象)
    默认连接池最大数是100
    当连接池中没有可用连接时(全部被占用),就会打开新的连接
      

  19.   

    可能会同时打开几十个连接(SqlConnection对象)
      

  20.   

    那编程的时候就写一个SqlConnection conn=new SqlConnection ();连接池也会打开多个连接吗?如果是这样的话,那么编程的时候不就只要一个 静态公用的 SqlConnection 对象不就行了?拙见 请 斧正
      

  21.   

    SqlConnection conn=new SqlConnection ();连接池也会打开多个连接吗?如果是这样的话,那么编程的时候不就只要一个 静态公用的 SqlConnection 对象不就行了?
    ___________________________________________________________________________________连接池是公用的,
    你在一个页面的某段代码中打开一个连接
    但是这一个页面可能被多个用户同时访问,
    页面也不止这一个
    页面访问说白了,是多线程的(使用线程池)
    同时只有一个可用连接,多个线程被阻塞,你觉得可行吗?
      

  22.   

    Bomb_Leo(爆破雷),你说最好不要使用Static方法,不安全,多人并发时,调用会出错滴。
    根据是什么啊,说说看啊
      

  23.   

    楼主 我猜测你想要得单件大概是下面这个样子的
    public DBCon
    {
        private DBCon(){}    private static SqlConnection conn = null;
        
        public static SqlConnection GetConn()
       {
            if( conn == null )
            {
                conn = new SqlConnection();
            }
            return conn;
       }
    }  但是这个设计在并发上有很多的缺陷 甚至可以说是个错误  他不仅仅不能提高效率  反倒很多时候得不偿失简单来说.当一个connection没有执行完的时候,另外一个connection的请求就可以让你的程序挂掉,你的sqlserver将会被lock.如果你使用同步 lock( this )~~~~~~~~来解决,会使你的程序速度变慢你可以参考一些<<java与模式>>中的单件模式。这本书中对你的这个问题有很深入的讲解。
    完全没有必要只是用一个connection,db会建立一个connection的池来保证多个connection的效率问题。
      

  24.   

    我理解的单态是这样的:
        public class DBCom
    {
     private static DBCom instance; public static DBCom GetInstance()
       {
         if ( instance == null )
         {
             instance = new DBCom();
          }
         return instance;
       }
    ....}所谓的单态是保证DBCom只有一个实例,这个单态不是指SqlConnection只有一个连接 ,但具体有多少个连接由DBCom来控制(上面的方法确实有点缺陷,没有lock对象,可能会有点问题),用户访问数据库的方式都是
    DBCom.CreateInstance().ExecXXX()....
      

  25.   

    .NET的单件模式实际上有许多人都谈到过,比如蝈蝈俊.NET的http://blog.joycode.com/ghj/archive/2004/08/24/31512.aspx以及Chainet的http://www.cnblogs.com/chainet/archive/2004/08/13/33019.html;我所说用Static方法不安全其实也有误,应该是说在单件模式下使用静态函数处理多进程并发会有问题。
    以下引用至“.NET设计模式--单例的深入研究”(http://www.cnblogs.com/william_fire/articles/162485.html)
    因为在MSDN中的文章<<检查表:托管代码的安全检查>>中,"托管代码检查指南-->线程处理"里明确指出了“在多线程应用程序代码的静态类构造函数中,对线程进行同步”及“在静态类构造函数中,对线程进行同步。”两条检查规范,可见,CLR并没有对静态构造函数在多线程环境下进行自动地同步处理。因为.NET中的静态实例的处理,不是在软件启动时进行处理,而是要当包含静态访问的字段、方法、属性或其它什么静态的玩意的类被第一次访问时,在构建实例之前进行创建,也就是说,是临时发觉要用之前才进行创建的。这意味着,如果.NET的框架没有提供一个静态函数初始化的线程安全的处理的情况下,该初始化是并非线程安全的。即使是用了readonly也无济于事:当构建此实例的时间超出了实例创建出来并在框架中进行注册的所消耗的时间时,多线程中假设两个线程同时并发,第一个线程在系统进行静态实例创建时,第二线程也对此类访问,中间的时间差造成了CLR并不知道第一个静态实例正在创建中,那么就会发生了再次进行静态实例创建,这就会造成两个实例的出现,但因为声明了readonly,结果就是会抛出一个异常。