刚接触c# 写了DbHelper 帮我看看啊有什么问题,谢谢!

小陆铃铃 2013-05-08 04:10:11
不妥的地方 不规范的地方请大家指出
或者请大家也发一个简单的DbHelper 模块我看看,谢谢!

public class DbHelper
{
private static SqlConnection scon;
public static string ConnectionString = System.Configuration.ConfigurationManager.AppSettings["ConnectionString"];

public static SqlConnection GetDBconnection
{
get
{
if (scon == null)
{
scon = new SqlConnection(ConnectionString);
try
{
scon.Open();
}
catch (Exception)
{
}
}
else switch (scon.State)
{
case ConnectionState.Closed:
scon.Open();
break;
case ConnectionState.Broken:
scon.Close();
scon.Open();
break;
}
return scon;
}
}

/// <summary>
/// 执行语句
/// </summary>
/// <param name="sql"></param>
/// <returns></returns>
public int ExecuteSql(string sql)
{
try
{
using (SqlCommand scom = new SqlCommand(sql, GetDBconnection))
{
int result = Convert.ToInt32(scom.ExecuteNonQuery());
return result;
}
}
catch (SqlException ex)
{
scon.Close();
throw ex; ;
}
finally
{
scon.Close(); //添加
}
}

/// <summary>
/// 返回记录
/// </summary>
/// <param name="sql"></param>
/// <returns></returns>
public DataTable Getdatatable(string sql)
{
try
{
DataSet ds = new DataSet();
ds.CaseSensitive = false;
using (SqlCommand scom = new SqlCommand(sql, GetDBconnection))
{
SqlDataAdapter sda = new SqlDataAdapter(scom);
sda.Fill(ds);
sda.Dispose();
return ds.Tables[0];
}
}
catch (SqlException ex)
{
throw ex;
}
}
}
...全文
300 22 打赏 收藏 转发到动态 举报
写回复
用AI写文章
22 条回复
切换为时间正序
请发表友善的回复…
发表回复
qldsrx 2013-05-14
  • 打赏
  • 举报
回复
不要把SqlConnection上升到全局的级别,那样多线程操作时会出现意想不到的问题。一个SQLHelper拥有自己的SqlConnection是可以的,但是多个SQLHelper共享同一个SqlConnection肯定有问题,你不能保证他们都在同一个线程中工作。
  • 打赏
  • 举报
回复
不要把SqlConnection上升到类的级别,这样会存在各种隐患。 一定要在方法中随时用随时创建和销毁。 你可以参考我写的这个类: http://www.cnblogs.com/lifeil/archive/2013/04/16/3024161.html
acxw 2013-05-14
  • 打赏
  • 举报
回复
如果用 MSSQL 的话,加上 EntLib 中 DBApplicationBlock 的 DBFactory ,就简单很多了!还能直接用 DBApplicationBlock 的其他方法。要加 事务之类 都简单很多!
风之影子 2013-05-14
  • 打赏
  • 举报
回复
试想:如果所执行的SQL需要参数,你的接口如果满足,难不成你直接拼好的SQL给接口方法吗(注意SQL注入)?
EEEEEERROR 2013-05-14
  • 打赏
  • 举报
回复
引用 11 楼 u010618295 的回复:
[quote=引用 9 楼 yuyang00000 的回复:] [quote=引用 4 楼 forever_code 的回复:] 不要把sqlconnection 共享, 你可以把 连接字符串共享.
+1[/quote] 请用这个帮助我改改,谢谢!![/quote] 网上百度 微软DbHelp类 . 有现成的 . 看了你这个数据访问操作底层类 . 建议你 把连接字符穿共享. 每个sqlconnection 最好在每一个方法中就得释放.每个方法有独自的sqlconnection.
sjrw96004 2013-05-13
  • 打赏
  • 举报
回复
connection对象最好不要一直打开 应该在在需要的时候打开,一但数据库操作完毕,立即关闭,释放资源
小陆铃铃 2013-05-13
  • 打赏
  • 举报
回复
public static string ConnectionString = ConfigurationManager.AppSettings["ConnectionString"]; using (SqlConnection connection = new SqlConnection(ConnectionString)) { using (SqlCommand scom = new SqlCommand(sql, connection)) { try { connection.Open(); int rows = scom.ExecuteNonQuery(); return rows; } catch (SqlException ex) { connection.Close(); throw ex; } } }
小陆铃铃 2013-05-13
  • 打赏
  • 举报
