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打开属性,然后复制连接字符串。

 

:虽然 流程比较多,但是使用中带来极大的方便。有待该进

  

 

posted @ 2017-08-07 12:52  蓝色标记  阅读(1020)  评论(0编辑  收藏  举报