黑马训练营-深入了解DataSet

来源:互联网 发布:php字符串处理函数 编辑:程序博客网 时间:2024/06/05 14:49
---------------------- 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,DataRelation2. 通过一个DataAdapter类,使用数据库元数据来推断出架构。3. 使用XSD定义需要的DataSet架构,并用DataSet.ReadXmlSchema将架构定义载入DataSet4. 使用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/