Link to home
Start Free TrialLog in
Avatar of dyarosh
dyarosh

asked on

DataRelation GetChildRows Returns Nothing or Throws an Exception

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

Avatar of Bob Learned
Bob Learned
Flag of United States of America image

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).
Avatar of dyarosh
dyarosh

ASKER

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.
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?
Avatar of dyarosh

ASKER

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?
Would it be possible to show me the proxy code that was generated for the typed DataSet (.Designer file)?
Avatar of dyarosh

ASKER

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.
Hmmm...how did you create the DataSet?
Avatar of dyarosh

ASKER

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
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?
Avatar of dyarosh

ASKER

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?
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?
Avatar of dyarosh

ASKER

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.
Do you have a reference to the bug?
Avatar of dyarosh

ASKER

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?
Avatar of dyarosh

ASKER

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:
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.
Avatar of dyarosh

ASKER

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?
ASKER CERTIFIED SOLUTION
Avatar of dyarosh
dyarosh

Link to home
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
Start Free Trial