Solved

DataRelation GetChildRows Returns Nothing or Throws an Exception

Posted on 2008-10-26
19
1,679 Views
Last Modified: 2013-11-07
I'm trying to access related data from a database.  I have a table of employees, a table of balances (hours, etc.), a table of summary data (hours, etc. from past years), and a table of fees.  I have created three Relations using the Visual Studio editor (AKA it's generating the relationship code) based on the EmployeeID.  Now, when I am actually writing my code, I use Employee.GetChildRows(PfmsDataSet.Relations(6)) (or whatever the corresponding index would be).  When I use this, an exception is thrown at run-time:
"The row doesn't belong to the same DataSet as this relation."

So, I tried using Employee.GetSummaryRows (another auto-generated method, and again, using whatever the corresponding table would be).  This throws nothing, but also returns no rows!  I know for a fact that there are rows that should be showing up.  This is really frustrating, as the current method I use is doing individual queries (like SummaryTableAdapter.SomeSpecialGetMethod) for each individual Employee and it takes a very long time to perform (obviously).

Anyone have any ideas?  Is this the best way to go about it?  Thanks ahead of time.  Code below.
'total from summary

Dim SummaryRows() As pfmsDataSet.SummaryRow
 

SummaryRows = .GetSummaryRows 'returns nothing!

'OR (note that only one or the other would normally be uncommented)

SummaryRows = .GetChildRows(PfmsDataSet.Relations(6)) 'throws exception!
 

For Each Child In SummaryRows

    Temp = Child.DollarValue

    If Not Temp.HasValue Then

        Temp = 0

    End If

    Value = Value + Temp

Next

Open in new window

0
Comment
Question by:dyarosh
  • 11
  • 8
19 Comments
 
LVL 96

Expert Comment

by:Bob Learned
ID: 22812643
My first inclination is that you are referencing the wrong DataRelation.  You are able to reference the DataRelation by name, instead of ordinal index (there are overloaded methods to achieve this).
0
 

Author Comment

by:dyarosh
ID: 22817931
I've tried both.  When referenced by ordinal, like I said, it throws the exception, but like you're saying, when I call it by the name I gave it, it does nothing (similar to when I call .GetSummaryRows).  So, you're right, they ordinal index method might be calling the wrong DataRelation, but that still leaves the question as to why the Employee.GetSummaryRows and Employee.GetChildsRows("EmployeeSummary") return nothing at all when I know the data is present.
0
 
LVL 96

Expert Comment

by:Bob Learned
ID: 22818297
So, you are saying that you are filling the Employee table, and the Summary table, and the DataRelation is defined in the correct parent/child direction?
0
 

Author Comment

by:dyarosh
ID: 22991553
Sorry it's been so long, the computer with that project was in repair for a while.... but now that it's back... I am sure that I am filling the tables.  I thought that it might have been the direction (though I doubted it), so I created one in the opposite direction and I still get the same errors.  Though, if I instead use
SummaryRows = Employee.GetChildRows("EmployeesSummary") (the name of the relation, instead of the relation object itself), I get a new, different error.
It states that it cannot cast from a EmployeeDataRow[] to a SummaryRow[].  Again, this appeared to say that my relations were backwards, but even after switching it, it gave me the same casting error... odd, and also, even if I use GetParentRows (which should obviously switch the result types), I still get the same casting error.  Any ideas?
0
 
LVL 96

Expert Comment

by:Bob Learned
ID: 22994202
Would it be possible to show me the proxy code that was generated for the typed DataSet (.Designer file)?
0
 

Author Comment

by:dyarosh
ID: 23001398
Sorry, but which code are you referring to?  There is no designer file for my dataset, only for my forms.  For the dataset, there is a XSC, XSS, and XML Schema file.
0
 
LVL 96

Expert Comment

by:Bob Learned
ID: 23003783
Hmmm...how did you create the DataSet?
0
 

Author Comment

by:dyarosh
ID: 23010205
I'm sorry, that was stupid of me, of course it exists...  I have it attached as plain text, as it won't let me upload the .vb file.  Hopefully it helps!
pfmsDataSet.Designer.vb.txt.zip
0
 
LVL 96

Expert Comment

by:Bob Learned
ID: 23018246
I see these relations:

      Me.relationEmployersEmployees = Me.Relations("EmployersEmployees")
        Me.relationUnionsEmployers = Me.Relations("UnionsEmployers")
        Me.relationFundsUnions = Me.Relations("FundsUnions")
        Me.relationEmployersEmployees1 = Me.Relations("EmployersEmployees1")
        Me.relationEmployeesBalances = Me.Relations("EmployeesBalances")
        Me.relationEmployeesFees = Me.Relations("EmployeesFees")
        Me.relationEmployeesSummary = Me.Relations("EmployeesSummary")

