VB.net 2010 视频教程 VB.net 2010 视频教程 python基础视频教程
SQL Server 2008 视频教程 c#入门经典教程 Visual Basic从门到精通视频教程
当前位置:
首页 > VB.net教程 >
  • VB.NET学习笔记:操作数据集DataSet中DataTable数据行(DataRow)——新增、插入、复制

通常我们都知道可以使用OleDbDataAdapter对象的Fill方法从数据源检索数据并填充DataSet 中的DataTable,其实我们也可以人工为DataTable添加DataRow。

一、Rows.Add和Rows.InsertAt方法

Add和InsertAt方法都可以把新行添加到DataTable。
新一个Windows应用程序,在Form1窗体拉入一个按钮和DataGridView。
在Form1代码界面添加如下代码:

Public Class Form1
    '声明DataTable
    Dim dt1 As New DataTable
    Dim dt2 As New DataTable

    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        '为dt1创建结构
        dt1.Columns.Add("ID", Type.GetType("System.Int32"))
        dt1.Columns.Add("Name", Type.GetType("System.String"))

        '为dt1添加测试用数据
        Dim row As DataRow
        For i As Integer = 1 To 10
            row = dt1.NewRow
            row("ID") = i
            row("Name") = "Name" & i.ToString
            '添加新行
            dt1.Rows.Add(row)
            '插入新行
            'dt1.Rows.InsertAt(row, 0)
        Next
    End Sub
End Class
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23

二、DataTable.Copy和DataTable.Clone方法

测试代码1:

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        '复制dt1的结构和数据
        dt2 = dt1.Copy()
        
        'UI界面显示dt2数据
        DataGridView1.DataSource = Nothing
        DataGridView1.DataSource = dt2
    End Sub
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

测试结果: 在这里插入图片描述 测试代码2:

    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        '克隆dt1的结构,包括所有DataTable架构和约束。
        dt2 = dt1.Clone()

        'UI界面显示dt2数据
        DataGridView1.DataSource = Nothing
        DataGridView1.DataSource = dt2
    End Sub
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

测试结果: 在这里插入图片描述

三、复制DataRow

使用DataTable.Copy方法可以复制DataTable的结构和所有数据行,而有时仅需要复制其中的一行,DataRow没有Copy方法,要如何实现呢?

1、Rows.Add和Rows.InsertAt方法

测试代码1:

    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        '克隆dt1的结构,包括所有DataTable架构和约束。
        dt2 = dt1.Clone()

        For Each row As DataRow In dt1.Rows
            '报错
            dt2.Rows.Add(row)
            'dt2.Rows.InsertAt(row, 0)
        Next

        'UI界面显示dt2数据
        DataGridView1.DataSource = Nothing
        DataGridView1.DataSource = dt2
    End Sub
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

测试结果: 报错:System.ArgumentException:“该行已经属于另一个表。”,如图, 在这里插入图片描述 测试代码2:

    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        '克隆dt1的结构,包括所有DataTable架构和约束。
        dt2 = dt1.Clone()

        For Each row As DataRow In dt1.Rows
            dt2.Rows.Add(row.ItemArray)
        Next

        'UI界面显示dt2数据
        DataGridView1.DataSource = Nothing
        DataGridView1.DataSource = dt2
    End Sub
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

测试结果:正常

2、DataTable.ImportRow方法

测试代码:

    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        '克隆dt1的结构,包括所有DataTable架构和约束。
        dt2 = dt1.Clone()

        For Each row As DataRow In dt1.Rows
            dt2.ImportRow(row)
        Next

        'UI界面显示dt2数据
        DataGridView1.DataSource = Nothing
        DataGridView1.DataSource = dt2
    End Sub
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

测试结果:正常

3、自定义复制DataRow

(1)、dt1与dt2列名称不同,但各列数据类型相同。

测试代码1:

    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        '为dt2创建结构
        dt2.Columns.Add("dt2ID", Type.GetType("System.Int32"))
        dt2.Columns.Add("dt2Name", Type.GetType("System.String"))

        For Each row As DataRow In dt1.Rows
            dt2.Rows.Add(row.ItemArray)
        Next

        'UI界面显示dt2数据
        DataGridView1.DataSource = Nothing
        DataGridView1.DataSource = dt2
    End Sub
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

测试结果:成功复制,如图 在这里插入图片描述 测试代码2:

    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        '为dt2创建结构
        dt2.Columns.Add("dt2ID", Type.GetType("System.Int32"))
        dt2.Columns.Add("dt2Name", Type.GetType("System.String"))

        For Each row As DataRow In dt1.Rows
            dt2.ImportRow(row)
        Next

        'UI界面显示dt2数据
        DataGridView1.DataSource = Nothing
        DataGridView1.DataSource = dt2
    End Sub
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

测试结果:行是复制过来了,但数据为null,说明该方法要求两表架构一致。如图 在这里插入图片描述

(2)、dt1与dt2列名称、数据类型均不同。

测试代码:

    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        '为dt2创建结构
        dt2.Columns.Add("dt2ID", Type.GetType("System.String"))
        dt2.Columns.Add("dt2Name", Type.GetType("System.String"))

        For Each row As DataRow In dt1.Rows
            dt2.Rows.Add(row.ItemArray)
        Next

        'UI界面显示dt2数据
        DataGridView1.DataSource = Nothing
        DataGridView1.DataSource = dt2
    End Sub
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

测试结果:成功复制,可见ItemArray属性的兼容很强。

(3)、dt2的列数比dt1少

测试代码1:

    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        '为dt2创建结构
        dt2.Columns.Add("dt2ID", Type.GetType("System.String"))
       
        For Each row As DataRow In dt1.Rows
            dt2.Rows.Add(row.ItemArray)
        Next

        'UI界面显示dt2数据
        DataGridView1.DataSource = Nothing
        DataGridView1.DataSource = dt2
    End Sub
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

测试结果:报错——System.ArgumentException:“输入数组长度大于此表中的列数。如图 在这里插入图片描述 测试代码2:真正的自由自在的自定义复制

    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        '为dt2创建结构
        dt2.Columns.Add("dt2ID", Type.GetType("System.String"))
        dt2.Columns.Add("myColumn", Type.GetType("System.String"))
        dt2.Columns.Add("dt2Name", Type.GetType("System.String"))

        Dim newrow As DataRow
        For Each row As DataRow In dt1.Rows
            newrow = dt2.NewRow
            newrow("dt2ID") = row("ID")
            newrow("dt2Name") = row("Name")
            dt2.Rows.Add(newrow)
        Next

        'UI界面显示dt2数据
        DataGridView1.DataSource = Nothing
        DataGridView1.DataSource = dt2
    End Sub
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18

测试结果:复制成功。如图 在这里插入图片描述 以上测试希望能给各看官一些启示。


相关教程