2009-11-07 85 views
0

我是使用DataSet的新手。我正在用VB.NET编写一个程序,我必须从一个表中选择数据。然后,我必须更新大约4个表并插入2个表。哪种方法对我来说可以吗?我正在考虑使用DataSet。如果任何人都可以指出这个问题,请向我展示示例代码以更新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 
+0

非常感谢恩古不久惠! – RedsDevils 2009-11-07 08:39:47

+0

感谢你的例子。我的问题是我必须从一个表中检索数据。根据这些数据,我必须更新并插入其他表格(大约5张表格)。所以我必须根据检索到的数据进行循环,以插入和更新其他表。那么它怎么样? – RedsDevils 2009-11-07 08:44:01

0

你应该用数据适配器工作 - 学习最好的方法 - 找一些例子在MSDN或谷歌它,然后 - 尝试解决你的问题 - 然后 - 如果你遇到问题 - 在这里发布。

基本知识: 您需要连接,命令,数据适配器和数据集。

您使用datadapter填充从数据库中的数据得到的数据集, 和更新把数据备份到数据库中。 你需要告诉数据适配器如何做到这一点,或使用向导来自动生成命令(INSERT,UPDATE等...)

+0

谢谢你的回答解决了我的问题的一部分,我越来越知道我必须使用dataadapter。谢谢Dani!我的问题是我必须从一个表中检索数据。根据这些数据,我必须更新并插入其他表格(大约5张表格)。所以我必须根据检索到的数据进行循环,以插入和更新其他表。在那个问题上,我可以使用dataadapter吗?它的表现如何? – RedsDevils 2009-11-07 08:38:13

+0

您可以使用数据适配器或多个数据适配器,具体取决于您必须执行的更改类型。 我通常使用存储过程处理数据更改(如果它们比较复杂),并将数据重新加载回数据集。 – Dani 2009-11-07 14:24:54

+0

感谢您的想法丹妮!现在我正在努力开发我的程序。 :) 非常感谢! – RedsDevils 2009-11-07 18:20:49

0
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 
相关问题