C#进阶ADO.NET基础二 DataSet、配置文件、SqlHelper

来源:互联网 发布:刀剑乱舞胁差极化数据 编辑:程序博客网 时间:2024/05/16 01:58

一、程序中的小数据库:DataSet

上一篇讲过的SqlDataReader的数据库查询结果并不是放到程序中的,而是放在数据库服务器中,SqlDataReader只是相当于放了一个指针(游标),

只能读取当前游标指向的行,一旦数据库断开就不能再读取,这样的好处在于程序不占内存。

而对于数据库来说,会给服务器带来压力,查询结果在服务器中,并且一直再连接状态,所以ADO.NET中提供了数据集的机制,

将查询结果填充到本地内存的小数据库对象中,这样断开数据库后,也不影响数据的读取

 

数据量大时,最好不要用DataSet,因为会很占程序内存。小数据量用DataSet,大数据量用SqlDataReader

DataSet的好处,降低数据库压力、提高效率、简化编程、优化数据库连接,提高安全性。

用法:

1、创建SqlDataAdapter对象,将SqlCommand命令对象作为参数。SqlDataAdapter类作用:将命令对象执行的SQL结果填充到DataSet对象中

//SqlDataReader是一个帮我们把SqlCommand执行结果填充到DataSet中                    SqlDataAdapter adapter = new SqlDataAdapter(cmd);

2、创建一个DataSet对象

DataSet ds = new DataSet();

3、调用SqlDataAdapter对象的Fill()方法,将SQL执行结果填充到DataSet对象中

adapter.Fill(ds);

4、调用DataSet对象的Table属性,返回一个数据表类DataTable的对象集合,并通过下标可以获得相应的数据表

DataTable table = ds.Tables[0];

注意:一般来说查询过程都是在一个数据表中进行,所以查询结果一把只有一个表,用下标0即可获得该查询结果

5、调用数据表对象的Rows属性,返回一个数据行类DataRowCollection的对象集合

DataRowCollection rows = table.Rows;  //获得所有行集合

6、通过循环,可以逐一读取数据库中的内容。

for (int i = 0; i < rows.Count; i++)                    {                        DataRow row = rows[i];                        string name = (string)row["Name"];                        int age = (int)row["Age"];                        MessageBox.Show(name + "\t" + age.ToString());                    }


二、将连接字符串写到配置文件中

用处:方便管理并提高数据库安全性

用法:

1、新建一个配置文件:

项目---右键---添加---新建项----选“应用程序配置文件”---生成“app.config”文件---在文件中添加一个<connectionStrings>节点----将连接字符串放入标签中,并给该标签命名

<configuration>  <connectionStrings>    <add name="dbConnStr" connectionString="Data Source=.;Initial Catalog=MyTest;Persist Security Info=True;User ID=sa;Password=123"/>  </connectionStrings></configuration>

2、在项目中添加引用:

引用--右键---添加引用---程序集----选择:System.Configuration---引入成功---在主程序中引入命名控件:

using System.Configuration;

3、在主程序中定义一个全局string变量,并通过System.Configuration下的ConfigurationManager给string变量赋值

赋值方法:

string strConn = ConfigurationManager.ConnectionStrings["dbConnStr"].ConnectionString;

从而取得连接字符串



三、封装自己的SqlHelper :

封装方法的原则:把不变的放到方法里,把变化的放到参数中

好处:简化数据库操作、提高数据库效率

用法:

1、新建一个类SqlHelper

定义一个静态字符串变量:读取配置文件中的数据库连接字符串:

private static string connStr = ConfigurationManager.ConnectionStrings["dbConnStr"].ConnectionString;

2、重写ExecuteNonQuery方法,让主程序可以直接调用执行SQL语句

public static int ExecuteNonQuery(string sql,params SqlParameter[] pars)        {            using (SqlConnection conn = new SqlConnection(connStr))            {                conn.Open();                using (SqlCommand cmd = conn.CreateCommand())                {                    cmd.CommandText = sql;                                       cmd.Parameters.AddRange(pars);                    return cmd.ExecuteNonQuery();                }            }        }

3、重写ExecuteScalar方法,让主程序可以直接调用执行SQL语句:

public static object ExecuteScalar(string sql, params SqlParameter[] pars)        {            using (SqlConnection conn = new SqlConnection(connStr))            {                conn.Open();                using (SqlCommand cmd = conn.CreateCommand())                {                    cmd.CommandText = sql;                    cmd.Parameters.AddRange(pars); //读取pars                    return cmd.ExecuteScalar();                }            }        }


4、重写ExecuteDataSet方法,让主程序可以直接调用执行SQL语句:

public static DataSet ExecuteDataSet(string sql, params SqlParameter[] pars)        {            using (SqlConnection conn = new SqlConnection(connStr))            {                conn.Open();                using (SqlCommand cmd = conn.CreateCommand())                {                    cmd.CommandText = sql;                    cmd.Parameters.AddRange(pars);                    DataSet ds = new DataSet();                    SqlDataAdapter adapter = new SqlDataAdapter(cmd);                    adapter.Fill(ds);                    return ds;                }            }        }


5、因查询数据库一般在一个数据表中完成,所以返回的DataSet一般也只有一个表,可以将ExecuteDataSet简化成ExecuteDataTable:

public static DataTable ExecuteDataTable(string sql, params SqlParameter[] pars)        {            using (SqlConnection conn = new SqlConnection(connStr))            {                conn.Open();                using (SqlCommand cmd = conn.CreateCommand())                {                    cmd.CommandText = sql;                    cmd.Parameters.AddRange(pars);                    DataSet ds = new DataSet();                    SqlDataAdapter adapter = new SqlDataAdapter(cmd);                    adapter.Fill(ds);                    return ds.Tables[0];                }            }        }



 


 

 


 


 

 

 

 

 

 


 

0 0
原创粉丝点击