Solved

DataRelation GetChildRows Returns Nothing or Throws an Exception

Posted on 2008-10-26
19
1,690 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
Comprehensive Backup Solutions for Microsoft

Acronis protects the complete Microsoft technology stack: Windows Server, Windows PC, laptop and Surface data; Microsoft business applications; Microsoft Hyper-V; Azure VMs; Microsoft Windows Server 2016; Microsoft Exchange 2016 and SQL Server 2016.

 

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
 

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)

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

It’s been over a month into 2017, and there is already a sophisticated Gmail phishing email making it rounds. New techniques and tactics, have given hackers a way to authentically impersonate your contacts.How it Works The attack works by targeti…
Preparing an email is something we should all take special care with – especially when the email is for somebody you may not know very well. The pressures of everyday working life stacked with a hectic office environment can make this a real challen…
Learn how to number pages in an Access report over each group. Activate two pass printing by referencing the pages property: Add code to the Page Footers OnFormat event to capture the pages as there occur for each group. Use the pages property to …
The viewer will learn how to use NetBeans IDE 8.0 for Windows to connect to a MySQL database. Open Services Panel: Create a new connection using New Connection Wizard: Create a test database called eetutorial: Create a new test tabel called ee…

810 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