.NETGURU
Breaking change in .NET 1.1 SP1 DataTable - Repro provided
Messages   Related Types
This message was discovered on microsoft.public.dotnet.framework.adonet.
Responses highlighted in red are from those people who are likely to be able to contribute good, authoratitive information to this discussion. They include Microsoft employees, MVP's and others who IMHO contribute well to these kinds of discussions.
Post a new message to this list...

Urs Eichmann
The following piece of code will run fine in .NET 1.1 without SP1, but
will throw a NullReferenceException in SP1. Sadly, our app no longer
runs with SP1, since it uses the same pattern (changing another row of
data inside a ListChanged event of a DataView).

Could please someone from Microsoft confirm this as a bug, and/or
provide a workaround?

Regards,
Urs

run the following as a console app:

[VB.NET]

Imports System.Data

Module Module1

Private dt As DataTable
Private b As Boolean

Sub Main()

dt = New System.Data.DataTable
dt.Columns.Add("Col1", GetType(String))
dt.Columns.Add("Col2", GetType(String))

Dim dv As New DataView(dt, "", "Col1",
DataViewRowState.CurrentRows)
AddHandler dv.ListChanged, AddressOf OnListchanged
Dim dv2 As New DataView(dt, "", "Col2",
DataViewRowState.CurrentRows)
AddHandler dv2.ListChanged, AddressOf OnListchanged

dt.Rows.Add(New Object() {"a", "b"}) ' NullRefException will be
thrown here

End Sub

Private Sub OnListchanged(ByVal s As Object, ByVal e As
System.ComponentModel.ListChangedEventArgs)

If b Then Return
b = True ' don't want recursive calling

dt.Rows.Add(New Object() {"c", "d"})

End Sub

End Module
Reply to this message...
 
    
Angel Saenz-Badillos[MS] (VIP)
Urs,
Thanks for posting this, the DataTable is not really my area but I have
forwarded your post and I will let you know as soon as I get any info.

--
Angel Saenz-Badillos [MS] Managed Providers
This posting is provided "AS IS", with no warranties, and confers no
rights.Please do not send email directly to this alias.
This alias is for newsgroup purposes only.
I am now blogging about ADO.NET: http://weblogs.asp.net/angelsb/

"Urs Eichmann" <Click here to reveal e-mail address> wrote in message
news:Click here to reveal e-mail address...
[Original message clipped]

Reply to this message...
 
    
Angel Saenz-Badillos[MS] (VIP)
Uris,
This is the response that I got from the dataset team:
"This is an unsupported scenario. Any "write" operations on DataSet in an
event handler will result in an unpredictable behavior.
I'd suggest an alternative way of solving his scenario."

I am not sure of what they mean with alternative solution, but it is true
that "touching" the datatable in multiple threads is not supported. You can
probably get arround this limitation by binding on the UI thread before
calling the Add method with something like this (please excuse the code
hack, I am doing copy paste from a c# project I had laying arround,
hopefully you can get the idea of what to look for from here). The basic
concept is that you can only call datatable add on the same thread in which
you created the datatable, in this case we assume you created it on the main
thread.

delegate void UICallback( object param );

void ReBindOnUIThread( object param )
{
//This method will run in the main thread, we can touch the DataTable
here:
dt.Rows.Add(New Object() {"c", "d"})
}

Private Sub OnListchanged(ByVal s As Object, ByVal e As
System.ComponentModel.ListChangedEventArgs)

If b Then Return
b = True ' don't want recursive calling
//you can't touch the datatable here since we are in a different
thread
//dt.Rows.Add(New Object() {"c", "d"})
//instead we rebind on the ui thread using the delegate
this.Invoke( new UICallback( ReBindOnUIThread ), new object[] {
<myobject>} );

End Sub

--
Angel Saenz-Badillos [MS] Managed Providers
This posting is provided "AS IS", with no warranties, and confers no
rights.Please do not send email directly to this alias.
This alias is for newsgroup purposes only.
I am now blogging about ADO.NET: http://weblogs.asp.net/angelsb/

[Original message clipped]

Reply to this message...
 
    
Urs Eichmann
Angel,
I don't agree with this answer, for these reasons:

a) the event occurs on the *same* thread as the main program, so it is
*not* a multi-threading problem (you can see for yourself if you watch
it in the debugger). So using "Invoke" won't make any difference IMHO.

b) It is *not* documented anywhere that "write" operations in an
EventHandler are not supported (at least I couldn't find this in the docs)

c) This code ran fine *without* SP1, in fact even back with .NET 1.0
there was no problem.

d) I couldn't find any hint in the SP1 docs that there are
incompatiblities to be expected in the DataView class between RTM and SP1.