回复
引用 14 楼 qldsrx 的回复:
写个基础方法,把SqlConnection作为参数传递进去,确保通用性。然后再写个扩展方法,方法内创建新的SqlConnection并调用基础方法。这样的好处是,如果想偷懒少写个连接参数,就用扩展方法,而如果想保持事务或提高性能,用同一个连接做多个操作,就自己创建SqlConnection,调用基础方法。
我这样写公用它 不对吗???? 请大师改改! public static SqlConnection GetDBconnection { get { if (scon == null) { scon = new SqlConnection(ConnectionString); try { scon.Open(); } catch (Exception) { } } else switch (scon.State) { case ConnectionState.Closed: scon.Open(); break; case ConnectionState.Broken: scon.Close(); scon.Open(); break; } return scon; } }
qldsrx 2013-05-13
  • 打赏
  • 举报
回复
写个基础方法,把SqlConnection作为参数传递进去,确保通用性。然后再写个扩展方法,方法内创建新的SqlConnection并调用基础方法。这样的好处是,如果想偷懒少写个连接参数,就用扩展方法,而如果想保持事务或提高性能,用同一个连接做多个操作,就自己创建SqlConnection,调用基础方法。
渃水 2013-05-13
  • 打赏
  • 举报
回复
我也是新手,一般这么写,大家互相学习!
    public class Date
    {
        string constr = string.Format("Data Source=   ;Initial Catalog=  ;User Id=  ;Password=  ;");
        ///执行数据库操作
        #region
        /// <summary>
        /// 执行一般SQL操作
        /// </summary>
        /// <param name="sql">SQL语句</param>
        /// <returns>影响行数</returns>
        public bool ExecuteSql(string sql)
        {
            try
            {
                SqlConnection sqlcon = new SqlConnection(constr);
                SqlCommand command = new SqlCommand(sql, sqlcon);
                sqlcon.Open();
                int resulr = command.ExecuteNonQuery();
                sqlcon.Close();
                sqlcon.Dispose();
                if (resulr > 0)
                    return true;
                else
                    return false;
            }
            catch (System.Exception ex)
            {
                throw ex;
            }
        }
        /// <summary>
        /// 执行获取数据集的操作
        /// </summary>
        /// <param name="sql">SQL语句</param>
        /// <returns>数据集</returns>
        public DataSet GetData(string sql)
        {
            try
            {
                SqlConnection sqlcon = new SqlConnection(constr);
                SqlCommand cmd = new SqlCommand(sql, sqlcon);
                sqlcon.Open();
                SqlDataAdapter adapter = new SqlDataAdapter(cmd);
                DataSet ds = new DataSet();
                adapter.Fill(ds, "Table");
                sqlcon.Close();
                sqlcon.Dispose();
                return ds;
            }
            catch (System.Exception ex)
            {
                throw ex;
            }
        }
}
City_member 2013-05-13
  • 打赏
  • 举报
回复
尽量不要用的时候关闭吧
小陆铃铃 2013-05-13
  • 打赏
  • 举报
回复
引用 9 楼 yuyang00000 的回复:
[quote=引用 4 楼 forever_code 的回复:] 不要把sqlconnection 共享, 你可以把 连接字符串共享.
+1[/quote] 请用这个帮助我改改,谢谢!!
小陆铃铃 2013-05-13
  • 打赏
  • 举报
回复
/// <summary> /// 执行语句 /// </summary> /// <param name="sql"></param> /// <returns></returns> public int ExecuteSql(string sql) { using (SqlCommand scom = GetComm(sql)) { using(scom.Connection) { scom.Connection.Open(); int result = Convert.ToInt32(scom.ExecuteNonQuery()); return result; } } } 不需要关闭 Connection();
渃水 2013-05-10
  • 打赏
  • 举报
回复
引用 4 楼 forever_code 的回复:
不要把sqlconnection 共享, 你可以把 连接字符串共享.
+1
下雪的雨 2013-05-10
  • 打赏
  • 举报
