C# code
public ADODB.Recordset ConvertToRecordset(string XMLDataset)
{
DataTable inTable;
string FileName;
FileName = "c:\\temp\\result" + DateTime.Now.Millisecond + ".xml";
ADODB.Recordset result = new ADODB.Recordset();
XmlTextWriter xwriter = new XmlTextWriter(FileName, System.Text.Encoding.Default);
DataSet ds = new DataSet();
StringReader xmlSR = new StringReader(XMLDataset);
ds.ReadXml(xmlSR);
inTable = ds.Tables[0];
result.CursorLocation = ADODB.CursorLocationEnum.adUseClient;
ADODB.Fields resultFields = result.Fields;
System.Data.DataColumnCollection inColumns = inTable.Columns;
foreach (DataColumn inColumn in inColumns)
{
resultFields.Append(inColumn.ColumnName
, TranslateType(inColumn.DataType)
, inColumn.MaxLength
, inColumn.AllowDBNull ? ADODB.FieldAttributeEnum.adFldIsNullable :
ADODB.FieldAttributeEnum.adFldUnspecified
, null);
}
result.Open(System.Reflection.Missing.Value
, System.Reflection.Missing.Value
, ADODB.CursorTypeEnum.adOpenStatic
, ADODB.LockTypeEnum.adLockOptimistic, 0);
foreach (DataRow dr in inTable.Rows)
{
result.AddNew(System.Reflection.Missing.Value,
System.Reflection.Missing.Value);
for (int columnIndex = 0; columnIndex < inColumns.Count; columnIndex++)
{
resultFields[columnIndex].Value = dr[columnIndex];
}
}
return result;
}
ADODB.DataTypeEnum TranslateType(Type columnType)
{
switch (columnType.UnderlyingSystemType.ToString())
{
case "System.Boolean":
return ADODB.DataTypeEnum.adBoolean;
case "System.Byte":
return ADODB.DataTypeEnum.adUnsignedTinyInt;
case "System.Char":
return ADODB.DataTypeEnum.adChar;
case "System.DateTime":
return ADODB.DataTypeEnum.adDate;
case "System.Decimal":
return ADODB.DataTypeEnum.adCurrency;
case "System.Double":
return ADODB.DataTypeEnum.adDouble;
case "System.Int16":
return ADODB.DataTypeEnum.adSmallInt;
case "System.Int32":
return ADODB.DataTypeEnum.adInteger;
case "System.Int64":
return ADODB.DataTypeEnum.adBigInt;
case "System.SByte":
return ADODB.DataTypeEnum.adTinyInt;
case "System.Single":
return ADODB.DataTypeEnum.adSingle;
case "System.UInt16":
return ADODB.DataTypeEnum.adUnsignedSmallInt;
case "System.UInt32":
return ADODB.DataTypeEnum.adUnsignedInt;
case "System.UInt64":
return ADODB.DataTypeEnum.adUnsignedBigInt;
case "System.String":
default:
return ADODB.DataTypeEnum.adVarChar;
}
}
vb.net code
Public Function ConvertToRecordset(ByVal XMLDataset As String) As ADODB.Recordset
Dim FileName As String = ""
ConvertToRecordset = New ADODB.Recordset
FileName = "c:\temp\result" & Now.TimeOfDay().Milliseconds & ".xml"
Dim inTable As New DataTable
Dim xwriter As New XmlTextWriter(FileName, System.Text.Encoding.Default)
Dim ds As New DataSet
Dim xmlSR As StringReader = New StringReader(XMLDataset)
Dim result As ADODB.Recordset = New ADODB.Recordset
ds.ReadXml(xmlSR)
inTable = ds.Tables(0)
result.CursorLocation = ADODB.CursorLocationEnum.adUseClient
Dim resultFields As ADODB.Fields = ConvertToRecordset.Fields
Dim inColumns As DataColumnCollection = inTable.Columns
For Each inColumn As DataColumn In inColumns
On Error Resume Next
resultFields.Append(inColumn.ColumnName, TranslateType(inColumn.DataType.ToString), inColumn.MaxLength, _
IIf(inColumn.AllowDBNull, ADODB.FieldAttributeEnum.adFldIsNullable, ADODB.FieldAttributeEnum.adFldUnspecified), Null)
'resultFields.Append("test", ADODB.DataTypeEnum.adVarChar, -1, ADODB.FieldAttributeEnum.adFldUnspecified, Null)
Next
result.Open(Nothing, Nothing, ADODB.CursorTypeEnum.adOpenStatic, _
ADODB.LockTypeEnum.adLockOptimistic, 0)
For Each dr As DataRow In inTable.Rows
result.AddNew(System.Reflection.Missing.Value, System.Reflection.Missing.Value)
For columnIndex As Integer = 0 To inColumns.Count
resultFields(columnIndex).Value = dr(columnIndex)
Next
Next
'ConvertToRecordset.Open()
Return result
End Function
Private Function TranslateType(ByVal dtype As String) As String
Select Case (dtype)
Case "System.Int32"
Return "int"
Case "System.DateTime"
Return "dateTime"
End Select
End Function