博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
VS2010实现强类型DataSet(转载)
阅读量:7005 次
发布时间:2019-06-27

本文共 8584 字,大约阅读时间需要 28 分钟。

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

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

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

●·● 目录:

A1 ………… 

A2 ………… 
A3 ………… 
A5 ………… 
A6 ………… 
A7 ………… 
A8 ………… 

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

            ╔════════╗

╠════╣        ╠══════════════════════════════════════════════════╣
            ╚════════╝

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!

※ 只是将表结构拖过去了!

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

            ╔════════╗

╠════╣        ╠══════════════════════════════════════════════════╣
            ╚════════╝

更新表格:表格修改后!

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

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

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

            ╔════════╗

╠════╣        ╠══════════════════════════════════════════════════╣
            ╚════════╝

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

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}\r\nUserName = {1}\r\nPassWord = {2}"
,
        
persons[i].Id.ToString(), persons[i].UserName, persons[i].PassWord));
}

  效果如下:第一个窗体!

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

            ╔════════╗

╠════╣        ╠══════════════════════════════════════════════════╣
            ╚════════╝

优化:

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

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());
}

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

            ╔════════╗

╠════╣        ╠══════════════════════════════════════════════════╣
            ╚════════╝

●·● :

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(
    '\t'
    );                     
    //对于 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, 
    NAME
    SIZE 
    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 类的实例来调用。

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

            ╔════════╗

╠════╣        ╠══════════════════════════════════════════════════╣
            ╚════════╝

●·● :

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

2. TestDataTable 属性:

  • Count:Table 的总 Row 数。
  • IDColumn:返回字段 ID 的列,返回值为DataColumn。
    NAMEColumn:NAME 列。
    SIZEColumn:SIZE 列。
  • Columns:返回  类。可以获取定义的列的具体信息!
    •  类:表示 DataTable 的 DataColumn 对象的集合。
              Count:获取集合中的元素的总数。
              Item[Int32]:从集合中获取位于指定索引位置的 DataColumn。
              Item[String]:从集合中获取具有指定名称的 DataColumn。
              Add():创建 DataColumn 对象并将其添加到 DataColumnCollection 中。
              Add(DataColumn):创建指定的 DataColumn 对象并将其添加到 DataColumnCollection。
              IndexOf(DataColumn):获取按名称指定的列的索引。
              IndexOf(String):获取具有特定名称的列的索引(名称不区分大小写)。
    •  类:表示 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}\r\nLength: {1}\r\nDataType: {2}"
      ,
              
      dc.ColumnName, dc.MaxLength.ToString(), dc.DataType.ToString());
          
      MessageBox.Show(str);
      }
  • Rows:返回  类。获取每行的具体信息!
    •  类:表示 DataTable 的行的集合。
              Count:获取该集合中 DataRow 对象的总数。
              Item:获取指定索引处的行。
              Add(DataRow):将指定的 DataRow 添加到 DataRowCollection 对象中。
              IndexOf:获取指定 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}\r\nUserName: {1}\r\nPassWord: {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());              
    //显示出来

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

            ╔════════╗

╠════╣        ╠══════════════════════════════════════════════════╣
            ╚════════╝

●·● :

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}\r\nUserName: {1}\r\nPassWord: {2}"
,
        
row.ID.ToString(), row.UserName.ToString(), row.PassWord.ToString());
    
MessageBox.Show(str);
}

 

 

 

作者:  
出处:  
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文链接,谢谢!

转载于:https://www.cnblogs.com/khfang/p/5778765.html

你可能感兴趣的文章
iptables 使用
查看>>
我的友情链接
查看>>
对比下HBase, Memcached, MongoDB, Redis和Solr
查看>>
《Tensorflow For Machine Intelligence》第七章的翻译解读(一)
查看>>
C++字符数组与字符指针在运算时的区别
查看>>
CM3任务切换详解
查看>>
我的友情链接
查看>>
最简单的在线编辑PPT文件
查看>>
我的友情链接
查看>>
安装centos7与git使用
查看>>
spring
查看>>
Maven与打包方式总结
查看>>
Android之旅 笔记总结(一)
查看>>
hive 文件系统学习实例
查看>>
手机刷机方法,你刷机了吗
查看>>
马哥Linux云计算架构班--第三周学习作业
查看>>
瑞萨单片机(R5F100LE)利用中断和定时器HC_SR04超声波测距模块
查看>>
Chrome插件开发入门教程
查看>>
C++ 中 const 的使用
查看>>
win7- 64 使用GNS3 0.8.6 安装 ASA 8.4.2
查看>>