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(Pfms DataSet.Re lations(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.SomeSp ecialGetMe thod) 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.
"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.SomeSp
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
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).
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("Em ployeeSumm ary") 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?
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("Emp loyeesSumm ary") (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?
SummaryRows = Employee.GetChildRows("Emp
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)?
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?
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
pfmsDataSet.Designer.vb.txt.zip
I see these relations:
Me.relationEmployersEmploy ees = Me.Relations("EmployersEmp loyees")
Me.relationUnionsEmployers = Me.Relations("UnionsEmploy ers")
Me.relationFundsUnions = Me.Relations("FundsUnions" )
Me.relationEmployersEmploy ees1 = Me.Relations("EmployersEmp loyees1")
Me.relationEmployeesBalanc es = Me.Relations("EmployeesBal ances")
Me.relationEmployeesFees = Me.Relations("EmployeesFee s")
Me.relationEmployeesSummar y = Me.Relations("EmployeesSum mary")
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?
Me.relationEmployersEmploy
Me.relationUnionsEmployers
Me.relationFundsUnions = Me.Relations("FundsUnions"
Me.relationEmployersEmploy
Me.relationEmployeesBalanc
Me.relationEmployeesFees = Me.Relations("EmployeesFee
Me.relationEmployeesSummar
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?
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?
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?
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?
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?
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?
ASKER
Another interesting solution that doesn't seem to do much for me...
http://channel9.msdn.com/forums/TechOff/151976-Typed-Datasets-GetChildRows-Bug-or-am-I-doing-something-wrong/#Page=1
http://channel9.msdn.com/forums/TechOff/151976-Typed-Datasets-GetChildRows-Bug-or-am-I-doing-something-wrong/#Page=1
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.GetDat a.Count ...)
System.Data.ConstraintExce ption 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.Enab leConstrai nts()
at System.Data.DataTable.set_ EnforceCon straints(B oolean value)
at System.Data.DataTable.EndL oadData()
at System.Data.Common.DataAda pter.FillF romReader( DataSet dataset, DataTable datatable, String srcTable, DataReaderContainer dataReader, Int32 startRecord, Int32 maxRecords, DataColumn parentChapterColumn, Object parentChapterValue)
at System.Data.Common.DataAda pter.Fill( DataTable[ ] dataTables, IDataReader dataReader, Int32 startRecord, Int32 maxRecords)
at System.Data.Common.DbDataA dapter.Fil lInternal( DataSet dataset, DataTable[] datatables, Int32 startRecord, Int32 maxRecords, String srcTable, IDbCommand command, CommandBehavior behavior)
at System.Data.Common.DbDataA dapter.Fil l(DataTabl e[] dataTables, Int32 startRecord, Int32 maxRecords, IDbCommand command, CommandBehavior behavior)
at System.Data.Common.DbDataA dapter.Fil l(DataTabl e dataTable)
at PenFund.pfmsDataSetTableAd apters.Sum maryTableA dapter.Get Data() in C:\Users\Administrator\Doc uments\Yar osh\PenFun d\PenFund\ pfmsDataSe t.Designer .vb:line 21186
at PenFund.ReportViewerWindow .DropDowns Changed() in C:\Users\Administrator\Doc uments\Yar osh\PenFun d\PenFund\ ReportView erWindow.v b:line 1152
at PenFund.ReportToolbarWindo w.Generate Button_Cli ck(Object sender, EventArgs e) in C:\Users\Administrator\Doc uments\Yar osh\PenFun d\PenFund\ ReportTool barWindow. vb:line 148
at System.Windows.Forms.Contr ol.OnClick (EventArgs e)
at System.Windows.Forms.Butto n.OnClick( EventArgs e)
at System.Windows.Forms.Butto n.OnMouseU p(MouseEve ntArgs mevent)
at System.Windows.Forms.Contr ol.WmMouse Up(Message & m, MouseButtons button, Int32 clicks)
at System.Windows.Forms.Contr ol.WndProc (Message& m)
at System.Windows.Forms.Butto nBase.WndP roc(Messag e& m)
at System.Windows.Forms.Butto n.WndProc( Message& m)
at System.Windows.Forms.Contr ol.Control NativeWind ow.OnMessa ge(Message & m)
at System.Windows.Forms.Contr ol.Control NativeWind ow.WndProc (Message& m)
at System.Windows.Forms.Nativ eWindow.De buggableCa llback(Int Ptr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)
at System.Windows.Forms.Unsaf eNativeMet hods.Dispa tchMessage W(MSG& msg)
at System.Windows.Forms.Appli cation.Com ponentMana ger.System .Windows.F orms.Unsaf eNativeMet hods.IMsoC omponentMa nager.FPus hMessageLo op(Int32 dwComponentID, Int32 reason, Int32 pvLoopData)
at System.Windows.Forms.Appli cation.Thr eadContext .RunMessag eLoopInner (Int32 reason, ApplicationContext context)
at System.Windows.Forms.Appli cation.Thr eadContext .RunMessag eLoop(Int3 2 reason, ApplicationContext context)
at System.Windows.Forms.Appli cation.Run (Applicati onContext context)
at Microsoft.VisualBasic.Appl icationSer vices.Wind owsFormsAp plicationB ase.OnRun( )
at Microsoft.VisualBasic.Appl icationSer vices.Wind owsFormsAp plicationB ase.DoAppl icationMod el()
at Microsoft.VisualBasic.Appl icationSer vices.Wind owsFormsAp plicationB ase.Run(St ring[] commandLine)
at PenFund.My.MyApplication.M ain(String [] Args) in 17d14f5c-a337-4978-8281-53 493378c107 1.vb:line 81
at System.AppDomain._nExecute Assembly(A ssembly assembly, String[] args)
at System.AppDomain.nExecuteA ssembly(As sembly assembly, String[] args)
at System.Runtime.Hosting.Man ifestRunne r.Run(Bool ean checkAptModel)
at System.Runtime.Hosting.Man ifestRunne r.ExecuteA sAssembly( )
at System.Runtime.Hosting.App licationAc tivator.Cr eateInstan ce(Activat ionContext activationContext, String[] activationCustomData)
at System.Runtime.Hosting.App licationAc tivator.Cr eateInstan ce(Activat ionContext activationContext)
at System.Activator.CreateIns tance(Acti vationCont ext activationContext)
at Microsoft.VisualStudio.Hos tingProces s.HostProc .RunUsersA ssemblyDeb ugInZone()
at System.Threading.ThreadHel per.Thread Start_Cont ext(Object state)
at System.Threading.Execution Context.Ru n(Executio nContext executionContext, ContextCallback callback, Object state)
at System.Threading.ThreadHel per.Thread Start()
InnerException:
System.Data.ConstraintExce
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.Enab
at System.Data.DataTable.set_
at System.Data.DataTable.EndL
at System.Data.Common.DataAda
at System.Data.Common.DataAda
at System.Data.Common.DbDataA
at System.Data.Common.DbDataA
at System.Data.Common.DbDataA
at PenFund.pfmsDataSetTableAd
at PenFund.ReportViewerWindow
at PenFund.ReportToolbarWindo
at System.Windows.Forms.Contr
at System.Windows.Forms.Butto
at System.Windows.Forms.Butto
at System.Windows.Forms.Contr
at System.Windows.Forms.Contr
at System.Windows.Forms.Butto
at System.Windows.Forms.Butto
at System.Windows.Forms.Contr
at System.Windows.Forms.Contr
at System.Windows.Forms.Nativ
at System.Windows.Forms.Unsaf
at System.Windows.Forms.Appli
at System.Windows.Forms.Appli
at System.Windows.Forms.Appli
at System.Windows.Forms.Appli
at Microsoft.VisualBasic.Appl
at Microsoft.VisualBasic.Appl
at Microsoft.VisualBasic.Appl
at PenFund.My.MyApplication.M
at System.AppDomain._nExecute
at System.AppDomain.nExecuteA
at System.Runtime.Hosting.Man
at System.Runtime.Hosting.Man
at System.Runtime.Hosting.App
at System.Runtime.Hosting.App
at System.Activator.CreateIns
at Microsoft.VisualStudio.Hos
at System.Threading.ThreadHel
at System.Threading.Execution
at System.Threading.ThreadHel
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.
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.
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?
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
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.