回复
引用 7 楼 wangchuanhu0502 的回复:
我电脑上面有两个系统这个系统没有装工具 按你的代码 直接修改的 public class DbHelper { privatestatic string ConnectionString = System.Configuration.ConfigurationManager.AppSettings["ConnectionString"]; //可以直接封装SqlCommand public SqlCommand GetComm(string sql) { SqlCommand comm = new SqlCommand(); comm.CommandText = sql; comm.Connection = new SqlConnection(ConnectionString); return comm; } /// <summary> /// 执行语句 /// </summary> /// <param name="sql"></param> /// <returns></returns> public int ExecuteSql(string sql) { using (SqlCommand scom = GetComm(sql)) { using(scom.Connection) { scom.Connection.Open(); int result = Convert.ToInt32(scom.ExecuteNonQuery()); return result; } } } /// <summary> /// 返回记录 /// </summary> /// <param name="sql"></param> /// <returns></returns> public DataTable Getdatatable(string sql) { try { DataSet ds = new DataSet(); ds.CaseSensitive = false; using (SqlCommand scom = GetComm(sql)) { SqlDataAdapter sda = new SqlDataAdapter(scom); sda.Fill(ds); sda.Dispose(); return ds.Tables[0]; } } catch (SqlException ex) { throw ex; } } } 基本上再往后面添加方法都是一样的,传递给GetComm()方法一个sql语句就可以了
不好意思啊 写掉了一个参数
下雪的雨 2013-05-10
  • 打赏
  • 举报
回复
我电脑上面有两个系统这个系统没有装工具 按你的代码 直接修改的 public class DbHelper { privatestatic string ConnectionString = System.Configuration.ConfigurationManager.AppSettings["ConnectionString"]; //可以直接封装SqlCommand public SqlCommand GetComm() { SqlCommand comm = new SqlCommand(); comm.CommandText = sql; comm.Connection = new SqlConnection(ConnectionString); return comm; } /// <summary> /// 执行语句 /// </summary> /// <param name="sql"></param> /// <returns></returns> public int ExecuteSql(string sql) { using (SqlCommand scom = GetComm(sql)) { using(scom.Connection) { scom.Connection.Open(); int result = Convert.ToInt32(scom.ExecuteNonQuery()); return result; } } } /// <summary> /// 返回记录 /// </summary> /// <param name="sql"></param> /// <returns></returns> public DataTable Getdatatable(string sql) { try { DataSet ds = new DataSet(); ds.CaseSensitive = false; using (SqlCommand scom = GetComm(sql)) { SqlDataAdapter sda = new SqlDataAdapter(scom); sda.Fill(ds); sda.Dispose(); return ds.Tables[0]; } } catch (SqlException ex) { throw ex; } } } 基本上再往后面添加方法都是一样的,传递给GetComm()方法一个sql语句就可以了
青木龙殿下 2013-05-09
  • 打赏
  • 举报
回复
/// <summary> /// SQLServer 帮助类 /// </summary> public class SQLHelper { //定义对象 private SqlConnection conn = null; private SqlCommand cmd = null; private SqlDataAdapter sda = null; private DataSet ds = null; //定义连接字符串 private string connStr = "server=.;database=MyMemoDB;uid=sa;pwd=123456"; /// <summary> /// 得到所有备忘录 /// </summary> /// <returns>备忘录DataSet</returns> public DataSet SearchAll(string sql) { try { using (conn = new SqlConnection(connStr)) { //打开 conn.Open(); //创建命令对象 cmd = new SqlCommand(sql,conn); //创建适配器 sda = new SqlDataAdapter(cmd); //创建数据集 ds = new DataSet(); //填充 sda.Fill(ds); return ds; } } catch (Exception ex) { throw new Exception(ex.Message); } finally { conn.Close(); } } } 这只是我一般写的一个简单的例子。。
EEEEEERROR 2013-05-08
  • 打赏
  • 举报
回复
不要把sqlconnection 共享, 你可以把 连接字符串共享.
小陆铃铃 2013-05-08
  • 打赏
  • 举报
回复
因为在你执行一个查询语句的同时,如果想更新数据库的话,全局公用一个sqlconnection,会报错的。 是不是因为查询没有关闭,会使更新报错!!! 不定义公用全局的话, 每个上面加 using(sqlconnection conntion =new sqlconnection(ConnectionString)) { } 那我这个定义就可以不要了 public static SqlConnection GetDBconnection { } 请帮助看看怎么改了,感谢!
niss 2013-05-08
  • 打赏
  • 举报
回复
加油 1
加载更多回复(1)

110,566

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