Tuesday, September 29, 2015

How to troubleshoot error 20598 - The row was not found at the Subscriber when applying the replicated command

Hi,

This is the error message you will get if the data is modified directly in Subscriber.
There are few steps, if you follow will help you to know the table with some data (basically just the PK) that the command is trying to apply towards subscriber.

Connect to your distributor server:

use distribution
select * from MSrepl_errors order by time desc

This command will give you all the errors occurred in replication.



Extract the command from the value in xact_seqno column above using the following store procedure:


exec dbo.sp_browsereplcmds '0x001927CF000678CD001400000000','0x001927CF000678CD001400000000'


The command column will show the command replication engine is trying to execute with each sp defined with action name on the table and the key value.

Solution:
There are 2 ways you can fix this problem:
  1. Insert the missing data in Subscriber. You might have to do this step more than once. Once replication engine can find that missing row, it will apply the action. You would only need to fill in Primary key columns.
  2. Make a change in the Distribution Agent to skip this error and continue with the replication. Distribution agent accepts the skiperrors parameter which will be 20598 in this case.
HTH

Wednesday, September 9, 2015

Delete duplicate Rows from datatable

Hi,

To delete duplicate rows from datatable in vb.net, first we need to sort table on the keys that will be used to delete rows.

Sort asc if the row to be deleted has highest value.
Sort desc if the row to be deleted has least value of duplicate.

In this example, I want to keep the highest filecount in any duplicated time. So I will sort desc.
In the function below, I pass the datatable that has duplicate set.
I have also cloned of Filedt to store duplicated rows.
Then based on sortString, I will apply select on datatable and return array of rows.
Now when I start looping the rows, I will save the prevRow and then match it with next row. If next row is same, I will save it in prevRow, import in cloned datatable and then delete it.

Private Function RemoveDupsdt(ByRef Filedt As DataTable) As DataTable

        Dim cloneDT As DataTable = Filedt.Clone
        Dim sortString As String = "ProcessingTime asc, FileCount desc"
        Dim prevRow As String = ""
        Dim rowlist As DataRow() = Filedt.Select("", sortString)
        Dim dcIssue As New DataColumn("Issue", GetType(String))
        dcIssue.DefaultValue = "Duplicate"

        For Each dr As DataRow In rowlist
            If prevRow = dr.Item("ProcessingTime")  Then
                prevRow = dr.Item("ProcessingTime")
                cloneDT.ImportRow(dr)
                dr.Delete()
            Else
                prevRow = dr.Item("ProcessingTime")
            End If
        Next

        cloneDT.Columns.Add(dcIssue)
        RemoveDupsdt = cloneDT

    End Function

Friday, September 4, 2015