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;
}
} }
}
=====================
以上的一些静态方法共用起来会不会产生冲突
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;
}
} }
}
=====================
以上的一些静态方法共用起来会不会产生冲突
我的 没用到static 也挺好的
你就为了不实例化 用static吗?
我的 没用到static 也挺好的
你就为了不实例化 用static吗?
==================================
是的,省的每次都去实例化对象麻烦,也浪费内存
public class DBCom
{
private static DBCom instance; public static SqlConnection GetConnection()
{
if ( instance == null )
{
instance = new DBCom();
}
return instance;
}
....}
把你的初始化SqlConnection的那些东西放到构造函数中..
应该这样:
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.....即可正常使用该类,保证只有一个实例..
=====================================
我说的是不要再去实例化 DBCom 类直接调用类 DBCom 下面的方法就行了
哪有单态模式?
==========================
你认为什么是单态模式?
我在方法里面都有新的对象 比如:DataSet ds = new DataSet();这样每个人调用这个方法时都会有自己的DataSet 存放数据
那么 应该
保证在finally中将conn.close() dr.close();
这种单态模式虽好,但是如果几千个Web用户都用一个 Connection 是不是可行啊?难道我的这样写就不叫 单态模式????????????单态模式 只有一个实例,难道我的不是只有一个DBCom类吗?如果按你写的每次都还要 DBCom dbc = DBCom.GetInstance();一次
然后再
DataSet ds=dbc.GetDataSet(sql,"tableName");而我的就只要
DataSet ds=DBCom.GetDataSet(sql,"tableName")
就可以了啊.
DataSet ds=DBCom.GetInstance().GetDataSet(sql,"tableName");
既然楼主用了try catch
那么 应该
保证在finally中将conn.close() dr.close();
===============================
我写了这个啊
SqlDataReader dr = cmd.ExecuteReader(System.Data.CommandBehavior.CloseConnection);
读完之后会自动关了啊
那直接访问数据库的方法肯定需要修改了..
否则系统响应速度会受影响.
估计要加一个数据库代理层...
如果有大量并发的情况,只有一个连接是不可行的可能会同时打开十几个连接(SqlConnection对象)
默认连接池最大数是100
当连接池中没有可用连接时(全部被占用),就会打开新的连接
___________________________________________________________________________________连接池是公用的,
你在一个页面的某段代码中打开一个连接
但是这一个页面可能被多个用户同时访问,
页面也不止这一个
页面访问说白了,是多线程的(使用线程池)
同时只有一个可用连接,多个线程被阻塞,你觉得可行吗?
根据是什么啊,说说看啊
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的效率问题。
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()....
以下引用至“.NET设计模式--单例的深入研究”(http://www.cnblogs.com/william_fire/articles/162485.html)
因为在MSDN中的文章<<检查表:托管代码的安全检查>>中,"托管代码检查指南-->线程处理"里明确指出了“在多线程应用程序代码的静态类构造函数中,对线程进行同步”及“在静态类构造函数中,对线程进行同步。”两条检查规范,可见,CLR并没有对静态构造函数在多线程环境下进行自动地同步处理。因为.NET中的静态实例的处理,不是在软件启动时进行处理,而是要当包含静态访问的字段、方法、属性或其它什么静态的玩意的类被第一次访问时,在构建实例之前进行创建,也就是说,是临时发觉要用之前才进行创建的。这意味着,如果.NET的框架没有提供一个静态函数初始化的线程安全的处理的情况下,该初始化是并非线程安全的。即使是用了readonly也无济于事:当构建此实例的时间超出了实例创建出来并在框架中进行注册的所消耗的时间时,多线程中假设两个线程同时并发,第一个线程在系统进行静态实例创建时,第二线程也对此类访问,中间的时间差造成了CLR并不知道第一个静态实例正在创建中,那么就会发生了再次进行静态实例创建,这就会造成两个实例的出现,但因为声明了readonly,结果就是会抛出一个异常。