Example #1
0
        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);
        }
Example #2
0
        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;
        }