Employers -> Employees
Unions ->  Employers
Funds -> Unions
Employers -> Employees
Employees -> Fees
Employees -> Summary

Which relation are you working with?  Why is there two Employers to Employees relations?
0
Highfive + Dolby Voice = No More Audio Complaints!

Poor audio quality is one of the top reasons people don’t use video conferencing. Get the crispest, clearest audio powered by Dolby Voice in every meeting. Highfive and Dolby Voice deliver the best video conferencing and audio experience for every meeting and every room.

 

Author Comment

by:dyarosh
ID: 23022366
I have no idea why there are two of the same relation... but I'm working with:
Employees -> Fees
Employees -> Summary
Employees -> Balances

Am I correct that these relations mean that if I choose an employee and use one of these relations to get child rows, I should be getting the summary/fees/balances?
0
 
LVL 96

Expert Comment

by:Bob Learned
ID: 23025800
The naming convention is parent/child, so Employees should be the parent, and Summary, Fees, and Balances should be the children.  Does the data integrity bear out that you should be getting data from summary, fees, and balances table?
0
 

Author Comment

by:dyarosh
ID: 23026039
Yes, my intention is to loop through a selected amount of employees.  For each employee, I would like to get information from the summary, fees, and balances tables with matching employee IDs.  Thus I need the parent/child relationships you've stated.  I've also found that the casting error I mentioned earlier is actually a bug in Visual Studio.  I'm trying to work with that right now.
0
 
LVL 96

Expert Comment

by:Bob Learned
ID: 23030870
Do you have a reference to the bug?
0
 

Author Comment

by:dyarosh
ID: 23039274
http://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=114983

Exact problem I'm having, except even after the update it still gives me the same problem.  I realize the bug was for VS2005, so this may not be the cause, but I still don't understand why it's throwing a casting exception.  Any ideas?
0
 

Author Comment

by:dyarosh
ID: 23039349
0
 

Author Comment

by:dyarosh
ID: 23039428
And finally, I now get this error after trying to work with some relations (but it only throws this error on the Summary table).  It occurs even if the relation is removed and even if EnforceContraints property of the dataset is set to false.  The odd thing is that it only occurs occasionally (as in only certain functions on the Summary table adapter, like calling SummaryTableAdapter.GetData.Count ...)

System.Data.ConstraintException was unhandled
  Message="Failed to enable constraints. One or more rows contain values violating non-null, unique, or foreign-key constraints."
  Source="System.Data"
  StackTrace:
       at System.Data.DataTable.EnableConstraints()
       at System.Data.DataTable.set_EnforceConstraints(Boolean value)
       at System.Data.DataTable.EndLoadData()
       at System.Data.Common.DataAdapter.FillFromReader(DataSet dataset, DataTable datatable, String srcTable, DataReaderContainer dataReader, Int32 startRecord, Int32 maxRecords, DataColumn parentChapterColumn, Object parentChapterValue)
       at System.Data.Common.DataAdapter.Fill(DataTable[] dataTables, IDataReader dataReader, Int32 startRecord, Int32 maxRecords)
       at System.Data.Common.DbDataAdapter.FillInternal(DataSet dataset, DataTable[] datatables, Int32 startRecord, Int32 maxRecords, String srcTable, IDbCommand command, CommandBehavior behavior)
       at System.Data.Common.DbDataAdapter.Fill(DataTable[] dataTables, Int32 startRecord, Int32 maxRecords, IDbCommand command, CommandBehavior behavior)
       at System.Data.Common.DbDataAdapter.Fill(DataTable dataTable)
       at PenFund.pfmsDataSetTableAdapters.SummaryTableAdapter.GetData() in C:\Users\Administrator\Documents\Yarosh\PenFund\PenFund\pfmsDataSet.Designer.vb:line 21186
       at PenFund.ReportViewerWindow.DropDownsChanged() in C:\Users\Administrator\Documents\Yarosh\PenFund\PenFund\ReportViewerWindow.vb:line 1152
       at PenFund.ReportToolbarWindow.GenerateButton_Click(Object sender, EventArgs e) in C:\Users\Administrator\Documents\Yarosh\PenFund\PenFund\ReportToolbarWindow.vb:line 148
       at System.Windows.Forms.Control.OnClick(EventArgs e)
       at System.Windows.Forms.Button.OnClick(EventArgs e)
       at System.Windows.Forms.Button.OnMouseUp(MouseEventArgs mevent)
       at System.Windows.Forms.Control.WmMouseUp(Message& m, MouseButtons button, Int32 clicks)
       at System.Windows.Forms.Control.WndProc(Message& m)
       at System.Windows.Forms.ButtonBase.WndProc(Message& m)
       at System.Windows.Forms.Button.WndProc(Message& m)
       at System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)
       at System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
       at System.Windows.Forms.NativeWindow.DebuggableCallback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)
       at System.Windows.Forms.UnsafeNativeMethods.DispatchMessageW(MSG& msg)
       at System.Windows.Forms.Application.ComponentManager.System.Windows.Forms.UnsafeNativeMethods.IMsoComponentManager.FPushMessageLoop(Int32 dwComponentID, Int32 reason, Int32 pvLoopData)
       at System.Windows.Forms.Application.ThreadContext.RunMessageLoopInner(Int32 reason, ApplicationContext context)
       at System.Windows.Forms.Application.ThreadContext.RunMessageLoop(Int32 reason, ApplicationContext context)
       at System.Windows.Forms.Application.Run(ApplicationContext context)
       at Microsoft.VisualBasic.ApplicationServices.WindowsFormsApplicationBase.OnRun()
       at Microsoft.VisualBasic.ApplicationServices.WindowsFormsApplicationBase.DoApplicationModel()
       at Microsoft.VisualBasic.ApplicationServices.WindowsFormsApplicationBase.Run(String[] commandLine)
       at PenFund.My.MyApplication.Main(String[] Args) in 17d14f5c-a337-4978-8281-53493378c1071.vb:line 81
       at System.AppDomain._nExecuteAssembly(Assembly assembly, String[] args)
       at System.AppDomain.nExecuteAssembly(Assembly assembly, String[] args)
       at System.Runtime.Hosting.ManifestRunner.Run(Boolean checkAptModel)
       at System.Runtime.Hosting.ManifestRunner.ExecuteAsAssembly()
       at System.Runtime.Hosting.ApplicationActivator.CreateInstance(ActivationContext activationContext, String[] activationCustomData)
       at System.Runtime.Hosting.ApplicationActivator.CreateInstance(ActivationContext activationContext)
       at System.Activator.CreateInstance(ActivationContext activationContext)
       at Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssemblyDebugInZone()
       at System.Threading.ThreadHelper.ThreadStart_Context(Object state)
       at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
       at System.Threading.ThreadHelper.ThreadStart()
  InnerException:
