比较一个aspx页面中2个网格视图的内容

时间:2010-12-22 21:20:01

标签: asp.net web-applications gridview

我们需要比较2个相同网格视图的内容并提取第三个网格视图中不同的行,这是可行的吗?

我尝试了很多,但没有遇到运气,请帮助我。

在我们的办公室,我们每天备份ASP.net应用程序ms访问后端

在接下来的几天里,我们需要评估对数据库表中记录所做的更改

在每天结束时我想比较2个访问数据库第一个数据库是昨天的备份,第二个数据库是今天的备份

我想到了以下算法,请仔细阅读并告诉我如何继续比较数据表/ gridviews

我需要显示包含差异/更新/删除数据的行/单元

comparing two ms access backend databases of an asp.net web application

2 个答案:

答案 0 :(得分:1)

我的团队和我自己想出来了

Imports System.Data
Imports System.Data.OleDb
Partial Class MoKoTrack
Inherits System.Web.UI.Page

Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
    Dim myDB = New OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=|DataDirectory|databaseName.mdb;Persist Security Info=True")

    Session("CurrentDB") = myDB


    myDB.open()
    Dim mytables = myDB.GetOleDbSchemaTable(OleDbSchemaGuid.Primary_Keys, New Object() {})

    Dim CurrentTable As String

    For i = 1 To mytables.Rows.Count
        CurrentTable = mytables.Rows(i - 1).Item(2).ToString
        If CurrentTable.Contains("Backup") Then CompareTable(CurrentTable, mytables.Rows(i - 1).Item(3).ToString)
    Next i

    '        Dim myGrid As New GridView
    'myGrid.DataSource = mytables
    'myGrid.DataBind()
    'Me.Form.Controls.Add(myGrid)
    'myDB.Close()
End Sub

Sub CompareTable(ByVal BackupTableName As String, ByVal myPrimKey As String)

    Dim OriginalTable As New DataTable
    Dim BackupTable As New DataTable
    Dim ModificationsTable As New DataTable
    Dim AddedTable As New DataTable
    Dim DeletedTable As New DataTable

    Dim myDB = Session("CurrentDB")
    Dim FinalSQLString = "SELECT * FROM [" + BackupTableName + "]"
    Dim myDBCommand = New OleDbCommand(FinalSQLString, myDB)
    Dim myReader As IDataReader = myDBCommand.ExecuteReader()

    BackupTable.Load(myReader)

    Dim OriginalTableName = Left(BackupTableName, Len(BackupTableName) - 6)
    Dim FinalSQLString2 = "SELECT * FROM [" + OriginalTableName + "]"
    Dim myDBCommand2 = New OleDbCommand(FinalSQLString2, myDB)
    'Generate a temporary reader to get the number of cases
    Dim myReader2 As IDataReader = myDBCommand2.ExecuteReader()
    OriginalTable.Load(myReader2)

    Dim myPrimColumn(0) As DataColumn
    myPrimColumn(0) = OriginalTable.Columns(myPrimKey)
    OriginalTable.PrimaryKey = myPrimColumn
    Dim myPrimColumn2(0) As DataColumn
    myPrimColumn2(0) = BackupTable.Columns(myPrimKey)
    BackupTable.PrimaryKey = myPrimColumn2


    AddedTable = OriginalTable.Clone
    DeletedTable = OriginalTable.Clone
    ModificationsTable = OriginalTable.Clone
    ModificationsTable.PrimaryKey = Nothing

    Dim CurrentVal As String

    For i = 0 To OriginalTable.Rows.Count - 1
        CurrentVal = OriginalTable.Rows(i).Item(myPrimKey).ToString
        Dim foundRow As DataRow = BackupTable.Rows.Find(CurrentVal)
        If foundRow IsNot Nothing Then
            For t = 0 To OriginalTable.Columns.Count - 1
                If Not foundRow.Item(t).ToString = OriginalTable.Rows(i).Item(t).ToString Then
                    ModificationsTable.ImportRow(OriginalTable.Rows(i))
                    'ModificationsTable.Rows(ModificationsTable.Rows.Count - 1).Item(t) = ModificationsTable.Rows(ModificationsTable.Rows.Count - 1).Item(t) & "Modified"
                    ModificationsTable.ImportRow(foundRow)
                End If
            Next


        Else
            AddedTable.ImportRow(OriginalTable.Rows(i))
        End If

    Next

    For i = 0 To BackupTable.Rows.Count - 1
        CurrentVal = BackupTable.Rows(i).Item(myPrimKey).ToString
        Dim foundRow As DataRow = OriginalTable.Rows.Find(CurrentVal)
        If foundRow Is Nothing Then
            DeletedTable.ImportRow(OriginalTable.Rows(i))
        End If

    Next

    If AddedTable.Rows.Count > 0 Then
        Dim myLabel As New Label
        myLabel.Text = "<br/> The following records were added to table " & OriginalTableName & "<br/> <br/>"
        Me.form1.Controls.Add(myLabel)
        Dim myGrid As New GridView
        myGrid.DataSource = AddedTable
        myGrid.DataBind()
        Me.form1.Controls.Add(myGrid)
    End If

    If ModificationsTable.Rows.Count > 0 Then
        Dim myLabel As New Label
        myLabel.Text = "<br/> The following records were modified in table " & OriginalTableName & "<br/> <br/>"
        Me.form1.Controls.Add(myLabel)
        Dim myGrid As New GridView
        myGrid.DataSource = ModificationsTable
        myGrid.DataBind()
        Me.form1.Controls.Add(myGrid)
    End If

    If DeletedTable.Rows.Count > 0 Then
        Dim myLabel As New Label
        myLabel.Text = "<br/> The following records were deleted from table " & OriginalTableName & "<br/> <br/>"
        Me.form1.Controls.Add(myLabel)
        Dim myGrid As New GridView
        myGrid.DataSource = DeletedTable
        myGrid.DataBind()
        Me.form1.Controls.Add(myGrid)
    End If


End Sub

End Class

答案 1 :(得分:0)

我通常使用LINQ

来比较它

这将为您提供一个良好的开端

var SearchResults1 = from u in YourDB.YourUserTable1
                    orderby u.YourColumn
                    select u;

GridView1.DataSource = SearchResults1;
GridView1.DataBind();

var SearchResults2 = from u in YourDB.YourUserTable2
                        orderby u.YourColumn
                        select u;

GridView2.DataSource = SearchResults2;
GridView2.DataBind();

var SearchResults3 = from u1 in SearchResults2
                        where !(from u2 in SearchResults1
                                select u2.YourTablePrimaryKey).Contains(u1.YourTablePrimaryKey)
                        orderby u1.YourColumn
                        select u1;

GridView3.DataSource = SearchResults3;
GridView3.DataBind();

如果您想比较SearchResults1中的内容而不是SearchResults2中的内容,反之亦然,您可以进一步详细说明SearchResults 3