// This example shows how to subscribe to all dataset messages on an OPC-UA PubSub connection with UDP UADP mapping.
//
// In order to produce network messages for this example, run the UADemoPublisher tool. For documentation, see
// http://kb.opclabs.com/UADemoPublisher_Basics . In some cases, you may have to specify the interface name to be used.
#include "stdafx.h" // Includes "QuickOpc.h", and other commonly used files
#include <atlcom.h>
#include "SubscribeDataSet.h"
namespace PubSub
{
namespace _EasyUASubscriber
{
// CEasyUASubscriberEvents
class CEasyUASubscriberEvents : public IDispEventImpl<1, CEasyUASubscriberEvents>
{
public:
BEGIN_SINK_MAP(CEasyUASubscriberEvents)
// Event handlers must have the __stdcall calling convention
SINK_ENTRY(1, DISPID_EASYUASUBSCRIBEREVENTS_DATASETMESSAGE, &CEasyUASubscriberEvents::DataSetMessage)
END_SINK_MAP()
public:
// The handler for EasyUAClient.DataChangeNotification event
STDMETHOD(DataSetMessage)(VARIANT varSender, _EasyUADataSetMessageEventArgs* pEventArgs)
{
// Display the dataset.
if (pEventArgs->Succeeded)
{
_UADataSetDataPtr DataSetDataPtr = pEventArgs->DataSetData;
// An event with null DataSetData just indicates a successful connection.
if (DataSetDataPtr != NULL)
{
_tprintf(_T("\n"));
_tprintf(_T("Dataset data: %s\n"), (LPCTSTR)CW2CT(DataSetDataPtr->ToString));
IEnumVARIANTPtr EnumDictionaryEntry2Ptr = DataSetDataPtr->FieldDataDictionary->GetEnumerator();
_variant_t vDictionaryEntry2;
while (EnumDictionaryEntry2Ptr->Next(1, &vDictionaryEntry2, NULL) == S_OK)
{
_DictionaryEntry2Ptr DictionaryEntry2Ptr(vDictionaryEntry2);
_tprintf(_T("%s\n"), (LPCTSTR)CW2CT(DictionaryEntry2Ptr->ToString));
vDictionaryEntry2.Clear();
}
}
}
else
{
_tprintf(_T("\n"));
_tprintf(_T("*** Failure: %s\n"), (LPCTSTR)CW2CT(pEventArgs->ErrorMessageBrief));
}
return S_OK;
}
};
void SubscribeDataSet::Main1()
{
// Initialize the COM library
CoInitializeEx(NULL, COINIT_MULTITHREADED);
{
// Prepare arguments for a subscription to the dataset.
_EasyUASubscribeDataSetArgumentsPtr SubscribeDataSetArgumentsPtr(__uuidof(EasyUASubscribeDataSetArguments));
// Define the PubSub connection we will work with.
_UAPubSubConnectionDescriptorPtr PubSubConnectionDescriptorPtr =
SubscribeDataSetArgumentsPtr->DataSetSubscriptionDescriptor->ConnectionDescriptor;
PubSubConnectionDescriptorPtr->ResourceAddress->ResourceDescriptor->UrlString = L"opc.udp://239.0.0.1";
// In some cases you may have to set the interface (network adapter) name that needs to be used, similarly to
// the statement below. Your actual interface name may differ, of course.
//PubSubConnectionDescriptorPtr->ResourceAddress->InterfaceName = L"Ethernet";
// Instantiate the subscriber object.
_EasyUASubscriberPtr SubscriberPtr(__uuidof(EasyUASubscriber));
// Hook events.
CEasyUASubscriberEvents* pSubscriberEvents = new CEasyUASubscriberEvents();
AtlGetObjectSourceInterface(SubscriberPtr, &pSubscriberEvents->m_libid, &pSubscriberEvents->m_iid,
&pSubscriberEvents->m_wMajorVerNum, &pSubscriberEvents->m_wMinorVerNum);
pSubscriberEvents->m_iid = _uuidof(DEasyUASubscriberEvents);
pSubscriberEvents->DispEventAdvise(SubscriberPtr, &pSubscriberEvents->m_iid);
_tprintf(_T("Subscribing...\n"));
_variant_t vSubscribeDataSetArguments(SubscribeDataSetArgumentsPtr.GetInterfacePtr());
SubscriberPtr->SubscribeDataSet(vSubscribeDataSetArguments);
_tprintf(_T("Processing dataset message events for 20 seconds...\n"));
Sleep(20 * 1000);
_tprintf(_T("Unsubscribing...\n"));
SubscriberPtr->UnsubscribeAllDataSets();
_tprintf(_T("Waiting for 1 second...\n"));
// Unsubscribe operation is asynchronous, messages may still come for a short while.
Sleep(1 * 1000);
// Unhook events
pSubscriberEvents->DispEventUnadvise(SubscriberPtr, &pSubscriberEvents->m_iid);
_tprintf(_T("Finished.\n"));
}
// Release all interface pointers BEFORE calling CoUninitialize()
CoUninitialize();
}
// Example output:
//
//Subscribing...
//Processing dataset message events for 20 seconds...
//
////Dataset data: Good; Data; publisher="32", writer=1, class=eae79794-1af7-4f96-8401-4096cd1d8908, fields: 4
//[#0, True {System.Boolean} @0001-01-01T00:00:00.000 @@0001-01-01T00:00:00.000; Good]
//[#1, 7945 {System.Int32} @0001-01-01T00:00:00.000 @@0001-01-01T00:00:00.000; Good]
//[#2, 5246 {System.Int32} @0001-01-01T00:00:00.000 @@0001-01-01T00:00:00.000; Good]
//[#3, 9/30/2019 11:19:14 AM {System.DateTime} @0001-01-01T00:00:00.000 @@0001-01-01T00:00:00.000; Good]
//
//Dataset data: Good; Data; publisher="32", writer=3, class=96976b7b-0db7-46c3-a715-0979884b55ae, fields: 100
//[#0, 45 {System.Int64} @0001-01-01T00:00:00.000 @@0001-01-01T00:00:00.000; Good]
//[#1, 145 {System.Int64} @0001-01-01T00:00:00.000 @@0001-01-01T00:00:00.000; Good]
//[#2, 245 {System.Int64} @0001-01-01T00:00:00.000 @@0001-01-01T00:00:00.000; Good]
//[#3, 345 {System.Int64} @0001-01-01T00:00:00.000 @@0001-01-01T00:00:00.000; Good]
//[#4, 445 {System.Int64} @0001-01-01T00:00:00.000 @@0001-01-01T00:00:00.000; Good]
//[#5, 545 {System.Int64} @0001-01-01T00:00:00.000 @@0001-01-01T00:00:00.000; Good]
//[#6, 645 {System.Int64} @0001-01-01T00:00:00.000 @@0001-01-01T00:00:00.000; Good]
//[#7, 745 {System.Int64} @0001-01-01T00:00:00.000 @@0001-01-01T00:00:00.000; Good]
//[#8, 845 {System.Int64} @0001-01-01T00:00:00.000 @@0001-01-01T00:00:00.000; Good]
//[#9, 945 {System.Int64} @0001-01-01T00:00:00.000 @@0001-01-01T00:00:00.000; Good]
//[#10, 1045 {System.Int64} @0001-01-01T00:00:00.000 @@0001-01-01T00:00:00.000; Good]
//...
}
}
// This example shows how to subscribe to all dataset messages on an OPC-UA PubSub connection with UDP UADP mapping.
//
// In order to produce network messages for this example, run the UADemoPublisher tool. For documentation, see
// http://kb.opclabs.com/UADemoPublisher_Basics . In some cases, you may have to specify the interface name to be used.
type
TSubscriberEventHandlers77 = class
procedure OnDataSetMessage(
ASender: TObject;
sender: OleVariant;
const eventArgs: _EasyUADataSetMessageEventArgs);
end;
class procedure SubscribeDataSet.Main1;
var
ConnectionDescriptor: _UAPubSubConnectionDescriptor;
SubscribeDataSetArguments: _EasyUASubscribeDataSetArguments;
Subscriber: TEasyUASubscriber;
SubscriberEventHandlers: TSubscriberEventHandlers77;
begin
// Define the PubSub connection we will work with.
SubscribeDataSetArguments := CoEasyUASubscribeDataSetArguments.Create;
ConnectionDescriptor := SubscribeDataSetArguments.DataSetSubscriptionDescriptor.ConnectionDescriptor;
ConnectionDescriptor.ResourceAddress.ResourceDescriptor.UrlString := 'opc.udp://239.0.0.1';
// In some cases you may have to set the interface (network adapter) name that needs to be used, similarly to
// the statement below. Your actual interface name may differ, of course.
//ConnectionDescriptor.ResourceAddress.InterfaceName := 'Ethernet';
// Instantiate the subscriber object and hook events.
Subscriber := TEasyUASubscriber.Create(nil);
SubscriberEventHandlers := TSubscriberEventHandlers77.Create;
Subscriber.OnDataSetMessage := SubscriberEventHandlers.OnDataSetMessage;
WriteLn('Subscribing...');
Subscriber.SubscribeDataSet(SubscribeDataSetArguments);
WriteLn('Processing dataset message for 20 seconds...');
PumpSleep(20*1000);
WriteLn('Unsubscribing...');
Subscriber.UnsubscribeAllDataSets;
WriteLn('Waiting for 1 second...');
// Unsubscribe operation is asynchronous, messages may still come for a short while.
PumpSleep(1*1000);
WriteLn('Finished.');
FreeAndNil(Subscriber);
FreeAndNil(SubscriberEventHandlers);
end;
procedure TSubscriberEventHandlers77.OnDataSetMessage(
ASender: TObject;
sender: OleVariant;
const eventArgs: _EasyUADataSetMessageEventArgs);
var
Count: Cardinal;
DictionaryEntry2: _DictionaryEntry2;
Element: OleVariant;
FieldDataDictionaryEnumerator: IEnumVariant;
begin
// Display the dataset.
if eventArgs.Succeeded then
begin
// An event with null DataSetData just indicates a successful connection.
if eventArgs.DataSetData <> nil then
begin
WriteLn;
WriteLn('Dataset data: ', eventArgs.DataSetData.ToString);
FieldDataDictionaryEnumerator := eventArgs.DataSetData.FieldDataDictionary.GetEnumerator;
while (FieldDataDictionaryEnumerator.Next(1, Element, Count) = S_OK) do
begin
DictionaryEntry2 := IUnknown(Element) as _DictionaryEntry2;
WriteLn(DictionaryEntry2.ToString);
end;
end;
end
else begin
WriteLn;
WriteLn('*** Failure: ', eventArgs.ErrorMessageBrief);
end;
end;
// Example output:
//
//Subscribing...
//Processing dataset message events for 20 seconds...
//
////Dataset data: Good; Data; publisher="32", writer=1, class=eae79794-1af7-4f96-8401-4096cd1d8908, fields: 4
//[#0, True {System.Boolean} @0001-01-01T00:00:00.000 @@0001-01-01T00:00:00.000; Good]
//[#1, 7945 {System.Int32} @0001-01-01T00:00:00.000 @@0001-01-01T00:00:00.000; Good]
//[#2, 5246 {System.Int32} @0001-01-01T00:00:00.000 @@0001-01-01T00:00:00.000; Good]
//[#3, 9/30/2019 11:19:14 AM {System.DateTime} @0001-01-01T00:00:00.000 @@0001-01-01T00:00:00.000; Good]
//
//Dataset data: Good; Data; publisher="32", writer=3, class=96976b7b-0db7-46c3-a715-0979884b55ae, fields: 100
//[#0, 45 {System.Int64} @0001-01-01T00:00:00.000 @@0001-01-01T00:00:00.000; Good]
//[#1, 145 {System.Int64} @0001-01-01T00:00:00.000 @@0001-01-01T00:00:00.000; Good]
//[#2, 245 {System.Int64} @0001-01-01T00:00:00.000 @@0001-01-01T00:00:00.000; Good]
//[#3, 345 {System.Int64} @0001-01-01T00:00:00.000 @@0001-01-01T00:00:00.000; Good]
//[#4, 445 {System.Int64} @0001-01-01T00:00:00.000 @@0001-01-01T00:00:00.000; Good]
//[#5, 545 {System.Int64} @0001-01-01T00:00:00.000 @@0001-01-01T00:00:00.000; Good]
//[#6, 645 {System.Int64} @0001-01-01T00:00:00.000 @@0001-01-01T00:00:00.000; Good]
//[#7, 745 {System.Int64} @0001-01-01T00:00:00.000 @@0001-01-01T00:00:00.000; Good]
//[#8, 845 {System.Int64} @0001-01-01T00:00:00.000 @@0001-01-01T00:00:00.000; Good]
//[#9, 945 {System.Int64} @0001-01-01T00:00:00.000 @@0001-01-01T00:00:00.000; Good]
//[#10, 1045 {System.Int64} @0001-01-01T00:00:00.000 @@0001-01-01T00:00:00.000; Good]
//...
// This example shows how to subscribe to all dataset messages on an OPC-UA PubSub connection with UDP UADP mapping.
//
// In order to produce network messages for this example, run the UADemoPublisher tool. For documentation, see
// http://kb.opclabs.com/UADemoPublisher_Basics . In some cases, you may have to specify the interface name to be used.
class SubscriberEvents {
function DataSetMessage($Sender, $E)
{
// Display the dataset.
if ($E->Succeeded) {
// An event with null DataSetData just indicates a successful connection.
printf("\n");
printf("Dataset data: %s\n", $E->DataSetData);
foreach ($E->DataSetData->FieldDataDictionary as $Pair)
printf("%s\n", $Pair);
}
else {
printf("\n");
printf("*** Failure: %s\n", $E->ErrorMessageBrief);
}
}
}
// Define the PubSub connection we will work with.
$SubscribeDataSetArguments = new COM("OpcLabs.EasyOpc.UA.PubSub.OperationModel.EasyUASubscribeDataSetArguments");
$ConnectionDescriptor = $SubscribeDataSetArguments->DataSetSubscriptionDescriptor->ConnectionDescriptor;
$ConnectionDescriptor->ResourceAddress->ResourceDescriptor->UrlString = "opc.udp://239.0.0.1";
// In some cases you may have to set the interface (network adapter) name that needs to be used, similarly to
// the statement below. Your actual interface name may differ, of course.
$ConnectionDescriptor->ResourceAddress->InterfaceName = "Ethernet";
// Instantiate the subscriber object and hook events.
$Subscriber = new COM("OpcLabs.EasyOpc.UA.PubSub.EasyUASubscriber");
$SubscriberEvents = new SubscriberEvents();
com_event_sink($Subscriber, $SubscriberEvents, "DEasyUASubscriberEvents");
printf("Subscribing...\n");
$Subscriber->SubscribeDataSet($SubscribeDataSetArguments);
printf("Processing dataset message events for 20 seconds...");
$startTime = time();
do {
com_message_pump(1000);
} while (time() < $startTime + 20);
printf("Unsubscribing...\n");
$Subscriber->UnsubscribeAllDataSets;
printf("Waiting for 1 second...");
// Unsubscribe operation is asynchronous, messages may still come for a short while.
$startTime = time();
do {
com_message_pump(1000);
} while (time() < $startTime + 1);
printf("Finished.\n");
// Example output:
//
//Subscribing...
//Processing dataset message events for 20 seconds...
//
////Dataset data: Good; Data; publisher="32", writer=1, class=eae79794-1af7-4f96-8401-4096cd1d8908, fields: 4
//[#0, True {System.Boolean} @0001-01-01T00:00:00.000 @@0001-01-01T00:00:00.000; Good]
//[#1, 7945 {System.Int32} @0001-01-01T00:00:00.000 @@0001-01-01T00:00:00.000; Good]
//[#2, 5246 {System.Int32} @0001-01-01T00:00:00.000 @@0001-01-01T00:00:00.000; Good]
//[#3, 9/30/2019 11:19:14 AM {System.DateTime} @0001-01-01T00:00:00.000 @@0001-01-01T00:00:00.000; Good]
//
//Dataset data: Good; Data; publisher="32", writer=3, class=96976b7b-0db7-46c3-a715-0979884b55ae, fields: 100
//[#0, 45 {System.Int64} @0001-01-01T00:00:00.000 @@0001-01-01T00:00:00.000; Good]
//[#1, 145 {System.Int64} @0001-01-01T00:00:00.000 @@0001-01-01T00:00:00.000; Good]
//[#2, 245 {System.Int64} @0001-01-01T00:00:00.000 @@0001-01-01T00:00:00.000; Good]
//[#3, 345 {System.Int64} @0001-01-01T00:00:00.000 @@0001-01-01T00:00:00.000; Good]
//[#4, 445 {System.Int64} @0001-01-01T00:00:00.000 @@0001-01-01T00:00:00.000; Good]
//[#5, 545 {System.Int64} @0001-01-01T00:00:00.000 @@0001-01-01T00:00:00.000; Good]
//[#6, 645 {System.Int64} @0001-01-01T00:00:00.000 @@0001-01-01T00:00:00.000; Good]
//[#7, 745 {System.Int64} @0001-01-01T00:00:00.000 @@0001-01-01T00:00:00.000; Good]
//[#8, 845 {System.Int64} @0001-01-01T00:00:00.000 @@0001-01-01T00:00:00.000; Good]
//[#9, 945 {System.Int64} @0001-01-01T00:00:00.000 @@0001-01-01T00:00:00.000; Good]
//[#10, 1045 {System.Int64} @0001-01-01T00:00:00.000 @@0001-01-01T00:00:00.000; Good]
//...
Rem This example shows how to subscribe to all dataset messages on an OPC-UA PubSub connection with UDP UADP mapping.
Rem
Rem In order to produce network messages for this example, run the UADemoPublisher tool. For documentation, see
Rem http://kb.opclabs.com/UADemoPublisher_Basics . In some cases, you may have to specify the interface name to be used.
' The subscriber object, with events
'Public WithEvents Subscriber2 As EasyUASubscriber
Private Sub EasyUASubscriber_SubscribeDataSet_Main1_Command_Click()
OutputText = ""
' Define the PubSub connection we will work with.
Dim subscribeDataSetArguments As New EasyUASubscribeDataSetArguments
Dim ConnectionDescriptor As UAPubSubConnectionDescriptor
Set ConnectionDescriptor = subscribeDataSetArguments.dataSetSubscriptionDescriptor.ConnectionDescriptor
ConnectionDescriptor.ResourceAddress.ResourceDescriptor.UrlString = "opc.udp://239.0.0.1"
' In some cases you may have to set the interface (network adapter) name that needs to be used, similarly to
' the statement below. Your actual interface name may differ, of course.
'ConnectionDescriptor.ResourceAddress.InterfaceName := 'Ethernet';
' Instantiate the subscriber object and hook events.
Set Subscriber2 = New EasyUASubscriber
OutputText = OutputText & "Subscribing..." & vbCrLf
Subscriber2.SubscribeDataSet subscribeDataSetArguments
OutputText = OutputText & "Processing dataset message for 20 seconds..." & vbCrLf
Pause 20000
OutputText = OutputText & "Unsubscribing..." & vbCrLf
Subscriber2.UnsubscribeAllDataSets
OutputText = OutputText & "Waiting for 1 second..." & vbCrLf
' Unsubscribe operation is asynchronous, messages may still come for a short while.
Pause 1000
Set Subscriber2 = Nothing
OutputText = OutputText & "Finished." & vbCrLf
End Sub
Private Sub Subscriber2_DataSetMessage(ByVal sender As Variant, ByVal eventArgs As EasyUADataSetMessageEventArgs)
' Display the dataset
If eventArgs.Succeeded Then
' An event with null DataSetData just indicates a successful connection.
If Not eventArgs.DataSetData Is Nothing Then
OutputText = OutputText & vbCrLf
OutputText = OutputText & "Dataset data: " & eventArgs.DataSetData & vbCrLf
Dim dictionaryEntry2: For Each dictionaryEntry2 In eventArgs.DataSetData.FieldDataDictionary
OutputText = OutputText & dictionaryEntry2 & vbCrLf
Next
End If
Else
OutputText = OutputText & vbCrLf
OutputText = OutputText & eventArgs.ErrorMessageBrief & vbCrLf
End If
End Sub
' Example output:
'
'Subscribing...
'Processing dataset message events for 20 seconds...
'
'Dataset data: Good; Data; publisher="32", writer=1, class=eae79794-1af7-4f96-8401-4096cd1d8908, fields: 4
'[#0, True {System.Boolean} @0001-01-01T00:00:00.000 @@0001-01-01T00:00:00.000; Good]
'[#1, 7945 {System.Int32} @0001-01-01T00:00:00.000 @@0001-01-01T00:00:00.000; Good]
'[#2, 5246 {System.Int32} @0001-01-01T00:00:00.000 @@0001-01-01T00:00:00.000; Good]
'[#3, 9/30/2019 11:19:14 AM {System.DateTime} @0001-01-01T00:00:00.000 @@0001-01-01T00:00:00.000; Good]
'
'Dataset data: Good; Data; publisher="32", writer=3, class=96976b7b-0db7-46c3-a715-0979884b55ae, fields: 100
'[#0, 45 {System.Int64} @0001-01-01T00:00:00.000 @@0001-01-01T00:00:00.000; Good]
'[#1, 145 {System.Int64} @0001-01-01T00:00:00.000 @@0001-01-01T00:00:00.000; Good]
'[#2, 245 {System.Int64} @0001-01-01T00:00:00.000 @@0001-01-01T00:00:00.000; Good]
'[#3, 345 {System.Int64} @0001-01-01T00:00:00.000 @@0001-01-01T00:00:00.000; Good]
'[#4, 445 {System.Int64} @0001-01-01T00:00:00.000 @@0001-01-01T00:00:00.000; Good]
'[#5, 545 {System.Int64} @0001-01-01T00:00:00.000 @@0001-01-01T00:00:00.000; Good]
'[#6, 645 {System.Int64} @0001-01-01T00:00:00.000 @@0001-01-01T00:00:00.000; Good]
'[#7, 745 {System.Int64} @0001-01-01T00:00:00.000 @@0001-01-01T00:00:00.000; Good]
'[#8, 845 {System.Int64} @0001-01-01T00:00:00.000 @@0001-01-01T00:00:00.000; Good]
'[#9, 945 {System.Int64} @0001-01-01T00:00:00.000 @@0001-01-01T00:00:00.000; Good]
'[#10, 1045 {System.Int64} @0001-01-01T00:00:00.000 @@0001-01-01T00:00:00.000; Good]
'...
Rem This example shows how to subscribe to all dataset messages on an OPC-UA PubSub connection with UDP UADP mapping.
Rem
Rem In order to produce network messages for this example, run the UADemoPublisher tool. For documentation, see
Rem http://kb.opclabs.com/UADemoPublisher_Basics . In some cases, you may have to specify the interface name to be used.
Option Explicit
' Define the PubSub connection we will work with.
Dim SubscribeDataSetArguments: Set SubscribeDataSetArguments = CreateObject("OpcLabs.EasyOpc.UA.PubSub.OperationModel.EasyUASubscribeDataSetArguments")
Dim ConnectionDescriptor: Set ConnectionDescriptor = SubscribeDataSetArguments.DataSetSubscriptionDescriptor.ConnectionDescriptor
ConnectionDescriptor.ResourceAddress.ResourceDescriptor.UrlString = "opc.udp://239.0.0.1"
' In some cases you may have to set the interface (network adapter) name that needs to be used, similarly to
' the statement below. Your actual interface name may differ, of course.
' ConnectionDescriptor.ResourceAddress.InterfaceName = "Ethernet"
' Instantiate the subscriber object and hook events.
Dim Subscriber: Set Subscriber = CreateObject("OpcLabs.EasyOpc.UA.PubSub.EasyUASubscriber")
WScript.ConnectObject Subscriber, "Subscriber_"
WScript.Echo "Subscribing..."
Subscriber.SubscribeDataSet SubscribeDataSetArguments
WScript.Echo "Processing dataset message events for 20 seconds..."
WScript.Sleep 20*1000
WScript.Echo "Unsubscribing..."
Subscriber.UnsubscribeAllDataSets
WScript.Echo "Waiting for 1 second..."
' Unsubscribe operation is asynchronous, messages may still come for a short while.
WScript.Sleep 1*1000
WScript.Echo "Finished."
Sub Subscriber_DataSetMessage(Sender, e)
' Display the dataset.
If e.Succeeded Then
' An event with null DataSetData just indicates a successful connection.
If Not (e.DataSetData Is Nothing) Then
WScript.Echo
WScript.Echo "Dataset data: " & e.DataSetData
Dim Pair: For Each Pair in e.DataSetData.FieldDataDictionary
WScript.Echo Pair
Next
End If
Else
WScript.Echo
WScript.Echo "*** Failure: " & e.ErrorMessageBrief
End If
End Sub
' Example output:
'
'Subscribing...
'Processing dataset message events for 20 seconds...
'
''Dataset data: Good; Data; publisher="32", writer=1, class=eae79794-1af7-4f96-8401-4096cd1d8908, fields: 4
'[#0, True {System.Boolean} @0001-01-01T00:00:00.000 @@0001-01-01T00:00:00.000; Good]
'[#1, 7945 {System.Int32} @0001-01-01T00:00:00.000 @@0001-01-01T00:00:00.000; Good]
'[#2, 5246 {System.Int32} @0001-01-01T00:00:00.000 @@0001-01-01T00:00:00.000; Good]
'[#3, 9/30/2019 11:19:14 AM {System.DateTime} @0001-01-01T00:00:00.000 @@0001-01-01T00:00:00.000; Good]
'
'Dataset data: Good; Data; publisher="32", writer=3, class=96976b7b-0db7-46c3-a715-0979884b55ae, fields: 100
'[#0, 45 {System.Int64} @0001-01-01T00:00:00.000 @@0001-01-01T00:00:00.000; Good]
'[#1, 145 {System.Int64} @0001-01-01T00:00:00.000 @@0001-01-01T00:00:00.000; Good]
'[#2, 245 {System.Int64} @0001-01-01T00:00:00.000 @@0001-01-01T00:00:00.000; Good]
'[#3, 345 {System.Int64} @0001-01-01T00:00:00.000 @@0001-01-01T00:00:00.000; Good]
'[#4, 445 {System.Int64} @0001-01-01T00:00:00.000 @@0001-01-01T00:00:00.000; Good]
'[#5, 545 {System.Int64} @0001-01-01T00:00:00.000 @@0001-01-01T00:00:00.000; Good]
'[#6, 645 {System.Int64} @0001-01-01T00:00:00.000 @@0001-01-01T00:00:00.000; Good]
'[#7, 745 {System.Int64} @0001-01-01T00:00:00.000 @@0001-01-01T00:00:00.000; Good]
'[#8, 845 {System.Int64} @0001-01-01T00:00:00.000 @@0001-01-01T00:00:00.000; Good]
'[#9, 945 {System.Int64} @0001-01-01T00:00:00.000 @@0001-01-01T00:00:00.000; Good]
'[#10, 1045 {System.Int64} @0001-01-01T00:00:00.000 @@0001-01-01T00:00:00.000; Good]
'...