ADO.NET技术-SqlHelper的使用
在c#应用程序访问数据库的时候,每一次访问都需写一些代码来实现,这时候,如果将这些代码封装成一个类,访问的时候,只需要调用类的方法,就可以轻松实现对数据库的访问,避免了写大量重复的代码,从而优化了程序。
但是,封装成一个类,脱离了该应用程序,或者该项目,这个类还需要重新写一次。所以,将这个类写在一个程序集中,其他项目或者程序使用的时候,只需要将该程序集的.dll文件拷贝到项目下(c#反射),就可以使用该类。
1、添加一个类库
在解决方案中,添加一个类库,例名common,默认会生成一个Class1类,然后将该类删除,添加一个新类,例名为SqlHelper.cs
2、SqlHelper类
(1)添加引用:System.Configuration //common下的引用,右键添加引用,在框架中添加对System.Configuration的引用
作用:因为访问数据库需要数据库的用户名还有密码,而不同应用程序所运用的数据库不同,数据库的连接字符串也就不同,如果每次应用都要修改dll文件,显然是不合理的,只需要在每个应用程序的App.config文件中写连接字符串即可。
而引用System.Configuration目的就是为了拿到连接字符串。
(2)导入命名空间
using System.Configuration; //添加引用后需要导入命名空间 using System.Data; using System.Data.SqlClient;
(3)连接字符串
private static string strCon=ConfigurationManager.ConnectionStrings["strCon"].ConnectionString; //其中:["strCon"]中的名字,为要使用这个文件的应用程序AppConfig中写的连接字符串名。
(4)ExcuteScalar()方法: 对数据进行查询,返回首行首列(object类型)
public static object ExcuteScalar(string sql,params SqlParameter[] param) { object o=null; using(SqlConnection con = new SqlConnection(strCon)) { using(SqlCommand cmd= new SqlCommand(sql,con)) { con.Open(); cmd.Parameter.AddRange(param); //添加参数(可变参数); o=cmd.ExcuteScalar(); } } return o; }
(5)ExcuteDataTable()方法:对数据进行查询,返回一个临时数据表(DataTable类型)
public static DataTable ExcuteDataTable(string sql,params SqlParameter[] param) { DataTable dt= new DataTable(); //创建一张表 using(SqlConnection con = new SqlConnection(strCon)) { using(SqlDataAdapter adapter = new SqlDataAdapter(sql,con)) { adapter.SelectCommand.Parameters.AddRange(param); //添加参数 adapter.Fill(dt); } } return dt; }
(6)ExcuteReader()方法: 对数据进行查询,返回SqlDataReader对象(SqlDataReader类型)
//错误方法:因为SqlDataReader一直要保持与服务器的连接,用using后会把连接通道关闭 //public static SqlDataReader ExcuteReader(string sql, params SqlParameter[] param) //{ // SqlDataReader reader = null; // using (SqlConnection con = new SqlConnection(strCon)) // { // using (SqlCommand cmd = new SqlCommand(sql, con)) // { // con.Open(); // cmd.Parameters.AddRange(param); // reader = cmd.ExcuteReader(); // } // } // return reader; //} //正确方法: public static SqlDataReader ExcuteReader(string sql, params SqlParameter[] param) { SqlDataReader reader = null; SqlConnection con = new SqlConnection(strCon); using (SqlCommand cmd = new SqlCommand(sql,con)) { con.Open(); //添加参数 cmd.Parameters.AddRange(param); if (con.State == ConnectionState.Closed) { con.Open(); } reader = cmd.ExecuteReader(); } return reader; }
(7)ExcuteNonQuery() 对数据进行增删改,返回受影响的行数(int类型)
public static int ExcuteNonQuery(string sql,param SqlParameter[] param) { int n=-1; using(SqlConnection con = new SqlConnection(strCon)) { using(SqlCommand cmd= new SqlCommand(sql,con)) { con.Open(); cmd.Parameter.AddRange(param); n=cmd.ExcuteNonQuery(); } } return n; }
PS:这样,SqlHelper类就写完。然后生成common。注意问题:需要把这个类设置为公开的,也就是添加public。之所以使用静态方法,在应用程序中使用不需要创建对象,也就是不用实例化对象,提高使用效率。使用只需类名.方法名
3、使用
(1)添加.dll文件
common程序集生成后,右键:在程序资源管理器中打开文件夹,找到Common\bin\Debug目录下的Common.dll文件,拷贝到要使用SqlHelper的应用程序同样目录下(bin\Debug),然后在应用程序中,导入using Common;命名空间。
(2)连接字符串
在应用程序App.config配置文件的 Configuration标签内添加:
<connectionStrings> <add name="strCon" connectionString="Data Source=.; Initial Catalog=DBName; User ID=sa;Password=123"/> </connectionStrings> //这种方法是使用数据库的用户名以及密码登录,DBName是要使用的数据库名(根据要使用的数据库),Password为登录数据库用的密码
(3)ExcuteScalar()方法: 对数据进行查询,返回首行首列(object类型)的使用:
SqlParameter[] p={ new Parameter("@name",name), //参数添加方法1(根据实际,如果不用参数,则不添加) //参数作用:避免被注入数据库漏洞 new Parameter("@id",id) }; object o=SqlHelper.ExecuteScalar(sql,p); //返回查询到的首行首列 //类名.方法名 //sql为要使用的sql语句(string)
(4)ExcuteDataTable()方法:对数据进行查询,返回一个临时数据表(DataTable类型)的使用:
SqlParameter p1= new SqlParameter("@id",id); //参数添加方法2 SqlParameter p2=new SqlParameter("@name",name); DataTable dt=SqlHelper.ExcuteDataTable(sql,p1,p2); //遍历dt中所有的行,获取数据(有些时候直接和某些控件数据绑定) foreach(DataRow dr in dt.Rows) { //当数据库中出现空值时,转换会报错,所以,要进行非空判断 if(dr["id"]!=DBNull.value) { ID=Convert.ToInt32(dr["id"]); } if(dr["name"]!=DBNull.value) { Name=dr["name"].ToString(); } }
(5)ExcuteReader()方法: 对数据进行查询,返回SqlDataReader对象(SqlDataReader类型)的使用:
using (SqlDataReader reader = SqlHelper.ExcuteReader(sql)) { if (reader.HasRows) { while (reader.Read) { //循环一次,就意味着读取到了一条数据 //同样,数据中出现null值,会报错,需要进行判断 if (reader[0] != DBNull.value) { id = Convert.ToInt32(reader[0]); } if (reader["name"] != DBNull.value) { name = reader["name"].Tostring(); } } //之中的[0]是通过列的索引来获取 ,name是通过列名来获取 } }
(6)ExcuteNonQuery() 对数据进行增删改,返回受影响的行数(int类型)的使用:
int r=SqlHelper.ExcuteNonQuery(sql,p); if(r>0) { Console.WriteLine("增删改成功!"); }
4、常见问题:
(1)SqlHelper要添加public为公开类
(2)修改SqlHelper中代码时,要重新生成.dll文件,然后重新覆盖一次
(3)命名空间要导入
(4)通过客户端应用程序去连接数据库,数据库管理工具可以不开,但是数据库服务必须打开
(5)使用正确的sql语句
(6)连接字符串要正确,可以先在服务器资源管理器中连接数据库,按f4打开属性,然后复制连接字符串。
结:虽然 流程比较多,但是使用中带来极大的方便。有待该进