一、程序中的小数据库: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对象中
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];
- }
- }
- }
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请
点击举报。