A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 徐宏伟 中级黑马   /  2012-9-8 17:13  /  1742 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

1、我们在ADO.Net部分,通过ADO.Net技术使得我们的程序可以命令数据库服务器来操作数据库,以便于达到我们的目的(insert、delete、update、select。。。);

2、在使用SqlDataReader对象的时候,我们只是在我们的程序里面通过dataReader.Read()命令游标一下一下的移动,以读取我们想要的数据,这些数据本身是在服务器端的,不在我们本地,
     
     这样在连接断开的情况下就不能操作数据库里面的data了;

3、于是就出现了DataSet,这么一个数据集,这个是存在于我们的程序端的内存里面的;但是操作所谓的“大数据”的时候就会出现问题,因为我们的内存是有限的,我们不能把数据库里面的
      
     所有的数据都读取到我们的内存里面;这样我们的内存会爆掉的;

4、但是DataSet操作的时候会出现很多的缺点,其中之一就是dataset是弱类型的,话说谁能解释下弱类型和强类型之间的区别,越详细越好!!!

【备注】先谢谢了~~~



评分

参与人数 1技术分 +1 收起 理由
郑文 + 1

查看全部评分

3 个回复

倒序浏览
一、弱类型Dataset

      1、自动生成InsertCommand,DeleteCommand....

                        new SqlCommandBuilder(SqlDataAdapter);

      2、涉及到的类

          SqlConnection    与数据库之间的连接。  相当于delphi dbconnection

          SqlCommand     负责向数据库中发送SQL命令           SqlDataReader    负责读取数据集,读取SqlCommand   的执行结果。   

           SqlDataReader    和  SqlCommand   相加相当于DELPHI  中的AdoQuery,AdoDataset,Adocommand,AdoTable等

          SqlDataReader    只可按照查询出来的数据表指针向下读取数据,不可回头,也不可以隔行向上或向下读取数据。

           SqlDataAdapter   与数据库交互执行查询语句

           Dataset     数据集(可以是多个),接收SqlDataAdapter  的查询结果  与DELPHI中的Adodataset类似。

            DataTable  接收Dataset     中的某一个数据集,

           DataRow   接收DataTable   的行

3、操作数据库

          增加行

                  DataRow row=table.NewRow();
                row["ID"] = 123;
                row["Name"] = "456";
                row["Department_ID"] = "01";
                table.Rows.Add(row);
                DataAdapter.Update(dataset);   //提交到数据库中

      删除行:

               table.Rows.Remove(table.Rows[1]);//只在内存中 删除行
                ad.Update(ds);//提交到数据库中
                table.Rows[0].Delete();//真正在数据库中删除
                DataAdapter.Update(table);  //提交到数据库中

     修改行:

            DataRow row=table.Rows[0];
               row["name"]="r";
              DataAdapter.Update(ds);  //向数据库提交对数据的更改

提取其中的某一列的值

       MessageBox.Show(table.Rows[i]["name"].ToString());
  



        string connstring = ConfigurationManager.ConnectionStrings["conn1"].ConnectionString;
            SqlConnection conn = new SqlConnection(connstring);
            DataSet ds = new DataSet();
            SqlDataAdapter ad = new SqlDataAdapter("select * from employee ",conn);
            ad.Fill(ds);
            new SqlCommandBuilder(ad);
            DataTable table=ds.Tables[0];
              DataRow row=table.Rows[0];
              // row["name"]="r";
              //  ad.Update(ds);  //向数据库提交对数据的更改
              MessageBox.Show(table.Rows.Count.ToString());
                table.Rows.Remove(table.Rows[1]);//只在内存中 删除行
                ad.Update(ds);//
                table.Rows[0].Delete();//真正在数据库中删除
                ad.Update(table);
                MessageBox.Show(table.Rows.Count.ToString());
              /**  DataRow rw=table.NewRow();
                rw["ID"] = 123;
                rw["Name"] = "456";
                rw["Department_ID"] = "01";
                table.Rows.Add(rw);
                ad.Update(ds);//增加行 **/

4、通过SqlCommand  操作数据库

           string connstring = ConfigurationManager.ConnectionStrings["conn1"].ConnectionString;
            SqlConnection conn = new SqlConnection(connstring);
            conn.Open();
            SqlCommand cmd = conn.CreateCommand();
            cmd.CommandText = "select * from employee  where   id=@id";
            cmd.Parameters.Clear();
            cmd.Parameters.Add(new SqlParameter("@id",textBox2.Text));
            SqlDataReader red=cmd.ExecuteReader();
            if (red.Read())
            {
                MessageBox.Show("主键重复,请检查!");
                return;
            }
            red.Close();  //在对应的Command执行新的命令之前,要把与该Command相关联的DataReader关掉
            cmd.CommandText = "insert into employee(id,name,department_id) values(@id,@name,@department_id)  ";
            cmd.Parameters.Clear();
            cmd.Parameters.Add(new SqlParameter("ID",textBox2.Text));
            cmd.Parameters.Add(new SqlParameter("name",textBox3.Text));
            cmd.Parameters.Add(new SqlParameter("department_id", textBox3.Text));
            cmd.ExecuteNonQuery();
            MessageBox.Show("插入成功");

二、强类型Dataset



    1、批量操作数据库时,需要先把对应的TableAdapter 的 Connection 打开,执行完毕后再关闭掉,这样可以明显提高执行效率。
     2、需要新建数据集项目、新建数据连接。

    3、把数据连接中的表拖入数据信项目。

    4、系统自动生成对应的TableAdapter 对像,DataTable对像。ROW对像。

    5、可在Dataset对像中自定义方法。包括带参数的方法,通过这些方法来查询、修改、删除数据库中的数据。

    6、可通过DataTable[i].列名  来取值     i表示行ID,


    //7、在有大数据量执行之前要把对应的 TableAdapter 所对应的Connection 打开,执行完毕后再关掉,这样可以明显提高扫行效率。
   例  表名为  Employee  DataSet1为数据集名

         EMPLOYEETableAdapter adapt = new EMPLOYEETableAdapter();
            DataSet1.EMPLOYEEDataTable data = adapt.GetData();

            
            for (int i = 0; i < data.Count; i++)
            {
                DataSet1.EMPLOYEERow Row = data[i];
                if (!data[i].IsCITYNull())
                {
                    MessageBox.Show(data[i].CITY);
                }
               
                MessageBox.Show(data[i].NAME);
            }
            data[0].NAME = "china";
            adapt.Update(data);

评分

参与人数 1技术分 +1 收起 理由
郑文 + 1

查看全部评分

回复 使用道具 举报
简单的说...类型化数据集就是具有内置架构的强类型DataSet...非类型化数据集就是没有内置架构的DataSet...
类型化数据集是对象集合...而非类型化数据集只是一些二维表...

评分

参与人数 1技术分 +1 收起 理由
郑文 + 1

查看全部评分

回复 使用道具 举报
1.强类型是自定义类所具有的优势。它使得对象处理的数据更容易被理解,而不需要与ADO.NET和XML编程模型打交道。这在大型系统里是很有用的,特别是当设计者定义了由自定义类所组成的数据访问层,并把设计向组织内的其他程序员发布的时候。当然,现在自定义类的使用有下降的趋势:它们需要编更多的代码,因为你必须创建.NET Framework所缺少的对象关系映射层。
2.强/弱类型是指类型检查的严格程度的。语言有无类型,弱类型和强类型三种。无类型的不检查,甚至不区分指令和数据。弱类型的检查很弱,仅能严格的区分指令和数据。强类型的则严格的在编译期进行检查。

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马