华为云计算 云知识 C#学习笔记之数据库帮助类

C#学习笔记之数据库帮助类

不管什么项目基本都不能避免对频繁的对数据库进行操作。如果直接在代码中操作,不仅会导致代码里面夹杂着太多的SQL语句,影响代码的可读性,还会因为创建太多变量影响程序运行性能。基于MVC编程思想,对数据库的操作应该与控制逻辑的代码分离。

这时我们可以把相对应的,需要大量重复使用的代码封装到一个帮助类里--数据库帮助类。在这个类里,我们只需要实例化一次SqlConnection,就可以在程序关闭前重复使用该类里面的所有方法。

  

///  /// 数据库帮助类 ///  public class SqlHelpClass { static private string strServer;//数据库服务器地址,就是计算机名称 static private string strUid;//SQLserver用户名称 static private string strPwd;//密码 static private string strDatabaseName;//数据库名称 //属性限制外部只能设置数据库的链接信息 static public string StrServer { set => strServer = value; } static public string StrUid { set => strUid = value; } static public string StrPwd { set => strPwd = value; } static public string StrDatabaseName { set => strDatabaseName = value; } static public string strSql { //这个字符串是连接字符串,包含着数据库的信息,对外部只提供信息不能修改 get { return   strServer + ";" + strUid + ";" + strPwd + ";" + strDatabaseName; } } static SqlConnection sqlConnection; static SqlCommand cmd; static SqlHelpClass() { //静态构造函数,如果你需要给数据库信息设置默认值 strServer = ""; strUid = ""; strPwd = ""; strDatabaseName = ""; } ///  /// 返回一个数据库连接 ///  ///  public static SqlConnection GetSqlConnection() { sqlConnection = new SqlConnection(); sqlConnection.ConnectionString = strSql; return sqlConnection; } #region 对连接执行SQL语句或存储过程并返回受影响行数 ///  /// 对连接执行SQL语句并返回受影响行数 ///  /// 数据库操作命令语句 /// 受影响的行数 private static int ExecuteNonQueryTypeText(string sql) { sqlConnection = new SqlConnection();//创建一个数据库连接实例(实例就是对象) //对这个类SqlConnection作用不明白的可以把鼠标放到类名可以显示微软对类给出的说明 try { sqlConnection.ConnectionString = strSql;//数据库的信息给到这个连接,
 sqlConnection.Open();//打开连接
 cmd = new SqlCommand();/*创建一个查询实例 *SqlConnection就像路,我们创建SqlConnection实例时就打通了连通数据库的一条路 *SqlCommand就是信使, *我们每次要对数据库发出指令时,SqlCommand对象就可以帮我们把这个指令送到数据库 * 数据库处理完后,再通过SqlCommand把我们需要的数据传回来。*/ cmd.CommandText = sql;//设置要执行的数据库命令,就是你得把信给信使
 cmd.Connection = sqlConnection;//设置查询 return cmd.ExecuteNonQuery();//返回受影响的行数,cmd.ExecuteNonQuery()在这里相当于执行命令:你给我把信送过去。 //如果没有cmd.ExecuteNonQuery(),那么命令是不会执行的。
 } catch (Exception e) { throw e;//抛出异常 //如果不想抛出异常影响程序进行,这里可以不写 //或者返回个-1,然后在使用类里做判断
 } finally { sqlConnection.Close();//关闭数据库连接 //数据库连接一般都是一次查询打开一个连接,查询结束关闭当前连接。 //都已经把主要代码写在帮助类里了就不要想着强行省代码,该写的还得写 //不要想着一个SqlConnection多次共用,防止出现不必要的异常或错误
 } } ///  /// 对连接执行有参数的数据库的存储过程并返回受影响行数 ///  /// 数据库的存储过程的名称 /// SqlParameter集合 /// 受影响行数 private static int ExecuteNonQueryTypeStoredProcedure(string StoredProcedureName, SqlParameter[] sqlParameters) { /*SqlParameter: *例: SqlParameter("@ID",ID) * @ID:就是数据库存储过程的参数 * ID:就是你给这个参数赋的值 * * 要执行存储过程,首先就要给存储过程里边的参数赋值, * 一个SqlParameter可以给一个参数赋值, * 而一个SqlParameter数组可以包含给所有参数赋值的SqlParameter */ sqlConnection = new SqlConnection(); try { sqlConnection.ConnectionString = strSql;//数据库的信息给到这个连接,
 sqlConnection.Open();//打开连接 cmd = new SqlCommand();//创建一个查询实例 cmd.CommandType = CommandType.StoredProcedure;//设置cmd的行为类型 cmd.CommandText = StoredProcedureName;//设置要执行的数据库存储过程的名称 cmd.Connection = sqlConnection;//设置连接 cmd.Parameters.AddRange(sqlParameters);//AddRange方法给cmd的参数添加sqlParameters集合 return cmd.ExecuteNonQuery();//返回结果
 } catch (Exception e) { throw e;//抛出异常
 } finally { sqlConnection.Close();//关闭数据库连接
 } } ///  /// 连接执行无参数的数据库的存储过程并返回受影响行数 ///  /// 数据库的存储过程的名称 /// 受影响行数 private static int ExecuteNonQueryTypeStoredProcedure(string StoredProcedureName) { sqlConnection = new SqlConnection(); try { sqlConnection.ConnectionString = strSql;//数据库的信息给到这个连接,
 sqlConnection.Open();//打开连接 cmd = new SqlCommand();//创建一个查询实例 cmd.CommandType = CommandType.StoredProcedure;//设置cmd的行为类型 cmd.CommandText = StoredProcedureName;//设置要执行的数据库存储过程的名称 cmd.Connection = sqlConnection;//设置连接 return cmd.ExecuteNonQuery();//返回结果
 } catch (Exception e) { throw e;//抛出异常
 } finally { sqlConnection.Close();//关闭数据库连接
 } } ///  /// 对连接执行SQL语句或无参数存储过程并返回受影响行数 ///  /// SQL语句或者无参数存储过程名称 /// 解释命令字符串类型 ///  public static int ExecuteNonQuery(string sqlOrSPname, CommandType commandType) { switch (commandType) { case CommandType.StoredProcedure: return  ExecuteNonQueryTypeStoredProcedure(sqlOrSPname); case CommandType.Text: return ExecuteNonQueryTypeText(sqlOrSPname); default: return ExecuteNonQueryTypeText("select * from "+ sqlOrSPname); } } ///  /// 连接执行有参数存储过程并返回受影响行数 ///  /// 有参数存储过程名称 /// SqlParametes数组 ///  public static int ExecuteNonQuery(string sqlOrSPname, SqlParameter[] sqlParameters) { return ExecuteNonQueryTypeStoredProcedure(sqlOrSPname, sqlParameters); } #endregion ///  /// 返回查询结果集的第一行第一列的值 ///  /// 查询结果第一行第一列的值 public static object ExecuteScalar(string sql) { sqlConnection = new SqlConnection(); try { sqlConnection.ConnectionString = strSql;//数据库的信息给到这个连接,
 sqlConnection.Open();//打开连接 cmd = new SqlCommand();//创建一个查询实例
 cmd.CommandText = sql.ToString();//设置要执行的数据库命令 cmd.Connection = sqlConnection;//设置查询 return cmd.ExecuteScalar();//返回结果
 } catch (Exception e) { throw e;//抛出异常
 } finally { sqlConnection.Close();//关闭数据库连接
 } } #region 查询数据库返回一个DataTable ///  /// 查询数据库表返回一个只读结果集 ///  /// 查询语句 /// DataTable public DataTable GetReadOnlyDataTable(string sql) { sqlConnection = new SqlConnection(); try { sqlConnection.ConnectionString = strSql; cmd = new SqlCommand(sql, sqlConnection);//利用SqlCommand构造函数的重载,可以在实例化时就给相对应得属性赋值 SqlDataReader reader = cmd.ExecuteReader();//根据sql读取数据库表,返回一个只读结果集 DataTable dt = new DataTable();//创建一个DataTable对象 dt.Load(reader);//将读到的结果集填充到DataTable对象  return dt; } catch (Exception e) { throw e;//抛出异常
 } finally { sqlConnection.Close();//关闭数据库连接
 } } ///  /// 查询数据库表返回一个可读写可操作的结果集 ///  ///  ///  public DataTable GetReadWwriteDataTable(string sql) { sqlConnection = new SqlConnection(); try { sqlConnection.ConnectionString = strSql; SqlDataAdapter adapter =new SqlDataAdapter(sql, sqlConnection);//返回一个可读写可操作的结果集 DataTable dt = new DataTable();//创建一个DataTable对象 adapter.Fill(dt);//将结果集填充到DataTable对象  return dt; } catch (Exception e) { throw e;//抛出异常
 } finally { sqlConnection.Close();//关闭数据库连接
 } } #endregion }

静态构造函数:初始化类的静态数据成员

仅在类被加载时执行一次

不允许使用访问修饰符

  写在静态构造函数里,只要在其他类里出现SqlHelpClass,数据库帮助类类名,那么SqlHelpClass就算被加载了,不需要实例化就创建好了对数据库的连接。而里面的方法都是静态方法,全部都可以类名点方法名(例:SqlHelpClass.ExecuteNonQuery())就可以实用,重头到尾都不需要实例化SqlHelpClass。

可以在静态构造函数里给字段赋默认值。

还有一点要注意的是:sqlconnection对象一般都是当次使用,使用完然后关闭。

转载于:https://www.cnblogs.com/xwzLoveCshap/p/11540788.html

上一篇:Leetcode 1213:三个有序数组的交集(超详细的解法!!!)

下一篇:深入理解JavaScript系列(41):设计模式之模板方法

51CTO

CSDN

中国开发者社区CSDN (Chinese Software Developer Network) 创立于1999年,致力为中国开发者提供知识传播、在线学习、职业发展等全生命周期服务。
相关推荐