0
 
LVL 96

Expert Comment

by:Bob Learned
ID: 23042268
1) That error sometimes can mean that your data doesn't comply to the unique constraint that is inferred from the database schema.

2) I don't like using the typed DataSet, since there are so many headaches that stem from trying to make it work the way you want it to.

3) I have used other technologies, like NHibernate, CoolStorage.NET, CSLA and even simple data layer classes.
0
 

Author Comment

by:dyarosh
ID: 23047737
Well honestly I can't rework how my entire database interfacing works.  This is the very last piece of a large project and there isn't any way that I can use different products at this point.  Also, why would the database information not conform to unique constraints?  Wouldn't it cause an error when the data is inserted if the data weren't unique?  I've even tried re-adding all of the data fresh and I get the same issue.

And there must be some(!) reason why no matter what, any calls for child or parents rows return nothing at all.  Are there any more suggestions as to something I could have done or missed to cause this issue?
0
 

Accepted Solution

by:
dyarosh earned 0 total points
ID: 23061551
Hmm, OK, I've ended up using a completely different method with Dictionaries and such and it works quite well.  I realize the pitfalls of it, but since there is no obvious or simple way (at this point in the stage) to use Child Rows, I'm going to have to stick with this.  But it creates a dictionary with the employee ID as the keys and the sums of hours or dollars as the value.  Thanks for the help though!
0

Featured Post

Complete VMware vSphere® ESX(i) & Hyper-V Backup

Capture your entire system, including the host, with patented disk imaging integrated with VMware VADP / Microsoft VSS and RCT. RTOs is as low as 15 seconds with Acronis Active Restore™. You can enjoy unlimited P2V/V2V migrations from any source (even from a different hypervisor)

Join & Write a Comment

Suggested Solutions

Title # Comments Views Activity
Get the ms access version 4 34
Showdialog 8 21
Recording mileage on a form 2 11
Vb.Net Date Formatting Assistance 4 16
Introduction When developing Access applications, often we need to know whether an object exists.  This article presents a quick and reliable routine to determine if an object exists without that object being opened. If you wanted to inspect/ite…
If you need to start windows update installation remotely or as a scheduled task you will find this very helpful.
In Microsoft Access, learn the trick to repeating sub-report headings at the top of each page. The problem with sub-reports and headings: Add a dummy group to the sub report using the expression =1: Set the “Repeat Section” property of the dummy…
With Microsoft Access, learn how to start a database in different ways and produce different start-up actions allowing you to use a single database to perform multiple tasks. Specify a start-up form through options: Specify an Autoexec macro: Us…

760 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question

Need Help in Real-Time?

Connect with top rated Experts

22 Experts available now in Live!

Get 1:1 Help Now