public DataTable RunWorkflowForSqlImpl(ISqlCtx sqlCtx, string serverUri, string recordsetName) { // if recordsetName is specified then select elements with matching name and convert children to DataTable rows // else iterate through XML and process each element as follows: // - if element has no children then add to first DataTable row // - else create DataTable for element and convert children to DataTable rows // - when finished iterating, add DataTable's to first DataTable if (sqlCtx == null) { throw new ArgumentNullException("sqlCtx"); } if (string.IsNullOrEmpty(serverUri)) { return(new DataTable()); } XElement xml = RunWorkflowForXmlImpl(serverUri); var dt = new DataTable(recordsetName); if (!string.IsNullOrEmpty(recordsetName)) { SqlDataRecord dataRecord = null; bool hasRecords = false; foreach (XElement node in xml.Elements(recordsetName)) { hasRecords = true; DataRow record = AddRecord(dt, node); if (dataRecord == null) { dataRecord = sqlCtx.SendStart(dt); } sqlCtx.SendRow(dataRecord, record.ItemArray); } if (hasRecords) { sqlCtx.SendEnd(); } } else { var values = new List <object>(); var recordsets = new Dictionary <string, DataTable>(); #region Parse values and recordsets foreach (XElement node in xml.Elements()) { string nodeName = node.Name.LocalName; if (node.HasElements) { DataTable rs; if (!recordsets.TryGetValue(nodeName, out rs)) { rs = new DataTable(nodeName); recordsets.Add(nodeName, rs); } AddRecord(rs, node); } else { string fieldName = nodeName; AddColumn(dt, fieldName); values.Add(node.Value); } } #endregion dt.Rows.Add(values.ToArray()); #region Now add rows and columns for each recordset foreach (string rsName in recordsets.Keys) { int startCol = dt.Columns.Count; DataTable rs = recordsets[rsName]; foreach (DataColumn column in rs.Columns) { AddColumn(dt, rsName + column.ColumnName); } int endCol = dt.Columns.Count; foreach (DataRow rsRow in rs.Rows) { DataRow row = dt.NewRow(); for (int i = startCol, j = 0; i < endCol; i++, j++) { row[i] = rsRow.ItemArray[j]; } dt.Rows.Add(row); } } #endregion if (dt.Rows.Count > 0) { SqlDataRecord dataRecord = sqlCtx.SendStart(dt); foreach (DataRow record in dt.Rows) { sqlCtx.SendRow(dataRecord, record.ItemArray); } sqlCtx.SendEnd(); } } return(dt); }
public DataTable RunWorkflowForSqlImpl(ISqlCtx sqlCtx, string serverUri, string recordsetName) { // if recordsetName is specified then select elements with matching name and convert children to DataTable rows // else iterate through XML and process each element as follows: // - if element has no children then add to first DataTable row // - else create DataTable for element and convert children to DataTable rows // - when finished iterating, add DataTable's to first DataTable if (sqlCtx == null) { throw new ArgumentNullException("sqlCtx"); } if (string.IsNullOrEmpty(serverUri)) { return new DataTable(); } XElement xml = RunWorkflowForXmlImpl(serverUri); var dt = new DataTable(recordsetName); if (!string.IsNullOrEmpty(recordsetName)) { SqlDataRecord dataRecord = null; bool hasRecords = false; foreach (XElement node in xml.Elements(recordsetName)) { hasRecords = true; DataRow record = AddRecord(dt, node); if (dataRecord == null) { dataRecord = sqlCtx.SendStart(dt); } sqlCtx.SendRow(dataRecord, record.ItemArray); } if (hasRecords) { sqlCtx.SendEnd(); } } else { var values = new List<object>(); var recordsets = new Dictionary<string, DataTable>(); #region Parse values and recordsets foreach (XElement node in xml.Elements()) { string nodeName = node.Name.LocalName; if (node.HasElements) { DataTable rs; if (!recordsets.TryGetValue(nodeName, out rs)) { rs = new DataTable(nodeName); recordsets.Add(nodeName, rs); } AddRecord(rs, node); } else { string fieldName = nodeName; AddColumn(dt, fieldName); values.Add(node.Value); } } #endregion dt.Rows.Add(values.ToArray()); #region Now add rows and columns for each recordset foreach (string rsName in recordsets.Keys) { int startCol = dt.Columns.Count; DataTable rs = recordsets[rsName]; foreach (DataColumn column in rs.Columns) { AddColumn(dt, rsName + column.ColumnName); } int endCol = dt.Columns.Count; foreach (DataRow rsRow in rs.Rows) { DataRow row = dt.NewRow(); for (int i = startCol, j = 0; i < endCol; i++, j++) { row[i] = rsRow.ItemArray[j]; } dt.Rows.Add(row); } } #endregion if (dt.Rows.Count > 0) { SqlDataRecord dataRecord = sqlCtx.SendStart(dt); foreach (DataRow record in dt.Rows) { sqlCtx.SendRow(dataRecord, record.ItemArray); } sqlCtx.SendEnd(); } } return dt; }