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


二、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

测试结果:

在这里插入图片描述

测试代码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

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

三、复制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

测试结果:
报错: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

测试结果:正常

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

测试结果:正常

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

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

测试代码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

测试结果:行是复制过来了,但数据为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

测试结果:成功复制,可见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

测试结果:报错——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

测试结果:复制成功。如图
在这里插入图片描述

以上测试希望能给各看官一些启示。

  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
回答: 在VB.NET,可以使用DataSet的Copy方法将DataSet数据复制到一个新的DataTable。具体的代码如下所示: ```vb Dim dataSet As New DataSet() ' 假设ordersTable是已经填充好数据DataTable Dim ordersTable As DataTable = dataSet.Tables("Orders") ' 创建一个新的DataTable,并将ordersTable数据复制到新的DataTable Dim newDataTable As DataTable = ordersTable.Copy() ``` 通过调用Copy方法,可以将DataSet数据复制到一个新的DataTable,然后可以对新的DataTable操作。\[2\] 需要注意的是,如果你只是想在代码使用DataTable,而不需要使用DataSet,可以直接从数据获取数据并填充到DataTable,而不需要使用DataSet。你可以使用ADO.NET提供的SqlConnection和SqlDataAdapter类来实现这个功能。具体的代码如下所示: ```vb Dim connStr As String = "Data Source=PC-201104071256\sqlEXPRESS;Initial Catalog=Northwind;Integrated Security=True" Dim conn As New SqlConnection(connStr) Dim sql As String = "SELECT * FROM Orders" Dim adapter As New SqlDataAdapter(sql, conn) Dim dataTable As New DataTable() adapter.Fill(dataTable) ``` 通过使用SqlConnection和SqlDataAdapter类,可以连接到数据库并执查询,然后将查询结果填充到DataTable。\[3\] #### 引用[.reference_title] - *1* *2* [VB.Net DataSetDataTable](https://blog.csdn.net/wulingmin21/article/details/6888461)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [vb.netdatatable读取数据到Excel](https://blog.csdn.net/weixin_35651102/article/details/117833978)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值