private void ParseSqlColumns()
 {
     try
     {
         SaveSettings();
         flowColumns.Controls.Clear();
         var fileColumns = ParseInputColumns();
         var sqlColumns  = SqlParser.GetColumns(cboConnectionTarget.SelectedValue.ToString(), cboTableNameTarget.Text);
         foreach (var sqlColumn in sqlColumns)
         {
             var columnMap = new ColumnMap(sqlColumn, fileColumns);
             columnMap.IsModified += columnMap_IsModified;
             flowColumns.Controls.Add(columnMap);
         }
         SetShowState();
     }
     catch (Exception ex)
     {
         MessageBox.Show(ex.Message, "ParseSqlColumns", MessageBoxButtons.OK, MessageBoxIcon.Error);
     }
 }
        private List <FileColumn> ParseInputColumns()
        {
            switch (SourceType)
            {
            case SourceType.Excel:
            case SourceType.Text:
                var rowItems     = ParseDataContent(false);
                var inputColumns = rowItems[0].Values.Select((value, index) => new FileColumn {
                    Index = index, Name = value.ToString()
                }).ToList();
                return(inputColumns);

            case SourceType.Sql:
                var sqlColumns    = SqlParser.GetColumns(cboConnectionTarget.SelectedValue.ToString(), cboTableNameTarget.Text);
                var inputColumns2 = sqlColumns.Select(s => new FileColumn {
                    Index = s.ColumnOrdinal, Name = s.ColumnName
                }).ToList();
                return(inputColumns2);

            default:
                throw new Exception($"SourceType={SourceType} is not handled");
            }
        }
        private void GenerateDatabase()
        {
            var skippedKeys = new[] { "dtproperties", "sandeslatt_user", "LogItem", "WebStat", "Log", "Song" };

            try
            {
                Cursor         = Cursors.WaitCursor;
                txtResult.Text = string.Empty;
                SaveSettings();

                var count      = 0;
                var tableNames = SqlParser.GetTablesOrderedForInsert(cboConnectionSource.SelectedValue.ToString());

                // DELETE
                txtResult.Text += "-- First clear all tables in reverse order" + Environment.NewLine;
                for (var i = tableNames.Count - 1; i >= 0; i--)
                {
                    var tableName = tableNames[i];
                    if (tableName.ContainsAny(skippedKeys))
                    {
                        txtResult.Text += $"-- Skipped {tableName}" + Environment.NewLine;
                    }
                    else
                    {
                        txtResult.Text += $"DELETE FROM {tableName}" + Environment.NewLine;
                    }
                }
                txtResult.Text += Environment.NewLine + Environment.NewLine;


                // INSERT
                foreach (var tableName in tableNames)
                {
                    var fileRows = SqlParser.GetValues(cboConnectionSource.SelectedValue.ToString(), tableName, "");
                    if (tableName.ContainsAny(skippedKeys))
                    {
                        txtResult.Text += $"-- Table {tableName} skipped" + Environment.NewLine;
                        continue;
                    }

                    // Create column structs to satisfy ResultCreator
                    var sqlColumns    = SqlParser.GetColumns(cboConnectionTarget.SelectedValue.ToString(), tableName);
                    var mappedColumns = sqlColumns.Select((x, i) => new ColumnMap(x, new List <FileColumn>()
                    {
                        new FileColumn {
                            Index = i, Name = x.ColumnName
                        }
                    })).ToList();
                    var hasIdentity = sqlColumns.Any(x => x.IsIdentity);

                    // Print result
                    var result = ResultCreator.GetResult(CommandType.Insert, fileRows, mappedColumns, tableName);
                    if (hasIdentity)
                    {
                        txtResult.Text += $"SET IDENTITY_INSERT {tableName} ON;" + Environment.NewLine;
                        txtResult.Text += result + Environment.NewLine;
                        txtResult.Text += $"SET IDENTITY_INSERT {tableName} OFF;" + Environment.NewLine + Environment.NewLine;
                    }
                    else
                    {
                        txtResult.Text += result + Environment.NewLine + Environment.NewLine;
                    }

                    count += fileRows.Count;
                }
                lblResultCount.Text = $"{count} records generated at {DateTime.Now.ToString("HH:mm:ss")}";
                SetShowState();
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message, "Generate", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
            finally
            {
                Cursor = Cursors.Default;
                txtResult.Refresh();
            }
        }