• VS2010实现强类型DataSet(转载)


    【021】VS2010实现强类型DataSet

    ---> 操作简单,同时可以对数据库进行操作 <---

    原文链接:http://www.cnblogs.com/alex-bn-lee/archive/2012/03/11/2390171.html

    ---------------------------------------------------------------------------------------------------------

    ●·● 目录:

    A1 ………… 新建强类型 DataSet
    A2 ………… 更新 DataSet 数据
    A3 ………… 自定义方法 
    A5 ………… 优化
    A6 ………… TestTableAdapter 类
    A7 ………… TestDataTable 类
    A8 ………… TestRow 类

    --------------------------------------------------------------------------------------------------------------

                ╔════════╗
    ╠════╣    第A1个    ╠══════════════════════════════════════════════════╣
                ╚════════╝

    1. 首先,项目右键 添加》新建项,如下图,选择数据》数据集。

    2. 将表直接拖拽到数据集中,即可生成强类型DataSet。

    3. 下面就可以直接用了!

    1
    2
    3
    4
    5
    6
    7
    Table1TableAdapter adapter = new Table1TableAdapter();         //新生成的类
    DataSet1.Table1DataTable data = adapter.GetData();            //新生成的类
    for (int i = 0; i < data.Count;i++ )
    {
        DataSet1.Table1Row userRow = data[i];            //新生成的类
        MessageBox.Show(userRow.UserName);
    }
    1
    2
    3
    4
    5
    6
    7
    Table1TableAdapter adapter = new Table1TableAdapter();          //表名+TableAdapter
    DataSet1.Table1DataTable persons = adapter.GetData();         //数据集名.表名+DataTable
    for (int i = 0; i < persons.Count;i++ )
    {
        DataSet1.Table1Row person = persons[i];                //数据集名.表名+Row
        MessageBox.Show(string.Format("用户名:{0},密码:{1}", person.UserName, person.PassWord));
    }

    ※ 在使用请类型 DataSet 的时候,表要设置 Primary Key!
    ※ 只是将表结构拖过去了!

    --------------------------------------------------------------------------------------------------------------

                ╔════════╗
    ╠════╣    第A2个    ╠══════════════════════════════════════════════════╣
                ╚════════╝

    更新表格:表格修改后!

    1. 在数据集上面右键,选择 配置。

    2. 选择 查询生成器,选中增加的列。

    --------------------------------------------------------------------------------------------------------------

                ╔════════╗
    ╠════╣    第A3个    ╠══════════════════════════════════════════════════╣
                ╚════════╝

    自定义方法,自定义查询生成方法!

    1. 在数据集上面右键,选择 添加》查询。

    2. 然后可以不停地下一步,选择想要的查询类型:select、update、delete、insert。

    3. 最后就是写入语句,语句可以没有参数,也可以加入参数,如下:选择 Id 大于某值的结果。

    4. 向下面这样使用!

    1
    2
    3
    4
    5
    6
    7
    Table1TableAdapter adapter = new Table1TableAdapter();
    DataSet1.Table1DataTable persons = adapter.GetDataById(5);      //自定义方法,选择 Id > 5 的部分
    for (int i = 0; i < persons.Count;i++ )
    {
        MessageBox.Show(string.Format("Id = {0} UserName = {1} PassWord = {2}",
            persons[i].Id.ToString(), persons[i].UserName, persons[i].PassWord));
    }

      效果如下:第一个窗体!

    --------------------------------------------------------------------------------------------------------------

                ╔════════╗
    ╠════╣    第A4个    ╠══════════════════════════════════════════════════╣
                ╚════════╝

    优化:

      在批量操作的时候,可以先将连接打开,操作之后在将连接关闭,因为强类型转换的时候每次都会开关连接,判断的条件是:之前连接有没有打开,若是打开,则不执行开、关了,若是关闭,则执行开、关操作!

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    private void button8_Click(object sender, EventArgs e)
    {
        Stopwatch sw = new Stopwatch();
        sw.Start();
        Table1TableAdapter adapter = new Table1TableAdapter();
        for (int i = 0; i < 1000;i++ )
        {
            adapter.Insert(i.ToString(), i.ToString(), 0, "dsklf");
        }
        sw.Stop();
        MessageBox.Show(sw.Elapsed.ToString());
    }

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    private void button8_Click(object sender, EventArgs e)
    {
        Stopwatch sw = new Stopwatch();
        sw.Start();
        adapter.Connection.Open();
        Table1TableAdapter adapter = new Table1TableAdapter();
        for (int i = 0; i < 1000;i++ )
        {
            adapter.Insert(i.ToString(), i.ToString(), 0, "dsklf");
        }
        adapter.Connection.Close();
        sw.Stop();
        MessageBox.Show(sw.Elapsed.ToString());
    }

    ---------------------------------------------------------------------------------------------------------

                ╔════════╗
    ╠════╣    第A5个    ╠══════════════════════════════════════════════════╣
                ╚════════╝

    ●·● TestTableAdapter 类

    1. 以 Test 为表名生成的 TestTableAdapter 类。该类所具有的方法是根据原 Test 表为基础的,例如增删改查的方法!如右图,只有 ID、NAME、SIZE三列,其中 ID 是自动增加的,无法修改!

    2. TestTableAdapter 方法:

    • GetData:将数据中的数据传递给 DataTable 类。
    • Update (DataTable table):更新数据到数据库中。
    • Insert (string NAME, string SIZE):插入新数据。
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      21
      22
      23
      24
      private void button1_Click(object sender, EventArgs e)
      {
          OpenFileDialog ofd = new OpenFileDialog();
          if (ofd.ShowDialog() != DialogResult.OK)              //寻找文件
          {
              return;
          }
          IdentifyCardTableAdapter adapter = new IdentifyCardTableAdapter();
          using (FileStream file = File.OpenRead(ofd.FileName))
          {
              using (StreamReader reader = new StreamReader(file,System.Text.Encoding.Default))
              {                                                                       //不写编码,没办法读汉字
                  string str;
                  while ((str = reader.ReadLine()) != null)            //每次执行 ReadLine 都会下移一行
                  {
                      string[] strs = str.Split(' ');                     //对于 Tab键 的 split 方法,不能通过 substring 来计算
                      string num = strs[1];                //第一排的数据不用,直接用第二排的数据
                      string name = strs[2];
                      adapter.Insert(num,name);
                  }
              }
          }
          MessageBox.Show("导入成功!");
      }
      数据类型如下所示:


      查询身份证归属地的程序实现:
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      private void button1_Click(object sender, EventArgs e)
      {
          string num = textBox1.Text.Substring(0, 6);
          IdentifyCardTableAdapter adapter = new IdentifyCardTableAdapter();
          DataSet1.IdentifyCardDataTable table = adapter.GetDataByNum(num);
          if (table.Count > 0)
          {
              DataSet1.IdentifyCardRow row = table[0];
              MessageBox.Show(string.Format("身份证号{0}的归属地为{1}!",textBox1.Text,row.Name));
          }
          else
          {
              MessageBox.Show("不存在这样的身份证号!");
          }
      }
      程序显示:

    • Delete (int Original_ID, string NAME, string SIZE):删除数据,由于限定很多,可以自己写入方法,简化Delete的操作。
      首先,在 DataSet1 右键》增加》新查询中增加方法,SQL语句如下:
      1
      2
      SELECT ID, NAMESIZE FROM dbo.Test
      where ID = @ID
      方法命名为:GetDataByID
      可以通过如下的代码简化想要删除编号为 5 的数据。
      1
      2
      3
      4
      TestTableAdapter adapter = new TestTableAdapter();
      DataSet1.TestDataTable table = adapter.GetDataByID(5);           //返回 ID=5 的一行
      DataSet1.TestRow row = table[0];           //将返回的数据赋值给row
      adapter.Delete(row.ID, row.NAME, row.SIZE);             //通过调用属性删除此行
    • Update (string NAME, string SIZE, int Original_ID, string Original_NAME, string Original_SIZE):更新数据中的某一行,如上面的方法,更新 ID=4 的一行。
      1
      2
      3
      4
      TestTableAdapter adapter = new TestTableAdapter();
      DataSet1.TestDataTable table = adapter.GetDataByID(4);
      DataSet1.TestRow row = table[0];
      adapter.Update("Alex","555",row.ID, row.NAME, row.SIZE);
    • 自定义的查询方法,都可以通过TestTableAdapter 类的实例来调用。

    ---------------------------------------------------------------------------------------------------------

                ╔════════╗
    ╠════╣    第A6个    ╠══════════════════════════════════════════════════╣
                ╚════════╝

    ●·● TestDataTable 类

    1. 通过 GetData 方法获取数据库查询后的结果,并存在 Table 里面。Table 是所有 Row 的集合。

    2. TestDataTable 属性:

    • Count:Table 的总 Row 数。
    • IDColumn:返回字段 ID 的列,返回值为DataColumn。
      NAMEColumn:NAME 列。
      SIZEColumn:SIZE 列。
    • Columns:返回 DataColumnCollection 类。可以获取定义的列的具体信息!
      • DataColumnCollection 类:表示 DataTable 的 DataColumn 对象的集合。
                Count:获取集合中的元素的总数。
                Item[Int32]:从集合中获取位于指定索引位置的 DataColumn。
                Item[String]:从集合中获取具有指定名称的 DataColumn。
                Add():创建 DataColumn 对象并将其添加到 DataColumnCollection 中。
                Add(DataColumn):创建指定的 DataColumn 对象并将其添加到 DataColumnCollection。
                IndexOf(DataColumn):获取按名称指定的列的索引。
                IndexOf(String):获取具有特定名称的列的索引(名称不区分大小写)。
      • DataColumn 类:表示 DataTable 中的列的架构。
                ColumnName:获取或设置 DataColumnCollection 中的列的名称。
                DataType:获取或设置存储在列中的数据的类型。
                MaxLength:获取或设置文本列的最大长度。
      • 1
        2
        3
        4
        5
        6
        7
        8
        9
        10
        Table1TableAdapter adapter = new Table1TableAdapter();
        DataSet1.Table1DataTable data = adapter.GetData();
        DataColumnCollection dcc = data.Columns;
        for (int i = 0; i < dcc.Count; i++)
        {
            DataColumn dc = dcc[i];
            string str = String.Format("Name: {0} Length: {1} DataType: {2}",
                dc.ColumnName, dc.MaxLength.ToString(), dc.DataType.ToString());
            MessageBox.Show(str);
        }
    • Rows:返回 DataRowCollection 类。获取每行的具体信息!
      • DataRowCollection 类:表示 DataTable 的行的集合。
                Count:获取该集合中 DataRow 对象的总数。
                Item:获取指定索引处的行。
                Add(DataRow):将指定的 DataRow 添加到 DataRowCollection 对象中。
                IndexOf:获取指定 DataRow 对象的索引。
      • DataRow 类:表示 DataTable 中的一行数据。
                Item[Int32]:获取或设置存储在由索引指定的列中的数据。
                Item[String]:获取或设置存储在由名称指定的列中的数据。
      • 1
        2
        3
        4
        5
        6
        7
        8
        9
        10
        Table1TableAdapter adapter = new Table1TableAdapter();
        DataSet1.Table1DataTable data = adapter.GetData();
        DataRowCollection drc = data.Rows;
        for (int i = 0; i < drc.Count; i++)
        {
            DataRow dr = drc[i];
            string str = String.Format("ID: {0} UserName: {1} PassWord: {2}",
                dr[0].ToString(), dr[1].ToString(), dr[2].ToString());
            MessageBox.Show(str);
        }
    • 1
      2
      3
      4
      5
      6
      7
      8
      //遍历Table中每一行中的NAME值。
      TestTableAdapter adapter = new TestTableAdapter();
      DataSet1.TestDataTable table = adapter.GetData();          //获取数据
      foreach (DataSet1.TestRow row in table)           //遍历,每一个table值都是一个row
      {
          MessageBox.Show(row.NAME);              //获取NAME属性
      }
      MessageBox.Show(table.Count.ToString());              //显示出来

    ---------------------------------------------------------------------------------------------------------

                ╔════════╗
    ╠════╣    第A7个    ╠══════════════════════════════════════════════════╣
                ╚════════╝

    ●·● TestRow 类

    1. TestDataRow 类是 TestDataTable 类集合中的一条,返回每一行的内容。

    2. TestDataRow 属性:

    • ID:获取该行的 ID 值。
    • NAME:获取该行的 NAME 值。
    • SIZE:获取该行的 SIZE 值。
    1
    2
    3
    4
    5
    6
    7
    8
    Table1TableAdapter adapter = new Table1TableAdapter();
    DataSet1.Table1DataTable data = adapter.GetData();
    foreach(DataSet1.Table1Row row in data)
    {
        string str = String.Format("ID: {0} UserName: {1} PassWord: {2}",
            row.ID.ToString(), row.UserName.ToString(), row.PassWord.ToString());
        MessageBox.Show(str);
    }
    作者:McDelfino 
    出处:http://www.cnblogs.com/alex-bn-lee/ 
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文链接,谢谢!
  • 相关阅读:
    Golang gRPC 入门
    ProtoBuf编解码
    Proto3语法入门
    Golang RPC入门
    Windows用mstsc(远程桌面)远程Ubuntu 12.04时无法显示Ubuntu桌面解决办法
    ABAPSM30配置TCODE
    eclipselog4j.properties配置
    Hadoop—配置3个副本,但是实际只有1个副本。
    Hadoop—org.apache.hadoop.io.nativeio.NativeIO$Windows.access0
    Jmeter BeanShell使用场景
  • 原文地址:https://www.cnblogs.com/khfang/p/5778765.html
Copyright © 2020-2023  润新知