Not only possible but pretty straightforward. I am going just that with a dataset containing datatables that use datagridviews for input. The dgv use bindingsources as their data source and the bindingsource has the dataset as a its datasource and datatable as datamember.
I serialize the dataset to a varbinary(max) column in SQL Server.
( I use strongly typed properties on my business object, but this should give you the idea )
'-- Copy dataset to property
'-- Establish locals
Dim loFormatter As New BinaryFormatter()
Dim loStream As New System.IO.MemoryStream()
'-- Serialize the business object
loFormatter.Serialize(loStream, Me.DsPolicies1)
'-- Return the created stream
Me.PoliciesBO1.Dataset_Bytes = loStream.ToArray()
When the policy record is navigated, the property is deserialized
If Me.PoliciesBO1.Count > 0 And Me.PoliciesBO1.CurrentRowIndex >= 0 Then
Me.clear_bindingsources()
Dim loformatter As New BinaryFormatter()
Dim lomemorystream As MemoryStream = _
New MemoryStream(Me.PoliciesBO1.Dataset_Bytes, 0, _
Me.PoliciesBO1.Dataset_Bytes.Length, True)
Me.DsPolicies1 = _
CType(loformatter.Deserialize(lomemorystream), dsPolicies)
'-- Rehook datasource
Me.rehook_Bindingsources()
Me.refresh_dgvs()
The last two subs just reset the bindingsource datasource and datamember for each table and then refresh each dgv
( I use these for data gathering to fill PDF Forms )
The only tricky part is remembering the datasource has to be empty on a new record and must be completely reloaded from data after a "parent" record pointer moves.