---------------------- Windows Phone 7手机开发、.Net培训、期待与您交流! ----------------------
深入了解DataSet
DataSet概述
数据集概述
1、数据集
是一种代表关系数据的内存驻留结构
2、数据集分类
–类型化数据集
–非类型化数据集
3、类型化数据集和非类型化数据集的区别
DataSet类型 | 结构体系 | 功能 | 类型检测 |
类型化数据集 (强类型DataSet) | 类型化数据集这样一种数据集,它先从基DataSet 类派生,然后使用XML 架构文件(.xsd 文件)中的信息生成新类。架构中的信息(表、列等)被作为一组第一类对象和属性生成并编译为此新数据集类 | 可以直接通过名称引用表和列 | 在VS.NET中可以智能感知元素的类型 |
非类型化数据集 (弱类型DataSet) | 非类型化数据集没有相应的内置架构。与类型化数据集一样,非类型化数据集也包含表、列等,但它们只作为集合公开。 | 需要通过 Tables集合引用列 | 不能感知 |
DataSet架构
• DataSet 架构是表、列和关系的集合
• 每个DataSet实例都包含一个架构
有以下四种方法可以定义DataSet架构:
1. 直接使用DataSet API来创建DataTable,
DataColumn,DataRelation
2. 通过一个DataAdapter类,使用数据库元数据来推
断出架构。
3. 使用XSD定义需要的DataSet架构,并用
DataSet.ReadXmlSchema将架构定义载入
DataSet
4. 使用DataSet.InferXmlSchema。根据一个XML文
档,DataSet类将使用一系列机构推理规则来推断
一个DataSet架构
弱类型Dataset Adapter
利用类的方式,进Dataset的连接语句进行封装定义了一个SQLhelpr的类
/// <summary> /// 此方法适用于数据库中的更新,插入,删除操作 /// </summary> /// <param name="sql">在主函数里的SQL语句,参数</param> /// <param name="parameters">主函数中第二个参数的传递参数</param> /// <returns>受影响的行数</returns> /// SQLHelper.ExecuteNonQuery("update Users Set ErrorTimes =0 where Users = @Users ", new SqlParameter("Users", this.txtUserName.Text)); public static int ExecuteNonQuery(string sql, params SqlParameter[] parameters)
{ string connStr = ConfigurationManager.ConnectionStrings["ConnStr"].ConnectionString;//应用App.Config 配置应用程序 using (SqlConnection conn = new SqlConnection(connStr))//实例化一个数据库连接,并调用App.Config 配置应用程序中的数据库连接 { conn.Open();//打开数据库的连接,类似于把某条封闭的路,把闸门打开
using (SqlCommand cmd = conn.CreateCommand())//创建一个SqlCommand 的类,对数据库执行一个Trascat-SQL语句,利用conn去连接这个数据库。 { cmd.CommandText = sql;//获取对数据库执行Transat-SQL语句。sql 为传递参数 sql
foreach (SqlParameter parameter in parameters)//第二个传递参数组 { cmd.Parameters.Add(parameter);//添加单一的第二个传递参数 } return cmd.ExecuteNonQuery();//返回受影响的行数 } } }
/// <summary> /// 返回值为第一行,第一列的值 /// </summary> /// <param name="sql">在主函数里的SQL语句,参数</param> /// <param name="parameters">主函数中第二个参数的传递参数</param> /// <returns>返回值为第一行,第一列的值</returns> public static object ExecuteSalcar(string sql, params SqlParameter[] parameters) { string connStr = ConfigurationManager.ConnectionStrings["ConnStr"].ConnectionString; using (SqlConnection conn = new SqlConnection(connStr)) { conn.Open(); using (SqlCommand cmd = conn.CreateCommand()) { cmd.CommandText = sql; foreach (SqlParameter parameter in parameters) { cmd.Parameters.Add(parameter); } return cmd.ExecuteScalar(); } }
}
/// <summary> /// DataSet的封装。 /// 将数据库中数据调用到DataTable中(内存),适用于小数据的操作 /// </summary> /// <param name="sql">在主函数里的SQL语句,参数</param> /// <param name="parameters">主函数中第二个参数的传递参数</param> /// <returns>返回值 为Tables中的第O列</returns> public static DataTable DataTable(string sql, params SqlParameter[] parameters) { string connStr = ConfigurationManager.ConnectionStrings["ConnStr"].ConnectionString; using (SqlConnection conn = new SqlConnection(connStr)) { conn.Open(); using (SqlCommand cmd = conn.CreateCommand()) { cmd.CommandText = sql; foreach (SqlParameter parameter in parameters) { cmd.Parameters.Add(parameter);//此代码类似于 cmd.Parameters.Add(new SqlParameters("Users",this.TextBox1.text)); //"update Users Set ErrorTimes =0 where Users = @Users ", new SqlParameter("Users", this.txtUserName.Text)); } DataSet dataset = new DataSet(); SqlDataAdapter adapter = new SqlDataAdapter(cmd); adapter.Fill(dataset); return dataset.Tables[0];//第一个数据集表 } } }
调用SQLHelper类中的ExecuteSalcar方法
int Number=(int)SQLHelper.ExecuteSalcar("select count(*) from Users where Users = @Users and Password= @Password", new SqlParameter("Users", this.textBox1.Text), new SqlParameter("Password", this.textBox2.Text));//传参 if (this.textBox1.Text == "" || this.textBox2.Text == "") { MessageBox.Show("请输入用户名、密码!"); return; } MessageBox.Show("您查找的用户为:"+Number);
调用SQLHelper类中的ExecuteNonQuery方法
//假设数据库中不存在重复用户名! int i = SQLHelper.ExecuteNonQuery("insert into Users (Users , Password) values (@Users,@Password)", new SqlParameter("Users", this.textBox1.Text), new SqlParameter("Password", this.textBox2.Text));//调用SQLHelper类中ExecuteNonQuery方法,进行传参数的过程, i 为接受这个cmd.ExecuteNonQuery()的返回值 MessageBox.Show("插入成功!"); MessageBox.Show("受影响的行数为:" + i);
调用SQLHelper类中的DataTable的方法,通过传递参数的方式将DataTable方法中的得到的结果,再传递回来。
DataTable table = SQLHelper.DataTable("Select * from Users where Users = @Users OR Password= @Password", new SqlParameter("Users", this.textBox1.Text), new SqlParameter("Password", this.textBox2.Text)); for (int i = 0; i < table.Rows.Count; i++) { DataRow row = table.Rows[i]; string name = Convert.ToString(row["Users"]); MessageBox.Show(name); }
没有利用封装方法进行数据的更新
string connStr = ConfigurationManager.ConnectionStrings["ConnStr"].ConnectionString;//调用App.config using (SqlConnection conn = new SqlConnection(connStr)) { conn.Open(); using (SqlCommand cmd = conn.CreateCommand()) { cmd.CommandText = "select * from Users"; DataSet dataset = new DataSet(); SqlDataAdapter adapter = new SqlDataAdapter(cmd); adapter.Fill(dataset); DataTable table = dataset.Tables[0]; DataRow row = table.Rows[0]; row["Users"] = this.textBox1.Text;//此方法赋值修改,只会修改原本在DataSet 中Table数据集表中的数据,不会修改数据库中的数据。 //adapter.Update();对DataSet的修改都是在内存中,没有提交到数据库中 SqlCommandBuilder builder = new SqlCommandBuilder(adapter); adapter.Update(dataset);//要求SqlCommandBuilder 的必须设有主键!不然会报错!报错内容:对于不返回任何键列信息的 SelectCommand,不支持 UpdateCommand 的动态 SQL 生成。原因是因为数据库中,你没有设置主键
强类型DataSet的使用
定义一个名为TT_Person的的强类型DataSet数据集
自动帮忙我们调用的SQL查询语句
当我们定义一个DataSet数据集后,系统会自动帮我们生成一个App.config的文件,内容为打开数据库的连接语句
我们在主函数里写代码时,要添加几个命名空间
TT_PersonTableAdapter adapter = new TT_PersonTableAdapter();//TT_PersonTableAdapter 是独立的一个类 DataSet学习.TT_PersonDataSet.TT_PersonDataTable persons = adapter.GetData();//将得到的数据 给了TT_PersonDataSet下的TT_PersonDataTable中 TT_PersonDataTable 是在DataSet学习.TT_PersonDataSet 底下的一个类 所以 ,前面要加上命名空间 for (int i = 0; i < persons.Count;i++ ) { DataSet学习.TT_PersonDataSet.TT_PersonRow person = persons[i];//类内部的类 的 引用 要加namespace+上级的类名+本级的类名 string msg = string.Format("姓名:{0},年龄:{1}",person.Name,person.Age); MessageBox.Show(msg); } persons[0].Name = "WHITE"; adapter.Update(persons);
这样我们就完成了一个强类型DataSet版的数据插入!
---------------------- Windows Phone 7手机开发、.Net培训、期待与您交流! ----------------------
详细请查看:http://net.itheima.com/