I modified the repro program so that the event doesn't add a new row,
but changes the one just added. This is quite a common scenario: Apply
calculated values into certain columns of a new row which the user just
entered. This worked with pre-SP1 releases, but no longer works now. I
think this is a serious thing which shouldn't be taken on the light
shoulder. At least there should be a KB article which explains a workaround.

-------- Start Repro -----

Imports System.Data

Module Module1

Private dt As DataTable
Private dv, dv2 As DataView

Sub Main()

dt = New System.Data.DataTable
dt.Columns.Add("Col1", GetType(String))
dt.Columns.Add("Col2", GetType(String))

dv = New DataView(dt, "", "Col1", DataViewRowState.CurrentRows)
AddHandler dv.ListChanged, AddressOf OnListchanged

' The program only fails if there is more than one View, so
create a second one
dv2 = New DataView(dt, "", "Col2", DataViewRowState.CurrentRows)

dt.Rows.Add(New Object() {"a", "b"}) ' NullReferenceExeption
occurs here

End Sub

Private Sub X()

End Sub

Private Sub OnListchanged(ByVal s As Object, ByVal e As
System.ComponentModel.ListChangedEventArgs)

Static recusive As Boolean
If recusive Then Return
recusive = True

' Modify the row which was just added
Dim r As DataRowView = dv.Item(e.NewIndex)
r.BeginEdit()
r("Col2") = "xxx"
r.EndEdit()

End Sub

End Module

---- End Repro ---------

Best regards,
Urs

Angel Saenz-Badillos[MS] wrote:
[Original message clipped]

Reply to this message...
 
    
Angel Saenz-Badillos[MS] (VIP)
Urs,
I have pointed Ravi from the dataset team to this thread, hopefully he will
be able to help.

--
Angel Saenz-Badillos [MS] Managed Providers
This posting is provided "AS IS", with no warranties, and confers no
rights.Please do not send email directly to this alias.
This alias is for newsgroup purposes only.
I am now blogging about ADO.NET: http://weblogs.asp.net/angelsb/

"Urs Eichmann" <Click here to reveal e-mail address> wrote in message
news:Click here to reveal e-mail address...
[Original message clipped]

Reply to this message...
 
    
Mayo (VIP)
With the installation of SP1 also an app of mine started to work badly for
other reasons: if you are interested in the thread look:
http://msdn.microsoft.com/communities/newsgroups/en-us/default.aspx?query=sp1&dg=microsoft.public.dotnet.framework.adonet&cat=en-us-netdevelopment&lang=en&cr=US&pt=&catlist=DEA2432D-EA76-4E5B-AF80-E56902048BAD&dglist=&ptlist=&exp=&sloc=en-us

If you have any suggestion...

"Angel Saenz-Badillos[MS]" wrote:

[Original message clipped]

Reply to this message...
 
 
System.ComponentModel.ListChangedEventArgs
System.Data.DataRowView
System.Data.DataSet
System.Data.DataTable
System.Data.DataView
System.Data.DataViewRowState
System.EventHandler
System.NullReferenceException




ExamGuru IT Solutions - .Net Guru is owned and operated by ExamGuru, Inc., the man behind .Net Guru. If you're in the market for bespoke software or software consultancy, why not get him and his highly trained team to help? - www.examguru.net/ITCertification
Ad


Need Dot Net Interview Questions?
Ask ExamGuru, Inc. for advice and help on Passing .Net Interviews
.Net Projects
Best-of-breed application framework for .NET projects, developed by ExamGuru, Inc. and ExamGuru IT
Free .net Help
Commission ExamGuru, Inc. and his team for your next bespoke software project
FogBUGZ
The only bug tracking system carefully crafted with one goal in mind: helping teams create great software.
Awesome Tools
If you don't know about these, you're missing out... IT Certification Questions
IT Interview Questions
Free Oracle 10g Training
MCSE Boortcamp
Cisco Study Guides
Cheap Study Guides
Exact Questions
Dot Net Interview Questions
Oracle OCP
Cheap Travel
Designer Perfumes - Wholesale Prices
Free Programming Tutorials
 
ExamGuru IT Solutions - .Net Guru is owned and operated by ExamGuru, Inc., the man behind .Net Guru. If you're in the market for bespoke software or software consultancy, why not get him and his highly trained team to help? - www.examguru.net/ITCertification
 Copyright © ExamGuru, Inc. 2001-2006
Contact Us - Terms of Use - Privacy Policy - www.dot-net-guru.com - www.examguru.net - www.oraclesource.net - www.itinterviews.net - www.examguru.net/ITCertification