【问题标题】:Data Manipulation (INSERT,UPDATE) using DataSet Object with VB.NET使用带有 VB.NET 的 DataSet 对象进行数据操作(插入、更新)
【发布时间】:2010-12-14 03:00:58
【问题描述】:

我是使用 DataSet 的新手。我正在用 VB.NET 编写一个程序,我必须从一个表中选择数据。然后我必须更新大约 4 个表并插入到 2 个表。哪种方法适合我?我正在考虑使用数据集。如果有人能指出这个问题,请向我展示更新 DataSet 的示例代码。非常感谢大家。

【问题讨论】:

    标签: vb.net dataset insert-update


    【解决方案1】:

    这里是a link,可以参考:

    Public Function CreateCommandAndUpdate( _
        ByVal connectionString As String, _
        ByVal queryString As String) As DataSet
    
        Dim dataSet As DataSet = New DataSet
    
        Using connection As New OleDbConnection(connectionString)
            connection.Open()
            Dim adapter As New OleDbDataAdapter()
    
            adapter.SelectCommand = New OleDbCommand( _
                queryString, connection)
    
            Dim builder As OleDbCommandBuilder = _
                New OleDbCommandBuilder(adapter)
    
            adapter.Fill(dataSet)
    
            ' Code to modify the data in the DataSet here. 
    
            ' Without the OleDbCommandBuilder this line would fail.
            builder.GetUpdateCommand()
            adapter.Update(dataSet)
        End Using
        Return dataSet
    End Function
    

    这里是an example,关于如何删除:

    Private Sub btnDeleteUser_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnDeleteUser.Click
    Dim reponse_del As Integer
    If txtSearch.Text = "" Then
    MessageBox.Show("Please type a user name into the text box")
    End If
    
    'clear and refill Dataset
    OleDAPass.SelectCommand.Parameters("UserName").Value = txtSearch.Text
    DS_Pass1.Clear()
    OleDAPass.Fill(DS_Pass1)
    'no records of the search name
    If DS_Pass1.Tables("PwordStore").Rows.Count = 0 Then
    MessageBox.Show("Record not found")
    ElseIf DS_Pass1.Tables("PwordStore").Rows.Count = 1 Then 'record exists delete it
    MessageBox.Show("Are you sure you wish to delete this user?", "Warning", MessageBoxButtons.YesNo, MessageBoxIcon.Exclamation)
    If reponse_del = DialogResult.Yes Then
    OleDAPass.SelectCommand.Parameters ("UserName").Value = txtSearch.Text
    'delete row
    DS_Pass1.Tables("PwordStore").Rows(0).Delete()
    OleDAPass.Update(DS_Pass1, "PwordStore")
    End If
    DS_Pass1.PwordStore.AcceptChanges()
    DS_Pass1.Clear()
    txtSearch.Text = ""
    End If
    End Sub
    

    【讨论】:

    • 感谢您的示例。我的问题是我必须从一张表中检索数据。基于该数据,我必须更新并插入其他表(大约 5 个表)。所以我必须根据检索到的数据循环,插入和更新其他表。那么怎么样呢?
    【解决方案2】:

    您应该使用数据适配器 - 学习的最佳方式 - 在 MSDN 或 Google 中查找一些示例,然后 - 尝试解决您的问题 - 然后 - 如果您遇到问题 - 在此处发布。

    基础知识: 你需要一个连接、一个命令、一个数据适配器和一个数据集。

    您使用数据适配器填充将数据从数据库获取到数据集, 并更新以将数据放回数据库。 您需要告诉数据适配器如何执行此操作,或者使用向导自动生成命令(INSERT、UPDATE 等...)

    【讨论】:

    • 感谢您的回答部分解决了我的问题,我知道我必须使用 dataadapter。谢谢丹妮!我的问题是我必须从一张表中检索数据。基于该数据,我必须更新并插入其他表(大约 5 个表)。所以我必须根据检索到的数据循环,插入和更新其他表。在那个问题中,我也可以使用 dataadapter 吗?它的性能如何?
    • 您可以使用数据适配器,也可以使用多个数据适配器,具体取决于您必须进行的更改类型。我通常使用存储过程来处理复杂的数据更改,而不是将数据重新加载回数据集。
    • 感谢您的想法丹尼!现在我正在尝试开发我的程序。 :) 非常感谢!
    【解决方案3】:
      Public Function MaintanenceImport(ByVal con As IDbConnection, ByVal TransDate As Date, ByVal ds2 As DataSet)
            Try
                For index1 = 0 To ds2.Tables.Count - 1
                    tblname = ds2.Tables(index1).TableName
                    ds1 = Util.GetDataSet4Query(" select * from " & tblname & " ")
                    index = 0
                    ds1.Tables(index).TableName = "" & tblname & ""
                    'For index = 0 To ds1.Tables.Count - 1
                    str1 = ""
                    Str = ""
                    cnt1 = 0
                    '    '====Comparing the Xml TableName and the Database Table Name
                    '    '==== ds1-from Database;ds2-from xml
                    '    If (ds1.Tables(index).TableName = ds2.Tables(index1).TableName) Then
                    '        tblname = ds2.Tables(index1).TableName
                    l = 0
                    '=== Counting the Columns of xml dataset
                    While (l <= ds2.Tables(index1).Columns.Count - 1)
                        n = 0
                        '=== Counting the Columns of DataBase dataset
                        While (n <= ds1.Tables(index).Columns.Count - 1)
                            '==== Comparing the Column Names and seperating the matching and unmatching fields
                            If ((UCase(ds2.Tables(index1).Columns(l).ColumnName).Trim) = (UCase(ds1.Tables(index).Columns(n).ColumnName).Trim) = True) Then
                                f2 = True
                                Exit While
                            Else
                                f2 = False
                            End If
                            n += 1
                        End While
                        '=== Collecting the Unmatched Column Names
                        If f2 = False Then
                            cnt3 = cnt3 + 1
                            If cnt3 = 1 Then
                                str4 = ds2.Tables(index1).Columns(l).ColumnName
                                col1 = str4
                                m1 = 0
                                a1(m1) = 1
                            Else
                                str4 = str4 + "," + ds2.Tables(index1).Columns(l).ColumnName
                                m1 += 1
                                a1(m1) = l
                            End If
                        End If
                        '=== Collecting the matching column names
                        If f2 = True Then
                            cnt1 = cnt1 + 1
                            If cnt1 = 1 Then
                                str1 = ds2.Tables(index1).Columns(l).ColumnName
                                col = str1
                                m = 0
                                a(m) = l
                            Else
                                str1 = str1 + "," + ds2.Tables(index1).Columns(l).ColumnName
                                m += 1
                                a(m) = l
                            End If
    
                        End If
                        l += 1
                    End While
    
                    '=================================================================
                    '===>     code to fetch value from xml for insert            <====
                    '=================================================================
                    i = 0
                    '==== Take a row count of dataset from xml
                    While (i <= ds2.Tables(index1).Rows.Count - 1)
                        k = 0
                        f1 = False
                        '==== Take a row count of dataset from Database
                        While (k <= ds1.Tables(index).Rows.Count - 1)
                            '=== Comparing the First Field of the row 
                            If (ds2.Tables(index1).Rows(i)(0).ToString() = ds1.Tables(index).Rows(k)(0).ToString()) Then
                                '== if matches true Else false
                                f1 = True
                                Exit While
                            Else
                                f1 = False
                            End If
                            k += 1
                        End While
                        '== if false it indicates NewRecord
                        If f1 = False Then
                            m = 0
                            '=================================================================
                            '===>if column names collected are similar to the dbase table<====
                            '=================================================================
    
                            If a Is Nothing Then
                                cnt = 0
                                cnt = cnt + 1
                                j = 0
                                While (j < ds2.Tables(index1).Columns.Count)
                                    If cnt = 1 Then
                                        Str = ds2.Tables(index1).Rows(i)(j).ToString()
                                        q = str
                                    Else
                                        str = str + "," + "'" + Replace(ds2.Tables(index1).Rows(i)(j).ToString(), "'", "''") + "'"
                                        cnt += 1
                                    End If
                                    j += 1
                                End While
                                '========================================================================
                                '===>if column names collected are not similar to the database table<====
                                '========================================================================
                                '=== Collecting the values 
                            Else
                                m = 0
                                cnt = 0
                                cnt += 1
                                cnt2 = cnt1
                                For m = 0 To cnt2 - 1
                                    p = a(m)
                                    If p.ToString Is Nothing Then
                                        Exit For
                                    Else
                                        If cnt = 1 Then
                                            str = "'" + ds2.Tables(index1).Rows(i)(p).ToString() + "'"
                                            'q = str
                                        Else
                                            str = str + "," + "'" + Replace(ds2.Tables(index1).Rows(i)(p).ToString(), "'", "''") + "'"
                                        End If
                                        cnt += 1
                                    End If
                                Next
                            End If
                            Dim TransCon As IDbConnection
                            Dim Trans As IDbTransaction
                            Try
                                '== Inserting the collected values into table
                                TransCon = Util.GetConnection
                                TransCon.Open()
                                Trans = TransCon.BeginTransaction(IsolationLevel.ReadCommitted)
                                sql3 = "insert into " & tblname & "(" & str1 & ") values(" & str & ")"
                                '== Check Identity Column
                                If Util.ExecuteQryNSP(TransCon, CmdType.Text, ExecuteMode.ExecuteScalar, Trans, "select count(*) from SysColumns where Id=object_id('" & tblname & "') and Colstat&1=1") > 0 Then
                                    Util.ExecuteQryNSP(TransCon, CmdType.Text, ExecuteMode.ExecuteNonQuery, Trans, "set IDENTITY_INSERT " & tblname & " on ")
                                    Util.ExecuteQryNSP(TransCon, CmdType.Text, ExecuteMode.ExecuteNonQuery, Trans, sql3)
                                    Util.ExecuteQryNSP(TransCon, CmdType.Text, ExecuteMode.ExecuteNonQuery, Trans, "set IDENTITY_INSERT " & tblname & " off ")
                                Else
                                    Util.ExecuteQryNSP(TransCon, CmdType.Text, ExecuteMode.ExecuteNonQuery, Trans, sql3)
                                End If
                                Trans.Commit()
                            Catch ex As Exception
                                Trans.Rollback()
                            End Try
                            '=== Updating the Records from Xml to DataBase
                        Else
                            Try
    
                                Dim da1 As New SqlDataAdapter
                                Dim builder As New SqlCommandBuilder(da1)
                                da1.SelectCommand = New SqlCommand("select * from " & tblname & "", con)
                                '== Collecting the column names in a string array
                                Dim str2() As String = str1.Split(",")
                                '=== Filling the Xml DataSet into the DataTable
                                Dim dt1 As DataTable = ds2.Tables(index1)
                                '=== Filling the DataBase dataset into the datatable
                                Dim dt2 As DataTable = ds1.Tables(index)
                                Dim drcpu As DataRow
                                Dim drVendor As DataRow
                                '=== By Comparing row by row and field by field Updating done
                                For Each drcpu In dt1.Rows
                                    For Each drVendor In dt2.Rows
                                        If drVendor(str2(0)) = drcpu(str2(0)) Then
                                            For Each Me.str3 In str2
                                                If Not IsDBNull(drcpu(str3)) Then
                                                    If drVendor(str3).ToString = drcpu(str3).ToString Then
                                                        Continue For
                                                    Else
                                                        If IsDBNull(drVendor(str3)) Then
                                                            drVendor.BeginEdit()
                                                            drVendor(str3) = drcpu(str3).ToString
                                                            drVendor.EndEdit()
                                                            da1.UpdateCommand = New SqlCommand("update " & tblname & " set " & str3 & "='" & Trim(drVendor(str3)) & "'  where " & str2(0) & "= " & drVendor(str2(0)) & "")
                                                            da1.Update(ds1, "" & tblname & "")
                                                        End If
                                                        Dim Store2 As String
                                                            Dim Store1 As String
                                                            Store2 = (UCase(CType(drVendor(str3), String)).Trim)
                                                            Store1 = (UCase(CType(drcpu(str3), String)).Trim)
                                                            If (Store2).Equals(Store1) Then
                                                                Continue For
                                                            Else
                                                                drVendor.BeginEdit()
                                                                drVendor(str3) = drcpu(str3).ToString
                                                                drVendor.EndEdit()
                                                                Dim SqlStr As String = ""
                                                                If tblname = "MasterSettings" Then
                                                                    SqlStr = "update " & tblname & " set " & str3 & "='" & Replace(Trim(drVendor(str3)), "'", "''") & "'  where " & str2(0) & "= " & drVendor(str2(0)) & " and " & str2(1) & "= " & drVendor(str2(1)) & ""
                                                                Else
                                                                    SqlStr = "update " & tblname & " set " & str3 & "='" & Replace(Trim(drVendor(str3)), "'", "''") & "'  where " & str2(0) & "= " & drVendor(str2(0)) & ""
                                                                End If
                                                                da1.UpdateCommand = New SqlCommand(SqlStr)
                                                                da1.Update(ds1, "" & tblname & "")
                                                            End If
                                                        End If
                                                        'End If
                                                    End If
                                            Next
    
                                        End If
                                    Next
                                Next
                            Catch ex As Exception
                                MsgBox(ex)
                            End Try
                        End If
                        i += 1
                    End While
                Next
                Return True
            Catch ex As Exception
                Return False
            End Try
        End Function
    

    【讨论】:

      猜你喜欢
      • 2016-12-10
      • 1970-01-01
      • 2016-09-30
      • 1970-01-01
      • 2011-01-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多