不管什么项目基本都不能避免对频繁的对数据库进行操作。如果直接在代码中操作,不仅会导致代码里面夹杂着太多的SQL语句,影响代码的可读性,还会因为创建太多变量影响程序运行性能。基于MVC编程思想,对数据库的操作应该与控制逻辑的代码分离。
这时我们可以把相对应的,需要大量重复使用的代码封装到一个帮助类里--数据库帮助类。在这个类里,我们只需要实例化一次SqlConnection,就可以在程序关闭前重复使用该类里面的所有方法。
/// <summary> /// 数据库帮助类 /// </summary> public class SqlHelpClass { //这个字符串是连接字符串,包含着数据库的信息 static string strSql = "server=SC-201802111806; uid=sa; pwd=123456; database=posDB"; static SqlConnection sqlConnection; static SqlCommand cmd; static SqlHelpClass() { sqlConnection = new SqlConnection(strSql);//创建一个数据库连接实例(实例就是对象) //对这个类SqlConnection作用不明白的可以把鼠标放到类名可以显示微软对类给出的说明 sqlConnection.Open();//打开连接 cmd = new SqlCommand();//创建一个查询实例 //SqlConnection就像路,我们创建SqlConnection实例时就打通了连通数据库的一条路,SqlCommand就是信使, //我们每次要对数据库发出指令时,SqlCommand对象就可以帮我们把这个指令送到数据库,然后再把我们需要的数据传回来。 cmd.Connection = sqlConnection;//设置数据库连接,就是给信使指一条路 } /// <summary> /// 对连接执行SQL语句并返回受影响行数 /// </summary> /// <param name="sql">数据库操作命令语句</param> /// <returns>受影响的行数</returns> public static int ExecuteNonQuery(string sql) { cmd.CommandText = sql.ToString();//设置要执行的数据库命令,就是你得把信给信使 return cmd.ExecuteNonQuery();//返回受影响的行数,cmd.ExecuteNonQuery()在这里相当于执行命令:你给我把信送过去。 //如果没有cmd.ExecuteNonQuery(),那么命令是不会执行的。 } /// <summary> /// 返回查询结果集的第一行第一列的值 /// </summary> /// <returns>查询结果第一行第一列的值</returns> public static object ExecuteScalar(string sql) { cmd.CommandText = sql; return cmd.ExecuteScalar(); } /// <summary> /// 向数据库发送新增命令 /// </summary> /// <param name="tableName">数据表名称</param> /// <param name="list">数据集合</param> /// <returns>受影响行数</returns> public static int AddData( string tableName,params object[] list) { StringBuilder addSql = new StringBuilder(); addSql.Append("insert into "); addSql.Append (tableName); addSql.Append(" values("); for (int i = 0; i < list.Length; i++) { if (i == list.Length - 1) { if (list[i].GetType() == Type.GetType("int") || list[i].GetType() == Type.GetType("float") || list[i].GetType() == Type.GetType("double")) addSql .Append(list[i].ToString() + ")"); else addSql.Append("\‘" + list[i] + "\‘)"); break; } if (list[i].GetType() == Type.GetType("int") || list[i].GetType() == Type.GetType("float") || list[i].GetType() == Type.GetType("double")) addSql.Append(list[i].ToString() + ","); else addSql.Append("\‘" + list[i]+"\‘,"); } cmd.CommandText = addSql.ToString();//设置要执行的数据库命令,就是你得把信给信使 return cmd.ExecuteNonQuery();//返回受影响的行数,cmd.ExecuteNonQuery()在这里相当于执行命令:你给我把信送过去。 //如果没有cmd.ExecuteNonQuery(),那么命令是不会执行的。 } /// <summary> /// 向数据库发送删除命令 /// </summary> /// <param name="tableName">数据表名称</param> /// <param name="where">条件</param> /// <returns>受影响行数</returns> public static int DeleteDate(string tableName,string where) { string deleteSql = "delete from "+tableName+ " where =" + where; cmd.CommandText = deleteSql; return cmd.ExecuteNonQuery(); } /// <summary> /// 向数据库发送修改命令 /// </summary> /// <param name="tableName">表名</param> /// <param name="strUpdata">修改信息(列名=表达式)</param> /// <param name="where">条件</param> /// <returns>受影响行数</returns> public static int UpdateData(string tableName,string strUpdata,string where) { string updateSql = "update "+tableName+ " set " + strUpdata + " where " + where; cmd.CommandText = updateSql; return cmd.ExecuteNonQuery(); } }
我的类里面只是简单的写了几个增删改查的操作,如果到了实际工作中, 肯定会有不同的需求,这时可以在类里面增添方法以适应需求。
我把实例化SqlConnection的代码写在了一个静态构造函数里。
静态构造函数:初始化类的静态数据成员
仅在类被加载时执行一次
不允许使用访问修饰符
写在静态构造函数里,只要在其他类里出现SqlHelpClass,数据库帮助类类名,那么SqlHelpClass就算被加载了,不需要实例化就创建好了对数据库的连接。而里面的方法都是静态方法,全部都可以类名点方法名(例:SqlHelpClass.ExecuteNonQuery())就可以实用,重头到尾都不需要实例化SqlHelpClass。
原文:https://www.cnblogs.com/xwzLoveCshap/p/11540788.html