private void BindColumnList(SqlTable sql_table)
        {
            if (this.clbColumns.Items.Count != 0)
                    this.clbColumns.Items.Clear();

                foreach (var item in sql_table.Columns)
                    this.clbColumns.Items.AddRange(new object[] { item.Value.Name });
        }
Example #2
0
        public SqlColumn(SqlTable sql_table, string column_name, string datatype, int length, int precision, int scale, 
                             bool is_nullable, bool is_pk, bool is_identity, int column_ordinal, string default_value)
        {
            _SqlTable           = sql_table;

                _Name               = column_name;
                _DataType           = datatype;
                _Length             = length;
                _Precision          = precision;
                _Scale				= scale;
                _IsNullable         = is_nullable;
                _IsPk               = is_pk;
                _IsIdentity         = is_identity;
                _ColumnOrdinal      = column_ordinal;
                _DefaultValue       = default_value;
        }
        public FieldSelector(List<string> selected_columns, SqlTable sql_table, string instructions, int min_selections, int max_selections)
        {
            InitializeComponent();

               this.Size = new Size(Properties.Settings.Default.FieldSelectorWidth, Properties.Settings.Default.FieldSelectorHeight);

                _SelectedColumns                = selected_columns;
                _MinSelections                  = min_selections;
                _MaxSelections                  = max_selections;
                this.lblInstructions.Text       = instructions;

                this.ListSelectedColumns();
                this.BindColumnList(sql_table);

                this.btnDone.Enabled = ValidateSelections();
        }
        public static OutputObject GenerateCountAllProc(SqlTable sql_table, bool generate_stored_proc_perms)
        {
            if (sql_table == null)
                    return null;

                string procedure_name = GenerateSqlStoredProcName(sql_table.Name, eStoredProcType.CountAll, null);

                OutputObject output = new OutputObject();
                output.Name = procedure_name + ".sql";
                output.Type = OutputObject.eObjectType.Sql;

                StringBuilder sb = new StringBuilder();

                sb.AppendLine(GenerateSqlExistanceChecker(procedure_name));
                sb.AppendLine(GenerateHeader(procedure_name));

                sb.AppendLine("CREATE PROCEDURE " + procedure_name);
                sb.AppendLine("AS");
                sb.AppendLine();
                sb.AppendLine("SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED");
                sb.AppendLine("SET NOCOUNT ON");
                sb.AppendLine();
                sb.AppendLine("SELECT\tCOUNT(*)");
                sb.AppendLine("FROM\t[" + sql_table.Name + "]");
                sb.AppendLine("WHERE\t[Disabled] = 0");
                sb.AppendLine("GO");
                sb.AppendLine();

                if (generate_stored_proc_perms)
                {
                    sb.AppendLine(GenerateSqlStoredProcPerms(procedure_name));
                    sb.AppendLine();
                }

                output.Body = sb.ToString();
                return output;
        }
        private static string FindIdField(SqlTable sql_table)
        {
            // occasionally we might need to figure out a primary key for a table.
                // this method isn't perfect, but its a decent stab at the problem.
                // grab the first PK we have. If there is no PKs defined, grab the
                // first int we find.

                if (sql_table.PkList.Count == 0)
                {
                    foreach (var column in sql_table.Columns)
                    {
                        if (column.Value.BaseType == eSqlBaseType.Integer)
                            return column.Key;
                    }

                    // still here? no matches then...
                    return string.Empty;
                }
                else
                {
                    return sql_table.PkList[0].Name;
                }
        }
 public static OutputObject GenerateWinformViewCodeDesigner(SqlTable sql_table)
 {
     return null;
 }
        public static OutputObject GenerateXmlLoader(SqlTable sql_table)
        {
            if (sql_table == null)
                    return null;

                string object_name          = NameFormatter.ToCSharpClassName(sql_table.Name);
                string class_name           = object_name + "DataLoader";
                string collection_type      = "List<" + object_name + ">";
                int longest_column          = GetLongestColumnLength(sql_table) + sql_table.Name.Length;

                OutputObject output = new OutputObject();
                output.Name = class_name + ".cs";
                output.Type = OutputObject.eObjectType.CSharp;

                StringBuilder sb = new StringBuilder();

                #region Header block

                sb.AppendLine("using System;");
                sb.AppendLine("using System.Collections.Generic;");
                sb.AppendLine("using System.Xml;");
                sb.AppendLine();
                sb.AppendLine("using DAL;");
                sb.AppendLine();

                #endregion

                sb.AppendLine("namespace " + NameFormatter.ToCSharpPropertyName(sql_table.Database.Name));
                sb.AppendLine("{");
                sb.AppendLine(AddTabs(1) + "[Serializable]");
                sb.AppendLine(AddTabs(1) + "public partial class " + class_name);
                sb.AppendLine(AddTabs(1) + "{");

                sb.AppendLine(AddTabs(2) + "#region Fields");
                sb.AppendLine();
                sb.AppendLine(AddTabs(3) + "protected bool _ParseErrors;");
                sb.AppendLine(AddTabs(3) + "protected " + collection_type + " _CollectionData;");
                sb.AppendLine();
                sb.AppendLine(AddTabs(2) + "#endregion");
                sb.AppendLine();

                sb.AppendLine(AddTabs(2) + "#region Properties");
                sb.AppendLine();
                sb.AppendLine(AddTabs(3) + "public " + collection_type + " CollectionData");
                sb.AppendLine(AddTabs(3) + "{");
                sb.AppendLine(AddTabs(4) + "get { return _CollectionData; }");
                sb.AppendLine(AddTabs(3) + "}");
                sb.AppendLine();
                sb.AppendLine(AddTabs(2) + "#endregion");
                sb.AppendLine();

                sb.AppendLine(AddTabs(2) + "#region Methods");
                sb.AppendLine();

                sb.AppendLine(AddTabs(3) + "//CTOR");
                sb.AppendLine(AddTabs(3) + "public " + class_name + "()");
                sb.AppendLine(AddTabs(3) + "{");
                sb.AppendLine(AddTabs(3) + "}");
                sb.AppendLine();

                sb.AppendLine(AddTabs(3) + "public bool ParseData(string file_name)");
                sb.AppendLine(AddTabs(3) + "{");
                sb.AppendLine(AddTabs(4) + "string xml;");
                sb.AppendLine(AddTabs(4) + "string error_message;");
                sb.AppendLine();
                sb.AppendLine(AddTabs(4) + "_ParseErrors        = !FileIo.ReadFromFile(file_name, out xml, out error_message);");
                sb.AppendLine(AddTabs(4) + "_CollectionData     = new " + collection_type + "();");
                sb.AppendLine();
                sb.AppendLine(AddTabs(4) + "XmlDocument document;");
                sb.AppendLine(AddTabs(4) + "XmlNodeList selected_nodes;");
                sb.AppendLine();
                sb.AppendLine(AddTabs(4) + object_name +" item_data;");
                sb.AppendLine();
                sb.AppendLine(AddTabs(4) + "try");
                sb.AppendLine(AddTabs(4) + "{");
                sb.AppendLine(AddTabs(5) + "document = new XmlDocument();");
                sb.AppendLine(AddTabs(5) + "document.InnerXml = xml;");
                sb.AppendLine();
                sb.AppendLine(AddTabs(5) + "selected_nodes = document.SelectNodes(\"//" + NameFormatter.ToCSharpPropertyName(sql_table.Name) + "\");");
                sb.AppendLine();
                sb.AppendLine(AddTabs(5) + "foreach (XmlNode item in selected_nodes)");
                sb.AppendLine(AddTabs(5) + "{");
                sb.AppendLine(AddTabs(6) + "item_data = new " + object_name + "();");
                sb.AppendLine();

                foreach (var sql_column in sql_table.Columns.Values)
                {
                    // format:
                    // critter_data.Name       = item.Attributes["Name"].Value;
                    sb.AppendLine(AddTabs(6) + PadCSharpVariableName("item_data." + NameFormatter.ToCSharpPropertyName(sql_column.Name), longest_column + 7) + "= " + NameFormatter.GetCSharpCastString(sql_column) + "(item.Attributes[\"" + NameFormatter.ToCSharpPropertyName(sql_column.Name) + "\"].Value);");
                }

                sb.AppendLine();
                sb.AppendLine(AddTabs(6) + "_CollectionData.Add(item_data);");
                sb.AppendLine(AddTabs(5) + "}");
                sb.AppendLine(AddTabs(4) + "}");
                sb.AppendLine(AddTabs(4) + "catch");
                sb.AppendLine(AddTabs(4) + "{");
                sb.AppendLine(AddTabs(5) + "_ParseErrors = true;");
                sb.AppendLine(AddTabs(4) + "}");
                sb.AppendLine(AddTabs(4) + "finally");
                sb.AppendLine(AddTabs(4) + "{");
                sb.AppendLine(AddTabs(5) + "document        = null;");
                sb.AppendLine(AddTabs(5) + "selected_nodes  = null;");
                sb.AppendLine(AddTabs(4) + "}");
                sb.AppendLine();

                sb.AppendLine(AddTabs(3) + "return !_ParseErrors;");
                sb.AppendLine(AddTabs(2) + "}");
                sb.AppendLine();
                sb.AppendLine(AddTabs(2) + "#endregion");
                sb.AppendLine(AddTabs(1) + "}");

                sb.AppendLine("}");

                output.Body = sb.ToString();
                return output;
        }
        private static int GetLongestColumnLength(SqlTable sql_table)
        {
            if (sql_table == null)
                    throw new Exception("Cannot compute longest column length on a null table.");

                int longest_column_length = 0;

                foreach (var column in sql_table.Columns.Values)
                {
                    if (column.Name.Length > longest_column_length)
                        longest_column_length = column.Name.Length;
                }

                return longest_column_length;
        }
        // SQL Procs
        public static OutputObject GenerateSelectSingleProc(SqlTable sql_table, bool generate_stored_proc_perms)
        {
            if (sql_table == null)
                    return null;

                string procedure_name   = GenerateSqlStoredProcName(sql_table.Name, eStoredProcType.SelectSingle, null);
                int longest_column      = GetLongestColumnLength(sql_table) + sql_table.Name.Length;
                bool flag_first_value;
                string name_buffer;

                OutputObject output = new OutputObject();
                output.Name = procedure_name + ".sql";
                output.Type = OutputObject.eObjectType.Sql;

                // sanity check - if there are no primary keys in the table, we cannot know
                // what would a good choice would be for a qualifier. Abort and return error msg.
                if (sql_table.PkList.Count == 0)
                {
                    output.Body = "/* Cannot generate " + procedure_name + ", no primary keys set on " + sql_table.Name + ". */" + Environment.NewLine + Environment.NewLine;
                    return output;
                }

                StringBuilder sb = new StringBuilder();

                sb.AppendLine(GenerateSqlExistanceChecker(procedure_name));
                sb.AppendLine(GenerateHeader(procedure_name));

                sb.AppendLine("CREATE PROCEDURE " + procedure_name);
                sb.AppendLine(GenerateSqlStoredProcParameters(sql_table, eIncludedFields.PKOnly));

                sb.AppendLine("AS");
                sb.AppendLine();
                sb.AppendLine("SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED");
                sb.AppendLine("SET NOCOUNT ON");
                sb.AppendLine();

                #region Selected Columns

                flag_first_value = true;

                foreach (var sql_column in sql_table.Columns.Values)
                {
                    if (flag_first_value)
                    {
                        sb.Append("SELECT" + AddTabs(1));
                        flag_first_value = false;
                    }
                    else
                    {
                        sb.Append("," + Environment.NewLine + AddTabs(2));
                    }

                    name_buffer = NameFormatter.ToTSQLName(sql_column.Table.Name) + "." + NameFormatter.ToTSQLName(sql_column.Name);
                    sb.Append(PadSqlVariableName(name_buffer, longest_column) + "AS " + NameFormatter.ToTSQLName(sql_column.Name));
                }
                #endregion

                sb.AppendLine();
                sb.AppendLine();
                sb.AppendLine("FROM" + AddTabs(1) + NameFormatter.ToTSQLName(sql_table.Name));
                sb.AppendLine();

                #region Where Clause
                flag_first_value = true;
                sb.AppendLine("WHERE" + AddTabs(1) + PadSqlVariableName(NameFormatter.ToTSQLName(sql_table.Name) + ".[Disabled]", longest_column) + "= 0");

                foreach (var sql_column in sql_table.Columns.Values)
                {
                    string tsql_variablename = NameFormatter.ToTSQLVariableName(sql_column);

                    if (sql_column.IsPk)
                    {
                        name_buffer = NameFormatter.ToTSQLName(sql_column.Table.Name) + "." + NameFormatter.ToTSQLName(sql_column.Name);
                        sb.AppendLine("AND" + AddTabs(2) + PadSqlVariableName(name_buffer, longest_column) + "= " + tsql_variablename);
                    }
                }
                #endregion

                sb.AppendLine("GO");
                sb.AppendLine();

                if (generate_stored_proc_perms)
                {
                    sb.AppendLine(GenerateSqlStoredProcPerms(procedure_name));
                    sb.AppendLine();
                }

                output.Body = sb.ToString();
                return output;
        }
        private static string GenerateSearchClause(SqlTable sql_table, List<string> column_names, int tabs_in, int tabs_over)
        {
            if (sql_table == null || column_names == null || column_names.Count == 0)
                    return string.Empty;

                StringBuilder sb = new StringBuilder();

                bool flag_first_value = true;

                sb.Append(AddTabs(tabs_in) + "WHERE");
                sb.Append(Environment.NewLine + AddTabs(tabs_in) + "(");

                foreach (var item in column_names)
                {
                    sb.Append(Environment.NewLine + AddTabs(tabs_in + 1));

                    if (flag_first_value)
                        flag_first_value = false;
                    else
                        sb.Append("OR ");

                    sb.Append(NameFormatter.ToTSQLName(sql_table.Name) + "." + NameFormatter.ToTSQLName(item) + " LIKE '%' + @SearchString + '%'");
                }
                sb.Append(Environment.NewLine + AddTabs(tabs_in) + ")");

                return sb.ToString();
        }
        private static string GenerateSelectClauseArguments(SqlTable sql_table, List<string> column_names)
        {
            if (column_names == null)
                    return AddTabs(1) + "-- @A_VALUE [SOME_DATA_TYPE]";

                StringBuilder sb = new StringBuilder();

                bool flag_first_value = true;

                foreach (var item in column_names)
                {
                    if (flag_first_value)
                        flag_first_value = false;
                    else
                        sb.Append("," + Environment.NewLine);

                    sb.Append(AddTabs(1) + NameFormatter.ToTSQLVariableName(sql_table.Columns[item]) + AddTabs(2) + NameFormatter.ToTSQLType(sql_table.Columns[item]));
                }

                return sb.ToString();
        }
        // Webservice Generation
        public static OutputObject GenerateWebServiceCodeInfrontClass(SqlTable sql_table)
        {
            if (sql_table == null)
                    return null;

                string class_name = NameFormatter.ToCSharpClassName(sql_table.Name);

                OutputObject output = new OutputObject();
                output.Name = class_name + ".asmx";
                output.Type = OutputObject.eObjectType.WebService;

                StringBuilder sb = new StringBuilder();

                sb.AppendLine("<%@ WebService Language=\"C#\" CodeBehind=\"Service1.asmx.cs\" Class=\"WebService1.Service1\" %>");

                output.Body = sb.ToString();
                return output;
        }
        public static OutputObject GenerateWebViewPageCodeBehind(SqlTable sql_table, List<string> namespace_includes)
        {
            if (sql_table == null)
                    return null;

                string view_class_name  = "View" + NameFormatter.ToCSharpPropertyName(sql_table.Name);
                int longest_column      = GetLongestColumnLength(sql_table) + sql_table.Name.Length;

                OutputObject output = new OutputObject();
                output.Name =  view_class_name + ".aspx.cs";
                output.Type = OutputObject.eObjectType.CSharp;

                namespace_includes.Add(NameFormatter.ToCSharpPropertyName(sql_table.Database.Name));

                StringBuilder sb = new StringBuilder();

                #region Includes
                sb.AppendLine("using System;");
                sb.AppendLine("using System.Data;");
                sb.AppendLine("using System.Configuration;");
                sb.AppendLine("using System.Collections;");
                sb.AppendLine("using System.Collections.Generic;");
                sb.AppendLine("using System.Web;");
                sb.AppendLine("using System.Web.Security;");
                sb.AppendLine("using System.Web.UI;");
                sb.AppendLine("using System.Web.UI.WebControls;");
                sb.AppendLine("using System.Web.UI.WebControls.WebParts;");
                sb.AppendLine("using System.Web.UI.HtmlControls;");
                sb.AppendLine();

                sb.AppendLine(GenerateNamespaceIncludes(namespace_includes));
                sb.AppendLine();

                #endregion

                sb.AppendLine("namespace WebControls." + NameFormatter.ToCSharpPropertyName(sql_table.Database.Name));
                sb.AppendLine("{");
                sb.AppendLine(AddTabs(1) + "public partial class " + view_class_name + " : System.Web.UI.Page");
                sb.AppendLine(AddTabs(1) + "{");

                sb.AppendLine(AddTabs(2) + "#region Fields");
                sb.AppendLine();

                #region Fields
                sb.AppendLine(AddTabs(3) + "protected string _SQLConnection = ConfigurationManager.ConnectionStrings[\"SQLConnection\"].ConnectionString;");
                #endregion

                sb.AppendLine();
                sb.AppendLine(AddTabs(2) + "#endregion");
                sb.AppendLine();
                sb.AppendLine(AddTabs(2) + "#region Properties");
                sb.AppendLine();

                #region Properties
                sb.AppendLine(AddTabs(3) + "protected string PageName");
                sb.AppendLine(AddTabs(3) + "{");
                sb.AppendLine(AddTabs(4) + "get { return \"" + view_class_name + "\"; }");
                sb.AppendLine(AddTabs(3) + "}");

                sb.AppendLine(AddTabs(3) + "protected PaginationManager PageinationData");
                sb.AppendLine(AddTabs(3) + "{");
                sb.AppendLine(AddTabs(4) + "get");
                sb.AppendLine(AddTabs(4) + "{");
                sb.AppendLine(AddTabs(5) + "if (ViewState[\"PaginationManager\"] == null)");
                sb.AppendLine(AddTabs(6) + "ViewState[\"PaginationManager\"] = new PaginationManager();");
                sb.AppendLine();
                sb.AppendLine(AddTabs(5) + "return (PaginationManager)ViewState[\"PaginationManager\"];");
                sb.AppendLine(AddTabs(4) + "}");
                sb.AppendLine(AddTabs(4) + "set");
                sb.AppendLine(AddTabs(4) + "{");
                sb.AppendLine(AddTabs(5) + "ViewState[\"PaginationManager\"] = value;");
                sb.AppendLine(AddTabs(4) + "}");
                sb.AppendLine(AddTabs(3) + "}");

                sb.AppendLine(AddTabs(3) + "protected string ReturnPage");
                sb.AppendLine(AddTabs(3) + "{");
                sb.AppendLine(AddTabs(4) + "get");
                sb.AppendLine(AddTabs(4) + "{");
                sb.AppendLine(AddTabs(5) + "if (ViewState[\"ReturnPage\"] == null)");
                sb.AppendLine(AddTabs(6) + "ViewState[\"ReturnPage\"] = \"~/Default.aspx\";");
                sb.AppendLine();
                sb.AppendLine(AddTabs(5) + "return (string)ViewState[\"ReturnPage\"];");
                sb.AppendLine(AddTabs(4) + "}");
                sb.AppendLine(AddTabs(4) + "set");
                sb.AppendLine(AddTabs(4) + "{");
                sb.AppendLine(AddTabs(5) + "ViewState[\"ReturnPage\"] = value;");
                sb.AppendLine(AddTabs(4) + "}");
                sb.AppendLine(AddTabs(3) + "}");

                sb.AppendLine(AddTabs(3) + "protected int EditingID");
                sb.AppendLine(AddTabs(3) + "{");
                sb.AppendLine(AddTabs(4) + "get");
                sb.AppendLine(AddTabs(4) + "{");
                sb.AppendLine(AddTabs(5) + "if (ViewState[\"EditingID\"] == null)");
                sb.AppendLine(AddTabs(6) + "ViewState[\"EditingID\"] = 0;");
                sb.AppendLine();
                sb.AppendLine(AddTabs(5) + "return (int)ViewState[\"EditingID\"];");
                sb.AppendLine(AddTabs(4) + "}");
                sb.AppendLine(AddTabs(4) + "set");
                sb.AppendLine(AddTabs(4) + "{");
                sb.AppendLine(AddTabs(5) + "ViewState[\"EditingID\"] = value;");
                sb.AppendLine(AddTabs(4) + "}");
                sb.AppendLine(AddTabs(3) + "}");
                #endregion

                sb.AppendLine();
                sb.AppendLine(AddTabs(2) + "#endregion");
                sb.AppendLine();
                sb.AppendLine(AddTabs(2) + "#region Methods");
                sb.AppendLine();

                #region BindForm Method
                sb.AppendLine(AddTabs(3) + "protected void BindForm()");
                sb.AppendLine(AddTabs(3) + "{");
                sb.AppendLine(AddTabs(4) + NameFormatter.ToCSharpClassName("DAL" + sql_table.Name) + " dal_obj = new " + NameFormatter.ToCSharpClassName("DAL" + sql_table.Name) + "(_SQLConnection);");
                sb.AppendLine(AddTabs(4) + "dal_obj.LoadSingleFromDb(this.EditingID);");
                sb.AppendLine();
                sb.AppendLine(AddTabs(4) + "if (dal_obj.Collection.Count > 0)");
                sb.AppendLine(AddTabs(4) + "{");

                foreach (var sql_column in sql_table.Columns.Values)
                {
                    if (!sql_column.IsPk)
                    {
                        // need to account for datatypes that need to be converted to a string.

                        switch (sql_column.BaseType)
                        {
                            case eSqlBaseType.Bool:
                                sb.AppendLine(AddTabs(5) + PadCSharpVariableName("chk" + NameFormatter.ToCSharpPropertyName(sql_column.Name) + ".Checked", longest_column, 11) + "= dal_obj.Collection[0]." + NameFormatter.ToCSharpPropertyName(sql_column.Name) + ";");
                                break;

                            case eSqlBaseType.Guid:
                                sb.AppendLine(AddTabs(5) + PadCSharpVariableName("lbl" + NameFormatter.ToCSharpPropertyName(sql_column.Name) +".Text", longest_column, 11) + "= dal_obj.Collection[0]." + NameFormatter.ToCSharpPropertyName(sql_column.Name) + ".ToString();");
                                break;

                            case eSqlBaseType.Integer:
                                sb.AppendLine(AddTabs(5) + PadCSharpVariableName("lbl" + NameFormatter.ToCSharpPropertyName(sql_column.Name) +".Text", longest_column, 11) + "= dal_obj.Collection[0]." + NameFormatter.ToCSharpPropertyName(sql_column.Name) + ".ToString();");
                                break;

                            case eSqlBaseType.Float:
                                sb.AppendLine(AddTabs(5) + PadCSharpVariableName("lbl" + NameFormatter.ToCSharpPropertyName(sql_column.Name) +".Text", longest_column, 11) + "= dal_obj.Collection[0]." + NameFormatter.ToCSharpPropertyName(sql_column.Name) + ".ToString();");
                                break;

                            case eSqlBaseType.Time:
                                sb.AppendLine(AddTabs(5) + PadCSharpVariableName("lbl" + NameFormatter.ToCSharpPropertyName(sql_column.Name) +".Text", longest_column, 11) + "= dal_obj.Collection[0]." + NameFormatter.ToCSharpPropertyName(sql_column.Name) + ".ToString();");
                                break;

                            default:
                                sb.AppendLine(AddTabs(5) + PadCSharpVariableName("lbl" + NameFormatter.ToCSharpPropertyName(sql_column.Name) +".Text", longest_column, 11) + "= dal_obj.Collection[0]." + NameFormatter.ToCSharpPropertyName(sql_column.Name) + ";");
                                break;
                        }
                    }
                }
                sb.AppendLine(AddTabs(4) + "}");
                sb.AppendLine(AddTabs(4) + "else");
                sb.AppendLine(AddTabs(4) + "{");
                sb.AppendLine(AddTabs(5) + "this.lblErrorMessage.Text = \"Load Failed\";");
                sb.AppendLine(AddTabs(4) + "}");
                sb.AppendLine(AddTabs(3) + "}");
                #endregion

                #region Check Credentials method
                sb.AppendLine(AddTabs(3) + "protected void CheckCredentials()");
                sb.AppendLine(AddTabs(3) + "{");
                sb.AppendLine(AddTabs(4) + "");
                sb.AppendLine(AddTabs(3) + "}");
                #endregion

                sb.AppendLine();
                sb.AppendLine(AddTabs(2) + "#endregion");
                sb.AppendLine();
                sb.AppendLine(AddTabs(2) + "#region Events");
                sb.AppendLine();

                #region pageload event method
                sb.AppendLine(AddTabs(3) + "protected void Page_Load(object sender, EventArgs e)");
                sb.AppendLine(AddTabs(3) + "{");
                sb.AppendLine(AddTabs(4) + "CheckCredentials();");
                sb.AppendLine();
                sb.AppendLine(AddTabs(4) + "if (!Page.IsPostBack)");
                sb.AppendLine(AddTabs(4) + "{");
                sb.AppendLine(AddTabs(5) + "if (Request.QueryString[\"Id\"] != null)");
                sb.AppendLine(AddTabs(6) + "this.EditingID = Convert.ToInt32(Request.QueryString[\"Id\"]);");
                sb.AppendLine();
                sb.AppendLine(AddTabs(5) + "if (Request.QueryString[\"ReturnPage\"] != null)");
                sb.AppendLine(AddTabs(6) + "this.ReturnPage = (string)Request.QueryString[\"ReturnPage\"];");
                sb.AppendLine();
                sb.AppendLine(AddTabs(5) + "if (Request.QueryString[\"PageData\"] != null)");
                sb.AppendLine(AddTabs(6) + "this.PageinationData = new PaginationManager(Request.QueryString[\"PageData\"].ToString());");
                sb.AppendLine();
                sb.AppendLine(AddTabs(5) + "BindForm();");
                sb.AppendLine();
                sb.AppendLine(AddTabs(4) + "}");
                sb.AppendLine(AddTabs(3) + "}");
                #endregion

                sb.AppendLine();
                sb.AppendLine(AddTabs(2) + "#endregion");

                sb.AppendLine(AddTabs(1) + "}");
                sb.AppendLine("}");

                output.Body = sb.ToString();
                return output;
        }
        public static OutputObject GenerateWebListPageCodeInFront(SqlTable sql_table, bool create_as_asp_control)
        {
            if (sql_table == null)
                    return null;

                string list_object_name     = "List" + NameFormatter.ToCSharpPropertyName(sql_table.Name);
                string edit_object_name     = "Edit" + NameFormatter.ToCSharpPropertyName(sql_table.Name);
                string orm_class_name       = NameFormatter.ToCSharpClassName(sql_table.Name);
                string list_class_name      = NameFormatter.ToCSharpClassName(list_object_name);

                OutputObject output = new OutputObject();
                output.Name =  list_object_name + ".aspx";
                output.Type = OutputObject.eObjectType.Aspx;

                bool first_flag = true;

                StringBuilder sb = new StringBuilder();

                if (create_as_asp_control)
                {
                    sb.AppendLine("<%@ Control Language=\"C#\" AutoEventWireup=\"true\" CodeBehind=\"" + list_object_name + ".aspx.cs\" Inherits=\"WebControls." + NameFormatter.ToCSharpPropertyName(sql_table.Database.Name) + "." + list_object_name + "\" %>");
                }
                else
                {
                    sb.AppendLine("<%@ Page Language=\"C#\" MasterPageFile=\"~/MasterPage.master\" AutoEventWireup=\"true\" CodeBehind=\"" + list_object_name + ".aspx.cs\" Inherits=\"WebControls." + NameFormatter.ToCSharpPropertyName(sql_table.Database.Name) + "." + list_object_name + "\" %>");
                    sb.AppendLine();
                    sb.AppendLine("<asp:Content ID=\"Content1\" ContentPlaceHolderID=\"head\" Runat=\"Server\">");
                    sb.AppendLine("</asp:Content>");
                    sb.AppendLine();
                    sb.AppendLine("<asp:Content ID=\"Content2\" ContentPlaceHolderID=\"body\" Runat=\"Server\">");
                }

                sb.AppendLine("<asp:Panel ID=\"panList\" DefaultButton=\"btnSearch\" runat=\"server\">");
                sb.AppendLine();

                sb.AppendLine(AddTabs(1) + "<div class=\"PageTitle\">" + NameFormatter.ToFriendlyName(sql_table.Name));
                sb.AppendLine(AddTabs(1) + "<asp:LinkButton ID=\"btnAddNewItem\" OnClick=\"btnAddNewItem_Click\" runat=\"server\" Text=\"(Add new item)\" CssClass=\"AddItemLink\" />");
                sb.AppendLine(AddTabs(1) + "</div>");
                sb.AppendLine();

                sb.AppendLine(AddTabs(1) + "<asp:TextBox ID=\"txtSearch\" runat=\"server\" />");
                sb.AppendLine(AddTabs(1) + "<asp:Button ID=\"btnSearch\" runat=\"server\" CssClass=\"Button1\" Text=\"Search\" OnClick=\"btnSearch_Click\" />");
                sb.AppendLine();

                #region Repeater
                sb.AppendLine(AddTabs(1) + "<asp:Repeater ID=\"rptList\" runat=\"server\" >");
                sb.AppendLine();

                sb.AppendLine(AddTabs(2) + "<HeaderTemplate>");
                sb.AppendLine(AddTabs(2) + "<table width=\"100%\">");
                sb.AppendLine(AddTabs(2) + "<tr class=\"RepeaterHeaderStyle\">");
                sb.AppendLine();

                foreach (var sql_column in sql_table.Columns.Values)
                {
                    sb.AppendLine(AddTabs(3) + "<td><span class=\"RepeaterHeader\">" + NameFormatter.ToFriendlyName(sql_column.Name) + "</span></td>");
                }

                sb.AppendLine();
                sb.AppendLine(AddTabs(2) + "</tr>");
                sb.AppendLine(AddTabs(2) + "</HeaderTemplate>");
                sb.AppendLine();

                // Item template
                sb.AppendLine(AddTabs(2) + "<ItemTemplate>");
                sb.AppendLine(AddTabs(2) + "<tr class=\"RepeaterItemStyle\">");
                sb.AppendLine();

                first_flag = true;

                foreach (var item in sql_table.Columns.Values)
                {
                    string current_item_binding = "((" + sql_table.Database.Name + "." + orm_class_name + ")Container.DataItem)." + NameFormatter.ToCSharpPropertyNameString(item);

                    if (first_flag)
                    {
                        first_flag = false;
                        sb.AppendLine(AddTabs(3) + "<td valign=\"top\"><a href=\"" +  edit_object_name + ".aspx?id=<%# " + current_item_binding + " %>&ReturnPage=" + list_object_name + "&PageData=<%=PageinationData.ToString()%>\"><%# " + current_item_binding + " %></a></td>");
                    }
                    else
                    {
                        sb.AppendLine(AddTabs(3) + "<td valign=\"top\"><span class=\"RepeaterCell\"><%# " + current_item_binding + " %></span></td>");
                    }
                }

                sb.AppendLine();
                sb.AppendLine(AddTabs(2) + "</tr>");
                sb.AppendLine(AddTabs(2) + "</ItemTemplate>");
                sb.AppendLine();

                // Alternating item template
                sb.AppendLine(AddTabs(2) + "<AlternatingItemTemplate>");
                sb.AppendLine(AddTabs(2) + "<tr class=\"AlternatingRepeaterItemStyle\">");
                sb.AppendLine();

                first_flag = true;

                foreach (var item in sql_table.Columns.Values)
                {
                    string current_item_binding = "((" + sql_table.Database.Name + "." + orm_class_name + ")Container.DataItem)." + NameFormatter.ToCSharpPropertyNameString(item);

                    if (first_flag)
                    {
                        first_flag = false;
                        sb.AppendLine(AddTabs(3) + "<td valign=\"top\"><a href=\"" +  edit_object_name + ".aspx?id=<%# " + current_item_binding + " %>&ReturnPage=" + list_object_name + "&PageData=<%=PageinationData.ToString()%>\"><%# " + current_item_binding + " %></a></td>");
                    }
                    else
                    {
                        sb.AppendLine(AddTabs(3) + "<td valign=\"top\"><span class=\"RepeaterCell\"><%# " + current_item_binding + " %></span></td>");
                    }
                }

                sb.AppendLine();
                sb.AppendLine(AddTabs(2) + "</tr>");
                sb.AppendLine(AddTabs(2) + "</AlternatingItemTemplate>");
                sb.AppendLine();

                sb.AppendLine(AddTabs(2) + "<FooterTemplate>");
                sb.AppendLine(AddTabs(2) + "</table>");
                sb.AppendLine(AddTabs(2) + "</FooterTemplate>");
                sb.AppendLine();
                sb.AppendLine(AddTabs(1) + "</asp:Repeater>");
                #endregion

                sb.AppendLine();
                sb.AppendLine(AddTabs(1) + "<asp:Button ID=\"btnFirstPage\" runat=\"server\" CssClass=\"Button1\" OnClick=\"btnFirstPage_Click\" Text=\"&lt;&lt;\" />");
                sb.AppendLine(AddTabs(1) + "<asp:Button ID=\"btnPrevPage\" runat=\"server\" CssClass=\"Button1\" OnClick=\"btnPrevPage_Click\" Text=\"&lt;\" />");
                sb.AppendLine(AddTabs(1) + "<asp:Label ID=\"lblCounter\" runat=\"server\" Text=\"Label\" />");
                sb.AppendLine(AddTabs(1) + "<asp:Button ID=\"btnNextPage\" runat=\"server\" CssClass=\"Button1\" OnClick=\"btnNextPage_Click\" Text=\"&gt;\" />");
                sb.AppendLine(AddTabs(1) + "<asp:Button ID=\"btnLastPage\" runat=\"server\" CssClass=\"Button1\" OnClick=\"btnLastPage_Click\" Text=\"&gt;&gt;\" />");
                sb.AppendLine(AddTabs(1) + "<asp:DropDownList ID=\"ddlPageSize\" runat=\"server\" OnSelectedIndexChanged=\"ddlPageSize_SelectedIndexChanged\" AutoPostBack=\"True\" /> items per page");

                sb.AppendLine();
                sb.AppendLine("</asp:Panel>");

                if (!create_as_asp_control)
                    sb.AppendLine("</asp:Content>");

                output.Body = sb.ToString();
                return output;
        }
        public static OutputObject GenerateWebServiceCodeBehindClass(SqlTable sql_table, List<string> namespace_includes)
        {
            if (sql_table == null)
                    return null;

                string class_name = NameFormatter.ToCSharpClassName(sql_table.Name);

                OutputObject output = new OutputObject();
                output.Name = class_name + ".asmx.cs";
                output.Type = OutputObject.eObjectType.CSharp;

                StringBuilder sb = new StringBuilder();

                sb.AppendLine("using System;");
                sb.AppendLine("using System.Data;");
                sb.AppendLine("using System.Data;");
                sb.AppendLine("using System.Web;");
                sb.AppendLine("using System.Collections;");
                sb.AppendLine("using System.Web.Services;");
                sb.AppendLine("using System.Web.Services.Protocols;");
                sb.AppendLine("using System.ComponentModel;");
                sb.AppendLine();

                sb.AppendLine(GenerateNamespaceIncludes(namespace_includes));
                sb.AppendLine();

                sb.AppendLine("namespace WebService1");
                sb.AppendLine("{");
                sb.AppendLine(AddTabs(1) + "[WebService(Namespace = \"http://tempuri.org/\")]");
                sb.AppendLine(AddTabs(1) + "[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]");
                sb.AppendLine(AddTabs(1) + "[ToolboxItem(false)]");
                sb.AppendLine(AddTabs(1) + "public class Service1 : System.Web.Services.WebService");
                sb.AppendLine(AddTabs(1) + "{");
                sb.AppendLine(AddTabs(2) + "[WebMethod]");
                sb.AppendLine(AddTabs(2) + "public string HelloWorld()");
                sb.AppendLine(AddTabs(2) + "{");
                sb.AppendLine(AddTabs(3) + "return \"Hello World\";");
                sb.AppendLine(AddTabs(2) + "}");
                sb.AppendLine(AddTabs(1) + "}");
                sb.AppendLine("}");

                output.Body = sb.ToString();
                return output;
        }
        public static OutputObject GenerateWebListPageCodeBehind(SqlTable sql_table, List<string> namespace_includes)
        {
            if (sql_table == null)
                    return null;

                string class_name = "List" + NameFormatter.ToCSharpPropertyName(sql_table.Name);

                OutputObject output = new OutputObject();
                output.Name =  class_name + ".aspx.cs";
                output.Type = OutputObject.eObjectType.CSharp;

                namespace_includes.Add(NameFormatter.ToCSharpPropertyName(sql_table.Database.Name));

                StringBuilder sb = new StringBuilder();

                #region Includes
                sb.AppendLine("using System;");
                sb.AppendLine("using System.Data;");
                sb.AppendLine("using System.Configuration;");
                sb.AppendLine("using System.Collections;");
                sb.AppendLine("using System.Collections.Generic;");
                sb.AppendLine("using System.Web;");
                sb.AppendLine("using System.Web.Security;");
                sb.AppendLine("using System.Web.UI;");
                sb.AppendLine("using System.Web.UI.WebControls;");
                sb.AppendLine("using System.Web.UI.WebControls.WebParts;");
                sb.AppendLine("using System.Web.UI.HtmlControls;");
                sb.AppendLine();

                sb.AppendLine(GenerateNamespaceIncludes(namespace_includes));
                sb.AppendLine();

                #endregion

                sb.AppendLine("namespace WebControls." + NameFormatter.ToCSharpPropertyName(sql_table.Database.Name));
                sb.AppendLine("{");
                sb.AppendLine(AddTabs(1) + "public partial class " + class_name + " : System.Web.UI.Page");
                sb.AppendLine(AddTabs(1) + "{");

                #region Fields
                sb.AppendLine(AddTabs(2) + "#region Fields");
                sb.AppendLine();
                sb.AppendLine(AddTabs(3) + "protected string _SQLConnection = ConfigurationManager.ConnectionStrings[\"SQLConnection\"].ConnectionString;");
                sb.AppendLine();
                sb.AppendLine(AddTabs(2) + "#endregion");
                sb.AppendLine();
                #endregion

                #region Properties
                sb.AppendLine(AddTabs(2) + "#region Properties");
                sb.AppendLine();

                sb.AppendLine(AddTabs(3) + "protected string PageName");
                sb.AppendLine(AddTabs(3) + "{");
                sb.AppendLine(AddTabs(4) + "get { return \"" + class_name + "\"; }");
                sb.AppendLine(AddTabs(3) + "}");
                sb.AppendLine(AddTabs(3) + "protected PaginationManager PageinationData");
                sb.AppendLine(AddTabs(3) + "{");
                sb.AppendLine(AddTabs(4) + "get");
                sb.AppendLine(AddTabs(4) + "{");
                sb.AppendLine(AddTabs(5) + "if (ViewState[\"PaginationManager\"] == null)");
                sb.AppendLine(AddTabs(6) + "ViewState[\"PaginationManager\"] = new PaginationManager();");
                sb.AppendLine();
                sb.AppendLine(AddTabs(5) + "return (PaginationManager)ViewState[\"PaginationManager\"];");
                sb.AppendLine(AddTabs(4) + "}");
                sb.AppendLine(AddTabs(4) + "set");
                sb.AppendLine(AddTabs(4) + "{");
                sb.AppendLine(AddTabs(5) + "ViewState[\"PaginationManager\"] = value;");
                sb.AppendLine(AddTabs(4) + "}");
                sb.AppendLine(AddTabs(3) + "}");

                sb.AppendLine(AddTabs(3) + "protected string ReturnPage");
                sb.AppendLine(AddTabs(3) + "{");
                sb.AppendLine(AddTabs(4) + "get");
                sb.AppendLine(AddTabs(4) + "{");
                sb.AppendLine(AddTabs(5) + "if (ViewState[\"ReturnPage\"] == null)");
                sb.AppendLine(AddTabs(6) + "ViewState[\"ReturnPage\"] = \"~/Default.aspx\";");
                sb.AppendLine();
                sb.AppendLine(AddTabs(5) + "return (string)ViewState[\"ReturnPage\"];");
                sb.AppendLine(AddTabs(4) + "}");
                sb.AppendLine(AddTabs(4) + "set");
                sb.AppendLine(AddTabs(4) + "{");
                sb.AppendLine(AddTabs(5) + "ViewState[\"ReturnPage\"] = value;");
                sb.AppendLine(AddTabs(4) + "}");
                sb.AppendLine(AddTabs(3) + "}");

                sb.AppendLine(AddTabs(3) + "protected int EditingID");
                sb.AppendLine(AddTabs(3) + "{");
                sb.AppendLine(AddTabs(4) + "get");
                sb.AppendLine(AddTabs(4) + "{");
                sb.AppendLine(AddTabs(5) + "if (ViewState[\"EditingID\"] == null)");
                sb.AppendLine(AddTabs(6) + "ViewState[\"EditingID\"] = -1;");
                sb.AppendLine();
                sb.AppendLine(AddTabs(5) + "return (int)ViewState[\"EditingID\"];");
                sb.AppendLine(AddTabs(4) + "}");
                sb.AppendLine(AddTabs(4) + "set");
                sb.AppendLine(AddTabs(4) + "{");
                sb.AppendLine(AddTabs(5) + "ViewState[\"EditingID\"] = value;");
                sb.AppendLine(AddTabs(4) + "}");
                sb.AppendLine(AddTabs(3) + "}");

                sb.AppendLine(AddTabs(3) + "protected string SearchString");
                sb.AppendLine(AddTabs(3) + "{");
                sb.AppendLine(AddTabs(4) + "get");
                sb.AppendLine(AddTabs(4) + "{");
                sb.AppendLine(AddTabs(5) + "if (ViewState[\"SearchString\"] == null)");
                sb.AppendLine(AddTabs(6) + "ViewState[\"SearchString\"] = string.Empty;");
                sb.AppendLine();
                sb.AppendLine(AddTabs(5) + "return (string)ViewState[\"SearchString\"];");
                sb.AppendLine(AddTabs(4) + "}");
                sb.AppendLine(AddTabs(4) + "set");
                sb.AppendLine(AddTabs(4) + "{");
                sb.AppendLine(AddTabs(5) + "ViewState[\"SearchString\"] = value;");
                sb.AppendLine(AddTabs(4) + "}");
                sb.AppendLine(AddTabs(3) + "}");

                sb.AppendLine();
                sb.AppendLine(AddTabs(2) + "#endregion");
                sb.AppendLine();
                #endregion

                sb.AppendLine(AddTabs(2) + "#region Methods");
                sb.AppendLine();

                #region Bind Repeater method
                sb.AppendLine(AddTabs(3) + "protected void BindRepeater()");
                sb.AppendLine(AddTabs(3) + "{");
                sb.AppendLine(AddTabs(4) + "var dal_obj = new " + NameFormatter.ToCSharpClassName("Dal" + sql_table.Name) + "(_SQLConnection);");
                sb.AppendLine(AddTabs(4) + "dal_obj.LoadAllFromDbPaged(this.PageinationData.ItemIndex, this.PageinationData.PageSize, this.SearchString);");
                sb.AppendLine();
                sb.AppendLine(AddTabs(4) + "this.PageinationData.SetSize = dal_obj.GetSearchCountFromDb(this.SearchString);");
                sb.AppendLine();
                sb.AppendLine(AddTabs(4) + "rptList.DataSource = dal_obj.Collection;");
                sb.AppendLine(AddTabs(4) + "rptList.DataBind();");
                sb.AppendLine(AddTabs(3) + "}");
                #endregion

                #region Bind Page Size Control method
                sb.AppendLine(AddTabs(3) + "protected void BindPageSizeControl()");
                sb.AppendLine(AddTabs(3) + "{");
                sb.AppendLine(AddTabs(4) + "this.ddlPageSize.Items.Clear();");
                sb.AppendLine();
                sb.AppendLine(AddTabs(4) + "this.ddlPageSize.Items.Add(new ListItem(\"10\"));");
                sb.AppendLine(AddTabs(4) + "this.ddlPageSize.Items.Add(new ListItem(\"25\"));");
                sb.AppendLine(AddTabs(4) + "this.ddlPageSize.Items.Add(new ListItem(\"50\"));");
                sb.AppendLine(AddTabs(4) + "this.ddlPageSize.Items.Add(new ListItem(\"100\"));");
                sb.AppendLine();
                sb.AppendLine(AddTabs(4) + "this.ddlPageSize.Text = this.PageinationData.PageSize.ToString();");
                sb.AppendLine(AddTabs(3) + "}");
                #endregion

                #region Bind Page Counter method
                sb.AppendLine(AddTabs(3) + "protected void BindPageCounter()");
                sb.AppendLine(AddTabs(3) + "{");
                sb.AppendLine(AddTabs(4) + "this.lblCounter.Text = string.Format(\"Items {0} - {1} of {2}\",");
                sb.AppendLine(AddTabs(4) + "this.PageinationData.FirstItemOnCurrentPage, ");
                sb.AppendLine(AddTabs(4) + "this.PageinationData.LastItemOnCurrentPage, ");
                sb.AppendLine(AddTabs(4) + "this.PageinationData.SetSize);");
                sb.AppendLine(AddTabs(3) + "}");
                #endregion

                #region Check Credentials method
                sb.AppendLine(AddTabs(3) + "protected void CheckCredentials()");
                sb.AppendLine(AddTabs(3) + "{");
                sb.AppendLine(AddTabs(4) + "");
                sb.AppendLine(AddTabs(3) + "}");
                #endregion

                sb.AppendLine();
                sb.AppendLine(AddTabs(2) + "#endregion");
                sb.AppendLine();
                sb.AppendLine(AddTabs(2) + "#region Events");
                sb.AppendLine();

                #region pageload event method
                sb.AppendLine(AddTabs(3) + "protected void Page_Load(object sender, EventArgs e)");
                sb.AppendLine(AddTabs(3) + "{");
                sb.AppendLine(AddTabs(4) + "CheckCredentials();");
                sb.AppendLine();
                sb.AppendLine(AddTabs(4) + "this.txtSearch.Focus();");
                sb.AppendLine();
                sb.AppendLine(AddTabs(4) + "if (!Page.IsPostBack)");
                sb.AppendLine(AddTabs(4) + "{");
                sb.AppendLine(AddTabs(5) + "if (Request.QueryString[\"ReturnPage\"] != null)");
                sb.AppendLine(AddTabs(6) + "this.ReturnPage = (string)Request.QueryString[\"ReturnPage\"];");
                sb.AppendLine();
                sb.AppendLine(AddTabs(5) + "if (Request.QueryString[\"PageData\"] != null)");
                sb.AppendLine(AddTabs(6) + "this.PageinationData = new PaginationManager(Request.QueryString[\"PageData\"].ToString());");
                sb.AppendLine();
                sb.AppendLine(AddTabs(5) + "BindPageSizeControl();");
                sb.AppendLine(AddTabs(5) + "BindRepeater();");
                sb.AppendLine(AddTabs(5) + "BindPageCounter();");
                sb.AppendLine(AddTabs(4) + "}");
                sb.AppendLine(AddTabs(3) + "}");
                #endregion

                #region btnPrevPage_Click method
                sb.AppendLine(AddTabs(3) + "protected void btnPrevPage_Click(object sender, EventArgs e)");
                sb.AppendLine(AddTabs(3) + "{");
                sb.AppendLine(AddTabs(4) + "this.PageinationData.PreviousPage();");
                sb.AppendLine(AddTabs(4) + "BindRepeater();");
                sb.AppendLine(AddTabs(4) + "BindPageCounter();");
                sb.AppendLine(AddTabs(3) + "}");
                #endregion

                #region btnNextPage_Click method
                sb.AppendLine(AddTabs(3) + "protected void btnNextPage_Click(object sender, EventArgs e)");
                sb.AppendLine(AddTabs(3) + "{");
                sb.AppendLine(AddTabs(4) + "this.PageinationData.NextPage();");
                sb.AppendLine(AddTabs(4) + "BindRepeater();");
                sb.AppendLine(AddTabs(4) + "BindPageCounter();");
                sb.AppendLine(AddTabs(3) + "}");
                #endregion

                #region btnFirstPage_Click method
                sb.AppendLine(AddTabs(3) + "protected void btnFirstPage_Click(object sender, EventArgs e)");
                sb.AppendLine(AddTabs(3) + "{");
                sb.AppendLine(AddTabs(4) + "this.PageinationData.JumpToFirstPage();");
                sb.AppendLine(AddTabs(4) + "BindRepeater();");
                sb.AppendLine(AddTabs(4) + "BindPageCounter();");
                sb.AppendLine(AddTabs(3) + "}");
                #endregion

                #region btnLastPage_Click method
                sb.AppendLine(AddTabs(3) + "protected void btnLastPage_Click(object sender, EventArgs e)");
                sb.AppendLine(AddTabs(3) + "{");
                sb.AppendLine(AddTabs(4) + "this.PageinationData.JumpToLastPage();");
                sb.AppendLine(AddTabs(4) + "BindRepeater();");
                sb.AppendLine(AddTabs(4) + "BindPageCounter();");
                sb.AppendLine(AddTabs(3) + "}");
                #endregion

                #region btnAddNewItem_Click method
                sb.AppendLine(AddTabs(3) + "protected void btnAddNewItem_Click(object sender, EventArgs e)");
                sb.AppendLine(AddTabs(3) + "{");
                sb.AppendLine(AddTabs(4) + "this.Response.Redirect(\"Edit" + NameFormatter.ToCSharpPropertyName(sql_table.Name) + ".Aspx?id=0&ReturnPage=\" + this.PageName + \"&PageData=\" + this.PageinationData.ToString(), true);");
                sb.AppendLine(AddTabs(3) + "}");
                #endregion

                #region btnSearch_Click method
                sb.AppendLine(AddTabs(3) + "protected void btnSearch_Click(object sender, EventArgs e)");
                sb.AppendLine(AddTabs(3) + "{");
                sb.AppendLine(AddTabs(4) + "this.SearchString = this.txtSearch.Text;");
                sb.AppendLine(AddTabs(4) + "this.PageinationData.ItemIndex = 1;");
                sb.AppendLine();
                sb.AppendLine(AddTabs(4) + "BindPageSizeControl();");
                sb.AppendLine(AddTabs(4) + "BindRepeater();");
                sb.AppendLine(AddTabs(4) + "BindPageCounter();");
                sb.AppendLine(AddTabs(3) + "}");
                #endregion

                #region ddlPageSize_SelectedIndexChanged method
                sb.AppendLine(AddTabs(3) + "protected void ddlPageSize_SelectedIndexChanged(Object sender, EventArgs e)");
                sb.AppendLine(AddTabs(3) + "{");
                sb.AppendLine(AddTabs(4) + "this.PageinationData.PageSize = Convert.ToInt32(this.ddlPageSize.Text);");
                sb.AppendLine(AddTabs(4) + "BindRepeater();");
                sb.AppendLine(AddTabs(4) + "BindPageCounter();");
                sb.AppendLine(AddTabs(3) + "}");
                #endregion

                sb.AppendLine();
                sb.AppendLine(AddTabs(2) + "#endregion");
                sb.AppendLine(AddTabs(1) + "}");
                sb.AppendLine("}");
                sb.AppendLine();
                output.Body = sb.ToString();
                return output;
        }
        public static OutputObject GenerateWebEditPageCodeInFront(SqlTable sql_table, bool create_as_asp_control)
        {
            if (sql_table == null)
                    return null;

                string list_class_name = "List" + NameFormatter.ToCSharpPropertyName(sql_table.Name);
                string edit_class_name = "Edit" + NameFormatter.ToCSharpPropertyName(sql_table.Name);

                OutputObject output = new OutputObject();
                output.Name =  edit_class_name + ".aspx";
                output.Type = OutputObject.eObjectType.Aspx;

                StringBuilder sb = new StringBuilder();

                if (create_as_asp_control)
                {
                    sb.AppendLine("<%@ Control Language=\"C#\" AutoEventWireup=\"true\" CodeBehind=\"" + edit_class_name + ".aspx.cs\" Inherits=\"WebControls." + NameFormatter.ToCSharpPropertyName(sql_table.Database.Name) + "." + edit_class_name + "\" %>");
                }
                else
                {
                    sb.AppendLine("<%@ Page Language=\"C#\" MasterPageFile=\"~/MasterPage.master\" AutoEventWireup=\"True\" CodeBehind=\"" + edit_class_name + ".aspx.cs\" Inherits=\"WebControls." + NameFormatter.ToCSharpPropertyName(sql_table.Database.Name) + "." + edit_class_name + "\" %>");
                    sb.AppendLine();
                    sb.AppendLine("<asp:Content ID=\"Content1\" ContentPlaceHolderID=\"head\" Runat=\"Server\">");
                    sb.AppendLine("</asp:Content>");
                    sb.AppendLine();
                    sb.AppendLine("<asp:Content ID=\"Content2\" ContentPlaceHolderID=\"body\" Runat=\"Server\">");
                }

                sb.AppendLine();
                sb.AppendLine("<div class=\"PageTitle\">" + NameFormatter.ToFriendlyName(sql_table.Name) + "</div>");
                sb.AppendLine();

                sb.AppendLine("<asp:Panel CssClass=\"DetailsPanel\" ID=\"panDetails\" runat=\"server\">");
                sb.AppendLine();
                sb.AppendLine(AddTabs(1) + "<div class=\"Spacer\">");
                sb.AppendLine();

                sb.AppendLine(AddTabs(2) + "<table border=\"0\" width=\"100%\">");
                sb.AppendLine(AddTabs(2) + "<tr>");
                sb.AppendLine(AddTabs(3) + "<td></td>");
                sb.AppendLine(AddTabs(3) + "<td class=\"SectionTitle\"><asp:Label ID=\"lblTitle\" runat=\"server\" /></td>");
                sb.AppendLine(AddTabs(2) + "</tr>");
                sb.AppendLine();

                foreach (var sql_column in sql_table.Columns.Values)
                {
                    if (!sql_column.IsPk)
                    {
                        sb.AppendLine(AddTabs(2) + "<tr>");
                        sb.AppendLine(AddTabs(3) + "<td class=\"ControlLabel\">" + NameFormatter.ToFriendlyName(sql_column.Name) + ":</td>");

                        switch (sql_column.BaseType)
                        {
                            case eSqlBaseType.Bool:
                            sb.AppendLine(AddTabs(3) + "<td><asp:CheckBox ID=\"chk" + NameFormatter.ToCSharpPropertyName(sql_column.Name) + "\" runat=\"server\" /></td>");
                            break;

                            case eSqlBaseType.Time:
                            sb.AppendLine(AddTabs(3) + "<td><asp:TextBox ID=\"txt" + NameFormatter.ToCSharpPropertyName(sql_column.Name) + "\" runat=\"server\" /></td>");
                            break;

                            default:
                            if (sql_column.BaseType == eSqlBaseType.String)
                            {
                                if (sql_column.Length == -1)
                                {
                                    sb.AppendLine(AddTabs(3) + "<td><asp:TextBox ID=\"txt" + NameFormatter.ToCSharpPropertyName(sql_column.Name) + "\" runat=\"server\" TextMode=\"MultiLine\" Rows=\"8\" Width=\"400\" /></td>");
                                }
                                else if (sql_column.Length > 100 )
                                {
                                    sb.AppendLine(AddTabs(3) + "<td><asp:TextBox ID=\"txt" + NameFormatter.ToCSharpPropertyName(sql_column.Name) + "\" runat=\"server\" Width=\"400\" Rows=\"" + (sql_column.Length/100).ToString() + "\" TextMode=\"MultiLine\" /></td>");
                                }
                                else
                                {
                                    sb.AppendLine(AddTabs(3) + "<td><asp:TextBox ID=\"txt" + NameFormatter.ToCSharpPropertyName(sql_column.Name) + "\" runat=\"server\" Width=\"400\" MaxLength=\"" + sql_column.Length.ToString() + "\" /></td>");
                                }
                            }
                            else
                            {
                                //This might need to have the max length fixed. ints and stuff can end up here.
                                sb.AppendLine(AddTabs(3) + "<td><asp:TextBox ID=\"txt" + NameFormatter.ToCSharpPropertyName(sql_column.Name) + "\" runat=\"server\" Width=\"400\" MaxLength=\"" + sql_column.Length.ToString() + "\" /></td>");
                            }
                            break;
                        }

                        sb.AppendLine(AddTabs(2) + "</tr>");
                        sb.AppendLine();
                    }
                }

                // buttons
                sb.AppendLine(AddTabs(2) + "<tr>");
                sb.AppendLine(AddTabs(3) + "<td></td>");
                sb.AppendLine(AddTabs(3) + "<td class=\"SectionTitle\">");
                sb.AppendLine(AddTabs(4) + "<asp:Button ID=\"btnSave\" runat=\"server\" CssClass=\"Button1\" Text=\"Save\" OnClick=\"btnSave_Click\" />");
                sb.AppendLine(AddTabs(4) + "<asp:Button ID=\"btnUndo\" runat=\"server\" CssClass=\"Button1\" Text=\"Undo Changes\" OnClick=\"btnUndo_Click\" />");
                sb.AppendLine(AddTabs(3) + "</td>");
                sb.AppendLine(AddTabs(2) + "</tr>");
                sb.AppendLine(AddTabs(2) + "</table>");
                sb.AppendLine();
                sb.AppendLine(AddTabs(2) + "<asp:Label ID=\"lblErrorMessage\" CssClass=\"ErrorMessage\" runat=\"server\" />");
                sb.AppendLine();
                sb.AppendLine(AddTabs(1) + "</div>");
                sb.AppendLine();
                sb.AppendLine("</asp:Panel>");

                if (!create_as_asp_control)
                {
                    sb.AppendLine();
                    sb.AppendLine("</asp:Content>");
                }

                output.Body = sb.ToString();
                return output;
        }
        public static OutputObject GenerateSetProc(SqlTable sql_table, bool generate_stored_proc_perms)
        {
            if (sql_table == null)
                    return null;

                string procedure_name       = GenerateSqlStoredProcName(sql_table.Name, eStoredProcType.UpdateInsert, null);
                int longest_column          = GetLongestColumnLength(sql_table);
                bool flag_first_value       = true;

                OutputObject output = new OutputObject();
                output.Name = procedure_name + ".sql";
                output.Type = OutputObject.eObjectType.Sql;

                // sanity check - if there are no primary keys in the table, we cannot know
                // what would a good choice would be for a qualifier. Abort and return error msg.
                if (sql_table.PkList.Count == 0)
                {
                    output.Body = "/* Cannot generate " + procedure_name + ", no primary keys set on " + sql_table.Name + ". */" + Environment.NewLine + Environment.NewLine;
                    return output;
                }

                StringBuilder sb = new StringBuilder();

                sb.AppendLine(GenerateSqlExistanceChecker(procedure_name));
                sb.AppendLine(GenerateHeader(procedure_name));

                sb.AppendLine("CREATE PROCEDURE " + procedure_name);
                sb.AppendLine(GenerateSqlStoredProcParameters(sql_table, eIncludedFields.All));

                sb.AppendLine("AS");
                sb.AppendLine();
                sb.AppendLine("SET NOCOUNT ON");
                sb.AppendLine();

                #region Existance Check
                sb.Append("IF EXISTS (SELECT 1 FROM [" + sql_table.Name + "] ");

                // Build where clause
                flag_first_value = true;

                foreach (var sql_column in sql_table.Columns.Values)
                {
                    if (sql_column.IsPk)
                    {
                        if (flag_first_value)
                        {
                            sb.Append("WHERE ");
                            flag_first_value = false;
                        }
                        else
                        {
                            sb.Append(" AND ");
                        }

                        sb.Append(sql_column.Name + " = " + NameFormatter.ToTSQLVariableName(sql_column));
                    }
                }

                sb.AppendLine(")");
                #endregion

                sb.AppendLine("BEGIN");

                #region Update Clause
                sb.Append(AddTabs(1) + "-- Already Exists, Update" + Environment.NewLine );
                sb.Append(AddTabs(1) + "UPDATE\t[" + sql_table.Name + "]" + Environment.NewLine );

                // list selected columns
                flag_first_value = true;

                foreach (var sql_column in sql_table.Columns.Values)
                {
                    if (!sql_column.IsPk && !sql_column.IsIdentity)
                    {
                        if (flag_first_value)
                        {
                            sb.Append(AddTabs(1) + "SET" + AddTabs(2));
                            flag_first_value = false;
                        }
                        else
                        {
                            sb.Append("," + Environment.NewLine + AddTabs(3));
                        }

                        sb.Append(PadSqlVariableName(NameFormatter.ToTSQLName(sql_column.Name), longest_column) + "= " + NameFormatter.ToTSQLVariableName(sql_column));
                    }
                }

                sb.Append(Environment.NewLine);

                // Build where clause
                flag_first_value = true;

                foreach (var sql_column in sql_table.Columns.Values)
                {
                    if (sql_column.IsPk)
                    {
                        if (flag_first_value)
                        {
                            sb.Append(AddTabs(1) + "WHERE" + AddTabs(1));
                            flag_first_value = false;
                        }
                        else
                        {
                            sb.Append(Environment.NewLine + AddTabs(1) + "AND" + AddTabs(1));
                        }

                        sb.Append(PadSqlVariableName(NameFormatter.ToTSQLName(sql_column.Name), longest_column) + "= " + NameFormatter.ToTSQLVariableName(sql_column));
                    }
                }

                sb.AppendLine();
                sb.AppendLine();
                sb.AppendLine(AddTabs(1) + "RETURN @Id"); // HACK - this will work with my PK designs....
                #endregion

                sb.AppendLine("END");
                sb.AppendLine("ELSE");
                sb.AppendLine("BEGIN");

                #region Insert Clause
                sb.AppendLine(AddTabs(1) + "-- New Entry, Insert");
                sb.AppendLine(AddTabs(1) + "INSERT [" + sql_table.Name + "]");
                sb.AppendLine(AddTabs(1) + "(");

                // list selected columns
                flag_first_value = true;

                foreach (var sql_column in sql_table.Columns.Values)
                {
                    if (!sql_column.IsIdentity)
                    {
                        if (flag_first_value)
                        {
                            sb.Append(AddTabs(2));
                            flag_first_value = false;
                        }
                        else
                        {
                            sb.Append("," + Environment.NewLine + AddTabs(2));
                        }

                        sb.Append(NameFormatter.ToTSQLName(sql_column.Name));
                    }
                }

                sb.Append(Environment.NewLine + AddTabs(1) + ")");
                sb.Append(Environment.NewLine + AddTabs(1) + "VALUES");
                sb.Append(Environment.NewLine + AddTabs(1) + "(");

                // Build where clause
                flag_first_value = true;

                foreach (var sql_column in sql_table.Columns.Values)
                {
                    if (!sql_column.IsIdentity)
                    {
                        if (flag_first_value)
                        {
                            sb.Append(Environment.NewLine + AddTabs(2));
                            flag_first_value = false;
                        }
                        else
                        {
                            sb.Append("," + Environment.NewLine + AddTabs(2));
                        }

                        sb.Append(NameFormatter.ToTSQLVariableName(sql_column));
                    }
                }

                sb.Append(Environment.NewLine + AddTabs(1) + ")");
                sb.AppendLine();
                sb.AppendLine();
                sb.AppendLine(AddTabs(1) + "RETURN SCOPE_IDENTITY()");
                #endregion

                sb.AppendLine("END");
                sb.AppendLine("GO");
                sb.AppendLine();

                if (generate_stored_proc_perms)
                {
                    sb.AppendLine(GenerateSqlStoredProcPerms(procedure_name));
                    sb.AppendLine();
                }

                output.Body = sb.ToString();
                return output;
        }
        private static string FindNameField(SqlTable sql_table)
        {
            // occasionally we might need to figure out a friendly name field for
                // a table. this method isn't perfect, but its a decent stab at the problem.
                // grab the first text field we have, and hope for the best.

                foreach (var column in sql_table.Columns)
                {
                    if (column.Value.BaseType == eSqlBaseType.String)
                        return column.Key;
                }

                // still here? no matches then...
                return string.Empty;
        }
        public static OutputObject GenerateWebViewPageCodeInFront(SqlTable sql_table, bool create_as_asp_control)
        {
            if (sql_table == null)
                    return null;

                string view_class_name = "View" + NameFormatter.ToCSharpPropertyName(sql_table.Name);

                OutputObject output = new OutputObject();
                output.Name =  view_class_name + ".aspx";
                output.Type = OutputObject.eObjectType.Aspx;

                StringBuilder sb = new StringBuilder();

                if (create_as_asp_control)
                {
                    sb.AppendLine("<%@ Control Language=\"C#\" AutoEventWireup=\"true\" CodeBehind=\"" + view_class_name + ".aspx.cs\" Inherits=\"WebControls." + NameFormatter.ToCSharpPropertyName(sql_table.Database.Name) + "." + view_class_name + "\" %>");
                }
                else
                {
                    sb.AppendLine("<%@ Page Language=\"C#\" MasterPageFile=\"~/MasterPage.master\" AutoEventWireup=\"True\" CodeBehind=\"" + view_class_name + ".aspx.cs\" Inherits=\"WebControls." + NameFormatter.ToCSharpPropertyName(sql_table.Database.Name) + "." + view_class_name + "\" %>");
                    sb.AppendLine();
                    sb.AppendLine("<asp:Content ID=\"Content1\" ContentPlaceHolderID=\"head\" Runat=\"Server\">");
                    sb.AppendLine("</asp:Content>");
                    sb.AppendLine();
                    sb.AppendLine("<asp:Content ID=\"Content2\" ContentPlaceHolderID=\"body\" Runat=\"Server\">");
                }

                sb.AppendLine();
                sb.AppendLine("<div class=\"PageTitle\">View " + NameFormatter.ToFriendlyName(sql_table.Name) + "</div>");
                sb.AppendLine();

                sb.AppendLine("<asp:Panel CssClass=\"DetailsPanel\" ID=\"panDetails\" runat=\"server\">");
                sb.AppendLine();
                sb.AppendLine(AddTabs(1) + "<div class=\"Spacer\">");
                sb.AppendLine();

                sb.AppendLine(AddTabs(2) + "<table border=\"0\" width=\"100%\">");
                sb.AppendLine(AddTabs(2) + "<tr>");
                sb.AppendLine(AddTabs(3) + "<td></td>");
                sb.AppendLine(AddTabs(3) + "<td class=\"SectionTitle\"><asp:Label ID=\"lblTitle\" runat=\"server\" /></td>");
                sb.AppendLine(AddTabs(2) + "</tr>");
                sb.AppendLine();

                foreach (var sql_column in sql_table.Columns.Values)
                {
                    if (!sql_column.IsPk)
                    {
                        sb.AppendLine(AddTabs(2) + "<tr>");
                        sb.AppendLine(AddTabs(3) + "<td class=\"ControlLabel\">" + NameFormatter.ToFriendlyName(sql_column.Name) + ":</td>");

                        switch (sql_column.BaseType)
                        {
                            case eSqlBaseType.Bool:
                            sb.AppendLine(AddTabs(3) + "<td><asp:CheckBox ID=\"chk" + NameFormatter.ToCSharpPropertyName(sql_column.Name) + "\" Enabled=\"False\"  runat=\"server\" /></td>");
                            break;

                            //case eSqlBaseType.Time:
                            //sb.AppendLine(AddTabs(3) + "<td><asp:Calendar ID=\"cal" + NameFormatter.ToCSharpPropertyName(sql_column.ColumnName) + " runat=\"server\" /></td>");
                            //break;

                            default:
                            sb.AppendLine(AddTabs(3) + "<td><asp:Label ID=\"lbl" + NameFormatter.ToCSharpPropertyName(sql_column.Name) + "\" runat=\"server\" /></td>");
                            break;
                        }

                        sb.AppendLine(AddTabs(2) + "</tr>");
                        sb.AppendLine();
                    }
                }

                // buttons
                sb.AppendLine(AddTabs(2) + "</table>");
                sb.AppendLine();
                sb.AppendLine(AddTabs(2) + "<asp:Label ID=\"lblErrorMessage\" CssClass=\"ErrorMessage\" runat=\"server\" />");
                sb.AppendLine();
                sb.AppendLine(AddTabs(1) + "</div>");
                sb.AppendLine();
                sb.AppendLine("</asp:Panel>");

                if (!create_as_asp_control)
                {
                    sb.AppendLine();
                    sb.AppendLine("</asp:Content>");
                }

                output.Body = sb.ToString();
                return output;
        }
        private static string GenerateOrderByClause(SqlTable sql_table, List<string> column_names)
        {
            if (column_names == null || column_names.Count == 0)
                    return "-- ORDER BY [<A_COLUMN_NAME>]";

                StringBuilder sb = new StringBuilder();

                sb.Append("ORDER BY ");

                bool flag_first_value = true;

                foreach (var item in column_names)
                {
                    if (flag_first_value)
                        flag_first_value = false;
                    else
                        sb.Append(",");

                    sb.Append(NameFormatter.ToTSQLName(sql_table.Name) + "." + NameFormatter.ToTSQLName(item));
                }

                return sb.ToString();
        }
        public static OutputObject GenerateCSharpEnumeration(SqlTable sql_table, string string_column, string value_column, DataTable data_table)
        {
            if (sql_table == null)
                    return null;

                string enum_name        = NameFormatter.ToCSharpEnumName(sql_table.Name);
                int longest_column      = GetLongestColumnLength(sql_table);

                OutputObject output = new OutputObject();
                output.Name = enum_name + ".cs";
                output.Type = OutputObject.eObjectType.CSharp;

                StringBuilder sb                = new StringBuilder();

                sb.AppendLine("using System;");
                sb.AppendLine();

                sb.AppendLine("namespace " + NameFormatter.ToCSharpPropertyName(sql_table.Database.Name));
                sb.AppendLine("{");
                sb.AppendLine(AddTabs(1) + "public enum " + NameFormatter.ToCSharpEnumName(sql_table.Name));
                sb.AppendLine(AddTabs(1)+ "{");

                // list enumeration
                foreach (DataRow dr in data_table.Rows)
                {
                    string value_string     = dr[value_column].ToString();
                    string enum_string      = dr[string_column].ToString();

                    // make sure that enums are legal names.
                    foreach (string character in s_CSharpUndesireables)
                        enum_string = enum_string.Replace(character, string.Empty);

                    // no leading numbers, foo!
                    if (Char.IsNumber(enum_string[0]))
                        enum_string = "N" + enum_string;

                    sb.AppendLine(AddTabs(2) + PadCSharpVariableName(enum_string, longest_column) + "= " + value_string + ",");
                }

                sb.AppendLine(AddTabs(1) + "}");
                sb.AppendLine("}");

                output.Body = sb.ToString();
                return output;
        }
        private static string GenerateSelectClause(SqlTable sql_table, List<string> column_names)
        {
            #region Sample output:
                // AND [UserId]     = @UserId
                // AND [Age]        = @Age
                // AND [ShoeSize]   = @ShoeSize
                #endregion

                if (sql_table == null || column_names == null || column_names.Count == 0)
                    return string.Empty;

                StringBuilder sb = new StringBuilder();

                bool flag_first_value   = true;
                int longest_column      = GetLongestColumnLength(sql_table) + sql_table.Name.Length;

                foreach (var item in column_names)
                {
                    string field_name = NameFormatter.ToTSQLName(sql_table.Name) + "." + NameFormatter.ToTSQLName(item);

                    if (flag_first_value)
                        flag_first_value = false;
                    else
                        sb.Append(Environment.NewLine);

                    sb.Append("AND" + AddTabs(2) + PadSqlVariableName(field_name, longest_column) + "= " + NameFormatter.ToTSQLVariableName(sql_table.Columns[item]));
                }

                return sb.ToString();
        }
        /// <summary>
        /// Converts table column data to function argument string.
        /// Does not incude function types.
        /// Sample: titles, authors, bookcount. 
        /// </summary>
        public static string GenerateCSharpFunctionList(SqlTable sql_table, eIncludedFields include_types)
        {
            StringBuilder sb    = new StringBuilder();
                bool first_flag     = true;

                foreach (SqlColumn sql_column in sql_table.Columns.Values)
                {
                    if (first_flag)
                        first_flag = false;
                    else
                        sb.Append(", ");

                    switch (include_types)
                    {
                        case eIncludedFields.All:

                            sb.Append(ToLocalCase(sql_column.Name));
                            break;

                        case eIncludedFields.NoIdentities:

                            if (!sql_column.IsIdentity)
                                sb.Append(ToLocalCase(sql_column.Name));

                            break;

                        case eIncludedFields.PKOnly:

                            if (sql_column.IsPk)
                                sb.Append(ToLocalCase(sql_column.Name));

                            break;

                        default:
                            throw new Exception("eIncludedFields value " + include_types.ToString() +" is unrecognised..");
                    }
                }

                return sb.ToString();
        }
        private static string GenerateSqlStoredProcParameters(SqlTable sql_table, eIncludedFields included_fields)
        {
            if (sql_table == null)
                    throw new Exception("Cannot generate stored procedure parameters without a sql table.");

                #region Sample Output
                //(
                //    @CountryID		INT,
                //    @CountryName		VARCHAR(255)
                //)
                #endregion

                StringBuilder sb            = new StringBuilder();
                bool flag_first_value       = true;
                int longest_column          = GetLongestColumnLength(sql_table);

                sb.Append("(");

                // list query parameters
                foreach (var sql_column in sql_table.Columns.Values)
                {
                    if ( (included_fields == eIncludedFields.All) || (included_fields == eIncludedFields.PKOnly && sql_column.IsPk) ||
                        (included_fields == eIncludedFields.NoIdentities && !sql_column.IsIdentity) )
                    {
                        if (flag_first_value)
                            flag_first_value = false;
                        else
                            sb.Append(",");

                        sb.Append(Environment.NewLine + AddTabs(1));
                        sb.Append(PadSqlVariableName(NameFormatter.ToTSQLVariableName(sql_column), longest_column));
                        sb.Append(NameFormatter.ToTSQLType(sql_column));
                    }
                }

                sb.Append(Environment.NewLine + ")");

                return sb.ToString();
        }
        public static OutputObject GenerateCSharpDalClass(SqlTable sql_table, List<string> namespace_includes, bool convert_nullable_fields, bool include_is_dirty_flag)
        {
            #region SampleCode
                //public class FooClass
                //{
                //    private List<FooDataStrure> _Foo = null;

                //    //public FooClass()
                //    //{
                //    //    // foo
                //    //}

                //    public List<FooDataStrure> LoadData(DataTable dt)
                //    {
                //        _Foo.Clear();
                //        foreach (DataRow dr in dt.Rows)
                //        {
                //            p_Foo.Add(new FooDataStrure(Convert.ToInt32(dr["whatever"])));
                //        }

                //        return _Foo;
                //    }
                //}
                #endregion

                if (sql_table == null)
                    return null;

                string list_type			    = NameFormatter.ToCSharpClassName(sql_table.Name);
                string sql_tablename		    = NameFormatter.ToTSQLName(sql_table.Name);
                string collection_type          = "List<" + list_type + ">";
                string class_name               = NameFormatter.ToCSharpClassName("Dal" + sql_table.Name);
                int longest_column              = GetLongestColumnLength(sql_table);

                OutputObject output = new OutputObject();
                output.Name = class_name + ".cs";
                output.Type = OutputObject.eObjectType.CSharp;

                StringBuilder sb = new StringBuilder();

                #region Header block

                sb.AppendLine("using System;");
                sb.AppendLine("using System.Collections.Generic;");
                sb.AppendLine("using System.Data;");
                sb.AppendLine("using System.Data.SqlClient;");
                sb.AppendLine();

                sb.AppendLine("using DAL;");
                sb.AppendLine(GenerateNamespaceIncludes(namespace_includes));

                #endregion

                sb.AppendLine("namespace " + NameFormatter.ToCSharpPropertyName(sql_table.Database.Name));
                sb.AppendLine("{");
                //sb.AppendLine(AddTabs(1) + "[Serializable]");
                sb.AppendLine(AddTabs(1) + "public partial class " + class_name);
                sb.AppendLine(AddTabs(1) + "{");

                #region Fields bloc
                ////////////////////////////////////////////////////////////////////////////////

                sb.AppendLine(AddTabs(2) + "#region Fields");
                sb.AppendLine();

                sb.AppendLine(AddTabs(3) + "protected string _SQLConnection;");
                sb.AppendLine();

                sb.AppendLine(AddTabs(2) + "#endregion");
                sb.AppendLine();

                ////////////////////////////////////////////////////////////////////////////////
                #endregion

                sb.AppendLine(AddTabs(2) + "#region Methods");
                sb.AppendLine();

                #region Default CTOR
                ////////////////////////////////////////////////////////////////////////////////

                #region sample output
                //public Foo()
                //{
                //    //foo
                //}
                #endregion

                sb.AppendLine(AddTabs(3) + "public " + class_name + "(string sql_conn)");
                sb.AppendLine(AddTabs(3) + "{");
                sb.AppendLine(AddTabs(4) + "_SQLConnection = sql_conn;");
                sb.AppendLine(AddTabs(3) + "}");

                ////////////////////////////////////////////////////////////////////////////////
                #endregion

                sb.AppendLine();
                sb.AppendLine(AddTabs(3) + "// Public Methods");

                #region GetCountFromDb
                ////////////////////////////////////////////////////////////////////////////////

                #region Code Sample
                //public int GetCountFromDb()
                //{
                //    return Database.ExecuteScalarSp<int>("[GalacticConquest].[dbo].[up_Game_CountAll]", null, _SQLConnection);
                //}
                #endregion

                sb.AppendLine(AddTabs(3) + "public int GetCountFromDb()");
                sb.AppendLine(AddTabs(3) + "{");
                sb.AppendLine(AddTabs(4) + "return Database.ExecuteScalarSp<int>(\"[" + NameFormatter.ToCSharpPropertyName(sql_table.Database.Name) + "].[dbo].[" + GenerateSqlStoredProcName(sql_table.Name, eStoredProcType.CountAll, null) + "]\", null, _SQLConnection);");
                sb.AppendLine(AddTabs(3) + "}");
                sb.AppendLine();

                ////////////////////////////////////////////////////////////////////////////////
                #endregion

                #region GetSearchCountFromDb
                ////////////////////////////////////////////////////////////////////////////////

                #region Code Sample
                //public int GetSearchCountFromDb(string search_string)
                //{
                //    List<SqlParameter> parameters = new List<SqlParameter>();
                //    parameters.Add(new SqlParameter() { ParameterName = "@SearchString", SqlDbType = SqlDbType.VarChar, Size = 50, Value = search_string });
                //    return Database.ExecuteScalarSp<int>("[GalacticConquest].[dbo].[up_Game_CountSearch]", parameters, _SQLConnection);
                //}
                #endregion

                sb.AppendLine(AddTabs(3) + "public int GetSearchCountFromDb(string search_string)");
                sb.AppendLine(AddTabs(3) + "{");

                sb.AppendLine(AddTabs(4) + "List<SqlParameter> parameters = new List<SqlParameter>();");
                sb.AppendLine(AddTabs(4) + string.Format(SQL_PARAMETER_TEMPLATE, "@SearchString", "VarChar", 50, "search_string"));
                sb.AppendLine(AddTabs(4) + "return Database.ExecuteScalarSp<int>(\"" + NameFormatter.ToTSQLName(sql_table.Database.Name) + ".[dbo].[" + GenerateSqlStoredProcName(sql_table.Name, eStoredProcType.CountSearch, null) + "]\", parameters, _SQLConnection);");
                sb.AppendLine(AddTabs(3) + "}");
                sb.AppendLine();

                ////////////////////////////////////////////////////////////////////////////////
                #endregion

                #region LoadAllFromDb
                ////////////////////////////////////////////////////////////////////////////////

                #region Code Sample
                //public List<cGame> LoadAllFromDb()
                //{
                //    return Database.ExecuteQuerySp<cGame>("[GalacticConquest].[dbo].[up_Game_SelectAll]", null, _SQLConnection);
                //}
                #endregion

                sb.AppendLine(AddTabs(3) + "public " + collection_type + " LoadAllFromDb()");
                sb.AppendLine(AddTabs(3) + "{");
                sb.AppendLine(AddTabs(4) + "return Database.ExecuteQuerySp<" + list_type + ">(\"[" + NameFormatter.ToCSharpPropertyName(sql_table.Database.Name) + "].[dbo].[" + GenerateSqlStoredProcName(sql_table.Name, eStoredProcType.SelectAll, null) + "]\", null, _SQLConnection);");
                sb.AppendLine(AddTabs(3) + "}");
                sb.AppendLine();

                ////////////////////////////////////////////////////////////////////////////////
                #endregion

                #region LoadListFromDb
                ////////////////////////////////////////////////////////////////////////////////

                #region Code Sample
                //public List<cGame> LoadListFromDb(IEnumerable<int> id_list)
                //{
                //    List<SqlParameter> parameters = new List<SqlParameter>();
                //    parameters.Add(new SqlParameter() { ParameterName = "@IdList", SqlDbType = SqlDbType.VarChar, Size = -1, Value = Database.GenericListToStringList(id_list) });
                //    return Database.ExecuteQuerySp<cGame>("[GalacticConquest].[dbo].[up_Game_SelectMany]", parameters, _SQLConnection);
                //}
                #endregion

                if (sql_table.PkList.Count == 0)
                {
                    sb.AppendLine("// Cannot create LoadListFromDb() without a pk on database table.");
                }
                else
                {
                    sb.AppendLine(AddTabs(3) + "public " + collection_type + " LoadListFromDb(IEnumerable<int> id_list)");
                    sb.AppendLine(AddTabs(3) + "{");

                    sb.AppendLine(AddTabs(4) + "List<SqlParameter> parameters = new List<SqlParameter>();");
                    sb.AppendLine(AddTabs(4) + string.Format(SQL_PARAMETER_TEMPLATE, "@IdList", "VarChar", -1, "Database.GenericListToStringList(id_list)"));
                    sb.AppendLine(AddTabs(4) + "return Database.ExecuteQuerySp<" + list_type + ">(\"" + NameFormatter.ToTSQLName(sql_table.Database.Name) + ".[dbo].[" + GenerateSqlStoredProcName(sql_table.Name, eStoredProcType.SelectMany, null) + "]\", parameters, _SQLConnection);");
                    sb.AppendLine(AddTabs(3) + "}");
                    sb.AppendLine();
                }

                ////////////////////////////////////////////////////////////////////////////////
                #endregion

                #region LoadAllFromDbPaged
                ////////////////////////////////////////////////////////////////////////////////

                #region Code Sample
                //public List<cGame> LoadAllFromDbPaged(int start_index, int page_size, string search_string)
                //{
                //    List<SqlParameter> parameters = new List<SqlParameter>();
                //    parameters.Add(new SqlParameter() { ParameterName = "@StartNumber", SqlDbType = SqlDbType.Int, Size = 4, Value = start_index });
                //    parameters.Add(new SqlParameter() { ParameterName = "@PageSize", SqlDbType = SqlDbType.Int, Size = 4, Value = page_size });
                //    parameters.Add(new SqlParameter() { ParameterName = "@SearchString", SqlDbType = SqlDbType.VarChar, Size = 50, Value = search_string });
                //    return Database.ExecuteQuerySp<cGame>("[GalacticConquest].[dbo].[up_Game_SelectAllPaged]", parameters, _SQLConnection);
                //}
                #endregion

                sb.AppendLine(AddTabs(3) + "public " + collection_type + " LoadAllFromDbPaged(int start_index, int page_size, string search_string)");
                sb.AppendLine(AddTabs(3) + "{");

                sb.AppendLine(AddTabs(4) + "List<SqlParameter> parameters = new List<SqlParameter>();");
                sb.AppendLine(AddTabs(4) + string.Format(SQL_PARAMETER_TEMPLATE, "@StartNumber", "Int", 4, "start_index"));
                sb.AppendLine(AddTabs(4) + string.Format(SQL_PARAMETER_TEMPLATE, "@PageSize", "Int", 4, "page_size"));
                sb.AppendLine(AddTabs(4) + string.Format(SQL_PARAMETER_TEMPLATE, "@SearchString", "VarChar", 50, "search_string"));
                sb.AppendLine(AddTabs(4) + "return Database.ExecuteQuerySp<" + list_type + ">(\"[" + NameFormatter.ToCSharpPropertyName(sql_table.Database.Name) + "].[dbo].[" + GenerateSqlStoredProcName(sql_table.Name, eStoredProcType.SelectAllPag, null) + "]\", parameters, _SQLConnection);");
                sb.AppendLine(AddTabs(3) + "}");
                sb.AppendLine();

                ////////////////////////////////////////////////////////////////////////////////
                #endregion

                #region LoadSingleFromDb
                ////////////////////////////////////////////////////////////////////////////////

                #region Code Sample
                //public cGame LoadSingleFromDb(int id)
                //{
                //    List<SqlParameter> parameters = new List<SqlParameter>();
                //    parameters.Add(new SqlParameter() { ParameterName = "@Id", SqlDbType = SqlDbType.Int, Size = 4, Value = id });
                //    var results = Database.ExecuteQuerySp<cGame>("[GalacticConquest].[dbo].[up_Game_SelectSingle]", parameters, _SQLConnection);

                //    if (results != null && results.Count > 0)
                //        return results[0];
                //    else
                //        return null;
                //}
                #endregion

                sb.AppendLine(AddTabs(3) + "public " + list_type  + " LoadSingleFromDb(" + NameFormatter.GenerateCSharpFunctionArgs(sql_table, eIncludedFields.PKOnly) + ")");
                sb.AppendLine(AddTabs(3) + "{");
                sb.AppendLine(AddTabs(4) + "List<SqlParameter> parameters = new List<SqlParameter>();");

                // generate all Sp parameters
                foreach (var sql_column in sql_table.Columns.Values)
                {
                    if (sql_column.IsPk)
                        sb.AppendLine(AddTabs(4) + string.Format(SQL_PARAMETER_TEMPLATE, NameFormatter.ToTSQLVariableName(sql_column), sql_column.SqlDataType, sql_column.Length, NameFormatter.ToCSharpLocalVariable(sql_column.Name)));
                }

                sb.AppendLine(AddTabs(4) + "var results = Database.ExecuteQuerySp<" + list_type + ">(\"[" + NameFormatter.ToCSharpPropertyName(sql_table.Database.Name) + "].[dbo].[" + GenerateSqlStoredProcName(sql_table.Name, eStoredProcType.SelectSingle, null) + "]\", parameters, _SQLConnection);");
                sb.AppendLine();

                sb.AppendLine(AddTabs(4) + "if (results != null && results.Count > 0)");
                sb.AppendLine(AddTabs(5) + "return results[0];");
                sb.AppendLine(AddTabs(4) + "else");
                sb.AppendLine(AddTabs(5) + "return null;");
                sb.AppendLine(AddTabs(3) + "}");
                sb.AppendLine();

                ////////////////////////////////////////////////////////////////////////////////
                #endregion

                #region DeleteSingleFromDb
                ////////////////////////////////////////////////////////////////////////////////

                #region Code Sample
                //public bool DeleteSingleFromDb(int id)
                //{
                //    List<SqlParameter> parameters = new List<SqlParameter>();
                //    parameters.Add(new SqlParameter() { ParameterName = "@Id", SqlDbType = SqlDbType.Int, Size = 4, Value = id });
                //    return Database.ExecuteNonQuerySp("[GalacticConquest].[dbo].[up_Game_DeleteSingle]", parameters, _SQLConnection) > 0;
                //}
                #endregion

                sb.AppendLine(AddTabs(3) + "public bool DeleteSingleFromDb(" + NameFormatter.GenerateCSharpFunctionArgs(sql_table, eIncludedFields.PKOnly) + ")");
                sb.AppendLine(AddTabs(3) + "{");

                sb.AppendLine(AddTabs(4) + "List<SqlParameter> parameters = new List<SqlParameter>();");

                // generate all SP parameters
                foreach (var sql_column in sql_table.Columns.Values)
                {
                    if (sql_column.IsPk)
                        sb.AppendLine(AddTabs(4) + string.Format(SQL_PARAMETER_TEMPLATE, NameFormatter.ToTSQLVariableName(sql_column), sql_column.SqlDataType, sql_column.Length, NameFormatter.ToCSharpLocalVariable(sql_column.Name)));
                }

                sb.AppendLine(AddTabs(4) + "return Database.ExecuteNonQuerySp(\"" + NameFormatter.ToTSQLName(sql_table.Database.Name) + ".[dbo].[" + GenerateSqlStoredProcName(sql_table.Name, eStoredProcType.DelSingle, null) + "]\", parameters, _SQLConnection) > 0;");
                sb.AppendLine(AddTabs(3) + "}");
                sb.AppendLine();

                ////////////////////////////////////////////////////////////////////////////////
                #endregion

                #region DeleteListFromDb
                ////////////////////////////////////////////////////////////////////////////////

                #region Code Sample
                //public int DeleteListFromDb(IEnumerable<int> id_list)
                //{
                //    List<SqlParameter> parameters = new List<SqlParameter>();
                //    parameters.Add(new SqlParameter() { ParameterName = "@IdList", SqlDbType = SqlDbType.VarChar, Size = -1, Value = Database.GenericListToStringList<int>(id_list) });
                //    return Database.ExecuteNonQuerySp("[GalacticConquest].[dbo].[up_Game_DeleteMany]", parameters, _SQLConnection);
                //}
                #endregion

                sb.AppendLine(AddTabs(3) + "public int DeleteListFromDb(IEnumerable<int> id_list)");
                sb.AppendLine(AddTabs(3) + "{");
                sb.AppendLine(AddTabs(4) + "List<SqlParameter> parameters = new List<SqlParameter>();");
                sb.AppendLine(AddTabs(4) + string.Format(SQL_PARAMETER_TEMPLATE, "@IdList", "VarChar", -1, "Database.GenericListToStringList(id_list)"));
                sb.AppendLine(AddTabs(4) + "return Database.ExecuteNonQuerySp(\"" + NameFormatter.ToTSQLName(sql_table.Database.Name) + ".[dbo].[" + GenerateSqlStoredProcName(sql_table.Name, eStoredProcType.DelMany, null) + "]\", parameters, _SQLConnection);");
                sb.AppendLine(AddTabs(3) + "}");
                sb.AppendLine();

                ////////////////////////////////////////////////////////////////////////////////
                #endregion

                #region DeleteAllFromDb
                ////////////////////////////////////////////////////////////////////////////////

                #region Code Sample
                //public int DeleteAllFromDb()
                //{
                //    return Database.ExecuteNonQuerySp("[GalacticConquest].[dbo].[up_Game_DeleteAll]", null, _SQLConnection);
                //}
                #endregion

                sb.AppendLine(AddTabs(3) + "public int DeleteAllFromDb()");
                sb.AppendLine(AddTabs(3) + "{");
                sb.AppendLine(AddTabs(4) + "return Database.ExecuteNonQuerySp(\"" + NameFormatter.ToTSQLName(sql_table.Database.Name) + ".[dbo].[" + GenerateSqlStoredProcName(sql_table.Name, eStoredProcType.DelAll, null) + "]\", null, _SQLConnection);");
                sb.AppendLine(AddTabs(3) + "}");
                sb.AppendLine();

                ////////////////////////////////////////////////////////////////////////////////
                #endregion

                #region LoadFromXmlFile
                ////////////////////////////////////////////////////////////////////////////////

                #region Code Sample
                //public bool LoadFromXmlFile(string filename)
                //{
                //    string file_data = FileIo.ReadFromFile(filename, out file_data);
                //    DataSet ds = XmlConverter.XmlStringToDataSet(file_data);
                //    return LoadFromDataTable(ds.Tables["Game"], out results, out exception);
                //}
                #endregion

                sb.AppendLine(AddTabs(3) + "public " + collection_type + " LoadFromXmlFile(string filename)");
                sb.AppendLine(AddTabs(3) + "{");
                sb.AppendLine(AddTabs(4) + "string file_data = FileIo.ReadFromFile(filename);");
                sb.AppendLine(AddTabs(4) + "DataSet ds = XmlConverter.XmlStringToDataSet(file_data);");
                sb.AppendLine(AddTabs(4) + "return LoadFromDataTable(ds.Tables[\"" + sql_table.Name + "\"]);");
                sb.AppendLine(AddTabs(3) + "}");
                sb.AppendLine();

                ////////////////////////////////////////////////////////////////////////////////
                #endregion

                #region SaveToXmlFile
                ////////////////////////////////////////////////////////////////////////////////

                #region Code Sample
                //public void SaveToXmlFile(List<cGame> collection, string filename)
                //{
                //    DataTable dt = ConvertToDataTable(collection);
                //    string xml = XmlConverter.DataTableToXmlString(dt, "GalacticConquest");
                //    FileIo.WriteToFile(filename, xml);
                //}
                #endregion

                sb.AppendLine(AddTabs(3) + "public void SaveToXmlFile(" + collection_type  + " collection, string filename)");
                sb.AppendLine(AddTabs(3) + "{");
                sb.AppendLine(AddTabs(4) + "DataTable dt = ConvertToDataTable(collection);");
                sb.AppendLine(AddTabs(4) + "string xml = XmlConverter.DataTableToXmlString(dt, \"" + NameFormatter.ToCSharpPropertyName(sql_table.Database.Name) + "\");");
                sb.AppendLine(AddTabs(4) + "FileIo.WriteToFile(filename, xml);");
                sb.AppendLine(AddTabs(3) + "}");
                sb.AppendLine();

                ////////////////////////////////////////////////////////////////////////////////
                #endregion

                #region SaveAll Method
                ////////////////////////////////////////////////////////////////////////////////

                #region Code Sample
                //public void SaveAll(List<cGame> collection)
                //{
                //    foreach (var item in collection)
                //        Save(item);
                //}
                #endregion

                sb.AppendLine(AddTabs(3) + "public void SaveAll(" + collection_type + " collection)");
                sb.AppendLine(AddTabs(3) + "{");
                sb.AppendLine(AddTabs(4) + "foreach (var item in collection)");
                sb.AppendLine(AddTabs(5) + "Save(item);");
                sb.AppendLine(AddTabs(3) + "}");
                sb.AppendLine();

                ////////////////////////////////////////////////////////////////////////////////
                #endregion

                #region Save Method
                ////////////////////////////////////////////////////////////////////////////////

                #region Code Sample
                //public bool Save(cGame item)
                //{
                //    List<SqlParameter> parameters = GetSqlParameterList(item);
                //    return Database.ExecuteNonQuerySp("[GalacticConquest].[dbo].[up_Game_Set]", parameters, _SQLConnection) > 0;
                //}
                #endregion

                sb.AppendLine(AddTabs(3) + "public bool Save(" + list_type + " item)");
                sb.AppendLine(AddTabs(3) + "{");
                sb.AppendLine(AddTabs(4) + "List<SqlParameter> parameters = GetSqlParameterList(item);");
                sb.AppendLine(AddTabs(4) + "return Database.ExecuteNonQuerySp(\"" + NameFormatter.ToTSQLName(sql_table.Database.Name) + ".[dbo].[" + GenerateSqlStoredProcName(sql_table.Name, eStoredProcType.UpdateInsert, null) + "]\", parameters, _SQLConnection) > 0;");
                sb.AppendLine(AddTabs(3) + "}");
                sb.AppendLine();

                ////////////////////////////////////////////////////////////////////////////////
                #endregion

                #region LoadFromDataTable
                ////////////////////////////////////////////////////////////////////////////////

                #region Code Sample
                //protected List<cGame> LoadFromDataTable(DataTable dt)
                //{
                //    if (dt == null || dt.Rows.Count < 1 || dt.Columns.Count < 1)
                //        return null;

                //    var results = new List<cGame>();

                //    foreach (DataRow dr in dt.Rows)
                //    {
                //        cGame obj = new cGame();

                //        obj.Id = Convert.ToInt32(dr["Id"]);
                //        obj.Name = Convert.ToString(dr["Name"]);
                //        obj.StarDate = Convert.ToDouble(dr["StarDate"]);
                //        obj.GameStateId = Convert.ToInt32(dr["GameStateId"]);
                //        obj.CreatedById = Convert.ToInt32(dr["CreatedById"]);
                //        obj.CreatedDate = Convert.ToDateTime(dr["CreatedDate"]);
                //        obj.Description = Convert.ToString(dr["Description"]);
                //        obj.Disabled = Convert.ToBoolean(dr["Disabled"]);

                //        results.Add(obj);
                //    }

                //    return results;
                //}
                #endregion

                sb.AppendLine(AddTabs(3) + "protected " + collection_type + " LoadFromDataTable(DataTable dt)");
                sb.AppendLine(AddTabs(3) + "{");

                sb.AppendLine(AddTabs(4) + "if (dt == null || dt.Rows.Count < 1 || dt.Columns.Count < 1)");
                sb.AppendLine(AddTabs(5) + "return null;");
                sb.AppendLine();

                sb.AppendLine(AddTabs(4) + "var results = new " + collection_type  + "();");
                sb.AppendLine();

                sb.AppendLine(AddTabs(4) + "foreach (DataRow dr in dt.Rows)");
                sb.AppendLine(AddTabs(4) + "{");
                sb.AppendLine(AddTabs(5) + PadCSharpVariableName(NameFormatter.ToCSharpClassName(sql_table.Name) + " obj", longest_column) + "= new " + NameFormatter.ToCSharpClassName(sql_table.Name) + "();");
                sb.AppendLine();

                foreach (var sql_column in sql_table.Columns.Values)
                {
                    sb.Append(AddTabs(5));

                    if (sql_column.IsNullable)
                    {
                        // hack - nullable doubles need special treatment
                        switch (sql_column.SqlDataType)
                        {
                            case SqlDbType.Float:

                                sb.Append(PadCSharpVariableName("obj." + NameFormatter.ToCSharpPropertyName(sql_column.Name), longest_column));
                                sb.Append( "= (dr[\"" + NameFormatter.ToCSharpPropertyName(sql_column.Name) + "\"] == DBNull.Value) ? null : ");
                                sb.Append("new double?(" + NameFormatter.GetCSharpCastString(sql_column) + "(dr[\"" + NameFormatter.ToCSharpPropertyName(sql_column.Name) + "\"]));");
                                break;

                            case SqlDbType.UniqueIdentifier:

                                sb.Append(PadCSharpVariableName("obj." + NameFormatter.ToCSharpPropertyName(sql_column.Name), longest_column));
                                sb.Append( "= (dr[\"" + NameFormatter.ToCSharpPropertyName(sql_column.Name) + "\"] == DBNull.Value) ? null : ");
                                sb.Append("new Guid?(new Guid((string)dr[\"" + NameFormatter.ToCSharpPropertyName(sql_column.Name) + "\"]));");
                                break;

                            case SqlDbType.DateTime:

                                sb.Append(PadCSharpVariableName("obj." + NameFormatter.ToCSharpPropertyName(sql_column.Name), longest_column));
                                sb.Append( "= (dr[\"" + NameFormatter.ToCSharpPropertyName(sql_column.Name) + "\"] == DBNull.Value) ? null : ");
                                sb.Append("new DateTime?(Convert.ToDateTime(dr[\"" + NameFormatter.ToCSharpPropertyName(sql_column.Name) + "\"]));");
                                break;

                            // TODO may need more switch cases here...

                            default:

                                sb.Append(PadCSharpVariableName("obj." + NameFormatter.ToCSharpPropertyName(sql_column.Name), longest_column));
                                sb.Append("= (dr[\"" + NameFormatter.ToCSharpPropertyName(sql_column.Name) + "\"] == DBNull.Value) ? null : ");
                                sb.Append(NameFormatter.GetCSharpCastString(sql_column) + "(dr[\"" + NameFormatter.ToCSharpPropertyName(sql_column.Name) + "\"]);");
                                break;
                        }
                    }
                    else
                    {
                        switch (sql_column.SqlDataType)
                        {
                            case SqlDbType.UniqueIdentifier:

                                sb.Append(PadCSharpVariableName("obj." + NameFormatter.ToCSharpPropertyName(sql_column.Name), longest_column));
                                sb.Append("= new Guid((string)(dr[\"" + NameFormatter.ToCSharpPropertyName(sql_column.Name) + "\"]));");
                                break;

                            default:

                                sb.Append(PadCSharpVariableName("obj." + NameFormatter.ToCSharpPropertyName(sql_column.Name), longest_column));
                                sb.Append("= " + NameFormatter.GetCSharpCastString(sql_column) + "(dr[\"" + NameFormatter.ToCSharpPropertyName(sql_column.Name) + "\"]);");
                                break;
                        }
                    }

                    sb.AppendLine();
                }
                sb.AppendLine();

                sb.AppendLine(AddTabs(5) + "results.Add(obj);");
                sb.AppendLine(AddTabs(4) + "}");
                sb.AppendLine();
                sb.AppendLine(AddTabs(4) + "return results;");
                sb.AppendLine(AddTabs(3) + "}");
                sb.AppendLine();

                ////////////////////////////////////////////////////////////////////////////////
                #endregion

                #region ConvertToDataTable
                ////////////////////////////////////////////////////////////////////////////////

                #region Code Sample
                //protected DataTable ConvertToDataTable(List<cGame> collection)
                //{
                //    DataTable dt = new DataTable();

                //    dt.Columns.Add("Id", typeof(int));
                //    dt.Columns.Add("Name", typeof(string));
                //    dt.Columns.Add("Disabled", typeof(bool));

                //    dt.TableName = "Game";

                //    foreach (var obj in collection)
                //    {
                //        DataRow dr = dt.NewRow();

                //        dr["Id"]            = obj.Id;
                //        dr["Name"]          = obj.Name;
                //        dr["Disabled"]      = obj.Disabled;

                //        dt.Rows.Add(dr);
                //    }

                //    return dt;
                //}
                #endregion

                sb.AppendLine(AddTabs(3) + "protected DataTable ConvertToDataTable(" + collection_type + " collection)");
                sb.AppendLine(AddTabs(3) + "{");
                sb.AppendLine(AddTabs(4) + "DataTable dt = new DataTable();");
                sb.AppendLine();

                // dt.Columns.Add("Name", typeof(string));
                foreach (var sql_column in sql_table.Columns.Values)
                    sb.AppendLine(AddTabs(4) + "dt.Columns.Add(\"" + NameFormatter.ToCSharpPropertyName(sql_column.Name) + "\", typeof(" + NameFormatter.SQLTypeToCSharpType(sql_column) + "));");

                sb.AppendLine();
                sb.AppendLine(AddTabs(4) + "dt.TableName = \"" + sql_table.Name + "\";");
                sb.AppendLine();

                sb.AppendLine(AddTabs(4) + "foreach (var obj in collection)");
                sb.AppendLine(AddTabs(4) + "{");
                sb.AppendLine(AddTabs(5) + "DataRow dr = dt.NewRow();");
                sb.AppendLine();

                foreach (var sql_column in sql_table.Columns.Values)
                {
                    sb.Append(AddTabs(5));
                    sb.Append(PadCSharpVariableName("dr[\"" + NameFormatter.ToCSharpPropertyName(sql_column.Name) + "\"]", longest_column + 7));
                    sb.Append("= obj." + NameFormatter.ToCSharpPropertyName(sql_column.Name)  + ";" + Environment.NewLine);
                }

                sb.AppendLine();
                sb.AppendLine(AddTabs(5) + "dt.Rows.Add(dr);");
                sb.AppendLine(AddTabs(4) + "}");
                sb.AppendLine();
                sb.AppendLine(AddTabs(4) + "return dt;");
                sb.AppendLine(AddTabs(3) + "}");
                sb.AppendLine();

                ////////////////////////////////////////////////////////////////////////////////
                #endregion

                #region GetSqlParameterList Method
                ////////////////////////////////////////////////////////////////////////////////

                #region Code Sample
                //protected List<SqlParameter> GetSqlParameterList(cGame obj)
                //{
                //    List<SqlParameter> parameters = new List<SqlParameter>();
                //    SqlParameter parameter;

                //    parameter = new SqlParameter("@Id", SqlDbType.Int, 4);
                //    parameter.Value = obj.Id;
                //    parameters.Add(parameter);

                //    parameter = new SqlParameter("@Disabled", SqlDbType.Bit, 1);
                //    parameter.Value = obj.Disabled;
                //    parameters.Add(parameter);

                //    return parameters;
                //}
                #endregion

                sb.AppendLine(AddTabs(3) + "protected List<SqlParameter> GetSqlParameterList(" + NameFormatter.ToCSharpClassName(sql_table.Name) + " obj)");
                sb.AppendLine(AddTabs(3) + "{");
                sb.AppendLine(AddTabs(4) + "List<SqlParameter> parameters = new List<SqlParameter>();");
                sb.AppendLine(AddTabs(4) + "SqlParameter parameter;");
                sb.AppendLine();

                // build parameter collection here
                foreach (var sql_column in sql_table.Columns.Values)
                {
                    // REFACTOR
                    //sb.AppendLine(AddTabs(4) + string.Format(SQL_PARAMETER_TEMPATE, "@SearchString", SqlDbType.VarChar, 50, "search_string"));

                    string column_name = NameFormatter.ToCSharpPropertyName(sql_column.Name);

                    sb.Append(AddTabs(4) + NameFormatter.ToCSharpSQLParameterString(sql_column));

                    if (sql_column.IsNullable && !convert_nullable_fields)
                    {
                        //parameter.Value = (obj.CancelledDate == null) ? (object)DBNull.Value : _CancelledDate;
                        sb.Append(Environment.NewLine + AddTabs(4) + "parameter.Value = (obj." + column_name + " == null) ? (object)DBNull.Value : obj." + column_name + ";");
                    }
                    else
                    {
                        sb.Append(Environment.NewLine + AddTabs(4) + "parameter.Value = obj." + column_name + ";");
                    }

                    sb.Append(Environment.NewLine + AddTabs(4) + "parameters.Add(parameter);" + Environment.NewLine);
                    sb.AppendLine();
                }

                sb.AppendLine(AddTabs(4) + "return parameters;");
                sb.AppendLine(AddTabs(3) + "}");

                ////////////////////////////////////////////////////////////////////////////////
                #endregion

                sb.AppendLine();
                sb.AppendLine(AddTabs(2) + "#endregion");

                sb.AppendLine(AddTabs(1) + "}");
                sb.AppendLine("}");

                output.Body = sb.ToString();

                return output;
        }
        // WinForm Generation
        public static OutputObject GenerateWinformEditCode(SqlTable sql_table)
        {
            #region Sample Output
                //using System;
                //using System.Collections.Generic;
                //using System.ComponentModel;
                //using System.Data;
                //using System.Drawing;
                //using System.Linq;
                //using System.Text;
                //using System.Windows.Forms;

                //namespace MarvelSuperheroesEditor
                //{
                //    public partial class Form1 : Form
                //    {
                //        public Form1()
                //        {
                //            InitializeComponent();
                //        }
                //    }
                //}
                #endregion

                if (sql_table == null)
                    return null;

                string class_name   = "frmEdit" + NameFormatter.ToCSharpPropertyName(sql_table.Name);
                string dal_name     =   NameFormatter.ToCSharpClassName("Dal" + sql_table.Name);

                OutputObject output = new OutputObject();
                output.Name = class_name + ".cs";
                output.Type = OutputObject.eObjectType.CSharp;

                StringBuilder sb = new StringBuilder();

                sb.AppendLine("using System;");
                sb.AppendLine("using System.Collections.Generic;");
                sb.AppendLine("using System.Configuration;");
                sb.AppendLine("using System.ComponentModel;");
                sb.AppendLine("using System.Data;");
                //sb.AppendLine("using System.Drawing;");
                //sb.AppendLine("using System.Linq;");
                //sb.AppendLine("using System.Text;");
                sb.AppendLine("using System.Windows.Forms;");
                sb.AppendLine();

                sb.AppendLine("using DAL;");
                sb.AppendLine("using " + NameFormatter.ToCSharpPropertyName(sql_table.Database.Name) + ";");
                sb.AppendLine();

                sb.AppendLine("namespace " + NameFormatter.ToCSharpPropertyName(sql_table.Database.Name) + "Editor");
                sb.AppendLine("{");

                sb.AppendLine(AddTabs(1) + "public partial class " + class_name + " : Form");
                sb.AppendLine(AddTabs(1) + "{");

                #region Fields
                sb.AppendLine(AddTabs(2) + "#region Fields");
                sb.AppendLine();
                sb.AppendLine(AddTabs(3) + "protected string _SQLConnection = ConfigurationManager.ConnectionStrings[\"SQLConnection\"].ConnectionString;");
                sb.AppendLine();
                sb.AppendLine(AddTabs(2) + "#endregion");
                sb.AppendLine();
                #endregion

                #region Methods
                sb.AppendLine(AddTabs(2) + "#region Methods");
                sb.AppendLine();

                sb.AppendLine(AddTabs(3) + "public " + class_name + "()");
                sb.AppendLine(AddTabs(3) + "{");
                sb.AppendLine(AddTabs(4) + "InitializeComponent();");
                sb.AppendLine();
                sb.AppendLine(AddTabs(4) + "LoadPopulateItemList();");
                sb.AppendLine(AddTabs(3) + "}");
                sb.AppendLine();

                sb.AppendLine(AddTabs(3) + "private bool LoadPopulateItemList()");
                sb.AppendLine(AddTabs(3) + "{");
                sb.AppendLine(AddTabs(4) + "this.Cursor = Cursors.WaitCursor;");
                sb.AppendLine();
                sb.AppendLine(AddTabs(4) + "try");
                sb.AppendLine(AddTabs(4) + "{");
                sb.AppendLine(AddTabs(5) + "" + dal_name + " dal = new " + dal_name + "(_SQLConnection);");
                sb.AppendLine();
                sb.AppendLine(AddTabs(5) + "if (dal.LoadAllFromDb())");
                sb.AppendLine(AddTabs(5) + "{");
                sb.AppendLine(AddTabs(6) + "if (dal.Collection != null && dal.Collection.Count != 0)");
                sb.AppendLine(AddTabs(6) + "{");
                sb.AppendLine(AddTabs(7) + "cboItemList.BeginUpdate();");
                sb.AppendLine(AddTabs(7) + "cboItemList.ValueMember     = \"" + FindIdField(sql_table) + "\";");
                sb.AppendLine(AddTabs(7) + "cboItemList.DisplayMember   = \"" + FindNameField(sql_table) + "\";");
                sb.AppendLine(AddTabs(7) + "cboItemList.DataSource      = dal.Collection;");
                sb.AppendLine(AddTabs(7) + "cboItemList.EndUpdate();");
                sb.AppendLine(AddTabs(6) + "}");
                sb.AppendLine(AddTabs(5) + "}");
                sb.AppendLine(AddTabs(4) + "}");
                sb.AppendLine(AddTabs(4) + "catch");
                sb.AppendLine(AddTabs(4) + "{");
                sb.AppendLine(AddTabs(5) + "return false;");
                sb.AppendLine(AddTabs(4) + "}");
                sb.AppendLine();
                sb.AppendLine(AddTabs(4) + "this.Cursor = Cursors.Default;");
                sb.AppendLine(AddTabs(4) + "return true;");
                sb.AppendLine(AddTabs(3) + "}");
                sb.AppendLine();

                sb.AppendLine(AddTabs(2) + "#endregion");
                sb.AppendLine();
                #endregion

                #region Events
                sb.AppendLine(AddTabs(2) + "#region Events");
                sb.AppendLine();

                sb.AppendLine(AddTabs(3) + "private void btnCancel_Click(object sender, EventArgs e)");
                sb.AppendLine(AddTabs(3) + "{");
                sb.AppendLine(AddTabs(3) + "}");
                sb.AppendLine(AddTabs(3) + "private void btnSave_Click(object sender, EventArgs e)");
                sb.AppendLine(AddTabs(3) + "{");
                sb.AppendLine(AddTabs(3) + "}");
                sb.AppendLine(AddTabs(3) + "private void cboItemList_SelectedIndexChanged(object sender, EventArgs e)");
                sb.AppendLine(AddTabs(3) + "{");
                sb.AppendLine(AddTabs(3) + "}");

                sb.AppendLine();
                sb.AppendLine(AddTabs(2) + "#endregion");
                #endregion

                sb.AppendLine(AddTabs(1) + "}");
                sb.AppendLine("}");

                output.Body = sb.ToString();
                return output;
        }
        public static OutputObject GenerateSelectManyByXProc(SqlTable sql_table, List<string> sort_fields, List<string> select_fields, bool generate_stored_proc_perms)
        {
            if (sql_table == null)
                    return null;

                string procedure_name   = GenerateSqlStoredProcName(sql_table.Name, eStoredProcType.SelectManyByX, select_fields);
                int longest_column      = GetLongestColumnLength(sql_table) + sql_table.Name.Length;
                bool flag_first_value;
                string name_buffer;

                OutputObject output = new OutputObject();
                output.Name = procedure_name + ".sql";
                output.Type = OutputObject.eObjectType.Sql;

                StringBuilder sb = new StringBuilder();

                sb.AppendLine(GenerateSqlExistanceChecker(procedure_name));
                sb.AppendLine(GenerateHeader(procedure_name));

                sb.AppendLine("CREATE PROCEDURE " + procedure_name);
                sb.AppendLine("(");
                sb.AppendLine(GenerateSelectClauseArguments(sql_table, select_fields));
                sb.AppendLine(")");
                sb.AppendLine("AS");
                sb.AppendLine();
                sb.AppendLine("SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED");
                sb.AppendLine("SET NOCOUNT ON");
                sb.AppendLine();

                #region Selected Columns

                flag_first_value = true;

                foreach (var sql_column in sql_table.Columns.Values)
                {
                    if (flag_first_value)
                    {
                        sb.Append("SELECT" + AddTabs(1));
                        flag_first_value = false;
                    }
                    else
                    {
                        sb.Append("," + Environment.NewLine + AddTabs(2));
                    }

                    name_buffer = NameFormatter.ToTSQLName(sql_column.Table.Name) + "." + NameFormatter.ToTSQLName(sql_column.Name);
                    sb.Append(PadSqlVariableName(name_buffer, longest_column) + "AS " + NameFormatter.ToTSQLName(sql_column.Name));
                }
                #endregion

                sb.AppendLine();
                sb.AppendLine();
                sb.AppendLine("FROM" + AddTabs(1) + NameFormatter.ToTSQLName(sql_table.Name));
                sb.AppendLine();

                sb.AppendLine("WHERE" + AddTabs(1) + PadSqlVariableName(NameFormatter.ToTSQLName(sql_table.Name) + ".[Disabled]", longest_column) + "= 0");
                sb.AppendLine(GenerateSelectClause(sql_table, select_fields));
                sb.AppendLine();
                sb.AppendLine(GenerateOrderByClause(sql_table, sort_fields));
                sb.AppendLine("GO");
                sb.AppendLine();

                if (generate_stored_proc_perms)
                {
                    sb.AppendLine(GenerateSqlStoredProcPerms(procedure_name));
                    sb.AppendLine();
                }

                output.Body = sb.ToString();
                return output;
        }
        public bool LoadDatabaseMetadata(string database_name, string connection_string)
        {
            if (string.IsNullOrEmpty(database_name))
            {
                throw new ArgumentException("Database name is null or empty");
            }

            Reset();

            Name             = database_name;
            ConnectionString = connection_string;

            // load and parse out table data
            try
            {
                string sql_query = GetTableData();

                DataTable dt = Database.ExecuteQuery(sql_query, null, ConnectionString);

                if (dt != null && dt.Rows.Count != 0 && dt.Columns.Count != 0)
                {
                    foreach (DataRow dr in dt.Rows)
                    {
                        string table_name  = (string)dr["TableName"];
                        string column_name = (string)dr["ColumnName"];

                        if (!Tables.ContainsKey(table_name))
                        {
                            SqlTable sql_table = new SqlTable(this, table_name);
                            Tables.Add(table_name, sql_table);
                        }

                        SqlColumn sql_column = new SqlColumn();

                        sql_column.Table         = Tables[table_name];
                        sql_column.Name          = (string)dr["ColumnName"];
                        sql_column.DataType      = (string)dr["DataType"];
                        sql_column.Length        = Convert.ToInt32(dr["Length"]);
                        sql_column.Precision     = Convert.ToInt32(dr["Precision"]);
                        sql_column.IsNullable    = Convert.ToBoolean(dr["IsNullable"]);
                        sql_column.IsPk          = Convert.ToBoolean(dr["IsPK"]);
                        sql_column.IsIdentity    = Convert.ToBoolean(dr["IsIdentity"]);
                        sql_column.ColumnOrdinal = Convert.ToInt32(dr["ColumnOrdinal"]);

                        if (Tables[table_name].Columns.ContainsKey(column_name))
                        {
                            throw new Exception($"Column {column_name} already exists in table {Tables[table_name]}");
                        }
                        else
                        {
                            Tables[table_name].Columns.Add(column_name, sql_column);
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                ErrorList.Add(ex);
            }

            // get SP
            try
            {
                string sql_query = GetStoredProcedures();

                DataTable dt = Database.ExecuteQuery(sql_query, null, ConnectionString);

                if (dt != null && dt.Rows.Count != 0 && dt.Columns.Count != 0)
                {
                    foreach (DataRow dr in dt.Rows)
                    {
                        SqlScript sql_script = new SqlScript();

                        sql_script.Name = (string)dr["Name"];
                        sql_script.Body = (string)dr["Body"];

                        if (StoredProcedures.ContainsKey(sql_script.Name))
                        {
                            StoredProcedures[sql_script.Name].Body += sql_script.Body;
                        }
                        else
                        {
                            StoredProcedures.Add(sql_script.Name, sql_script);
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                ErrorList.Add(ex);
            }

            // get functions
            try
            {
                string sql_query = GetFunctions();

                DataTable dt = Database.ExecuteQuery(sql_query, null, ConnectionString);

                if (dt != null && dt.Rows.Count != 0 && dt.Columns.Count != 0)
                {
                    foreach (DataRow dr in dt.Rows)
                    {
                        SqlScript sql_script = new SqlScript();

                        sql_script.Name = (string)dr["Name"];
                        sql_script.Body = (string)dr["Body"];

                        if (Functions.ContainsKey(sql_script.Name))
                        {
                            Functions[sql_script.Name].Body += sql_script.Body;
                        }
                        else
                        {
                            Functions.Add(sql_script.Name, sql_script);
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                ErrorList.Add(ex);
            }

            // get constraints
            try
            {
                string sql_query = GetConstraints();

                DataTable dt = Database.ExecuteQuery(sql_query, null, ConnectionString);

                if (dt != null && dt.Rows.Count != 0 && dt.Columns.Count != 0)
                {
                    foreach (DataRow dr in dt.Rows)
                    {
                        SqlConstraint sql_constraint = new SqlConstraint();

                        sql_constraint.ConstraintName = (string)dr["ConstraintName"];
                        sql_constraint.FKTable        = (string)dr["FKTable"];
                        sql_constraint.FKColumn       = (string)dr["FKColumn"];
                        sql_constraint.PKTable        = (string)dr["PKTable"];
                        sql_constraint.PKColumn       = (string)dr["PKColumn"];

                        if (Constraints.ContainsKey(sql_constraint.ConstraintName))
                        {
                            throw new Exception(string.Format("Constraint {0} already exists.", sql_constraint.ConstraintName));
                        }
                        else
                        {
                            Constraints.Add(sql_constraint.ConstraintName, sql_constraint);
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                ErrorList.Add(ex);
            }

            // load default values
            try
            {
                string sql_query = GetDefaultValues();

                DataTable dt = Database.ExecuteQuery(sql_query, null, ConnectionString);

                if (dt != null && dt.Rows.Count != 0 && dt.Columns.Count != 0)
                {
                    foreach (DataRow dr in dt.Rows)
                    {
                        if (Tables.ContainsKey((string)dr["TableName"]))
                        {
                            if (Tables[(string)dr["TableName"]].Columns.ContainsKey((string)dr["ColumnName"]))
                            {
                                Tables[(string)dr["TableName"]].Columns[(string)dr["ColumnName"]].DefaultValue = RemoveWrappingCharacters((string)dr["DefaultValue"]);
                            }
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                ErrorList.Add(ex);
            }

            return(ErrorList.Count == 0);
        }
        public static OutputObject GenerateWinformEditCodeDesigner(SqlTable sql_table)
        {
            #region Code Output
                //namespace MarvelSuperheroesEditor
                //{
                //    partial class Form1
                //    {
                //        /// <summary>
                //        /// Required designer variable.
                //        /// </summary>
                //        private System.ComponentModel.IContainer components = null;

                //        /// <summary>
                //        /// Clean up any resources being used.
                //        /// </summary>
                //        /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
                //        protected override void Dispose(bool disposing)
                //        {
                //            if (disposing && (components != null))
                //            {
                //                components.Dispose();
                //            }
                //            base.Dispose(disposing);
                //        }

                //        #region Windows Form Designer generated code

                //        /// <summary>
                //        /// Required method for Designer support - do not modify
                //        /// the contents of this method with the code editor.
                //        /// </summary>
                //        private void InitializeComponent()
                //        {
                //            this.btnSave = new System.Windows.Forms.Button();
                //            this.btnCancel = new System.Windows.Forms.Button();
                //            this.label1 = new System.Windows.Forms.Label();
                //            this.textBox1 = new System.Windows.Forms.TextBox();
                //            this.SuspendLayout();
                //            //
                //            // btnSave
                //            //
                //            this.btnSave.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
                //            this.btnSave.Location = new System.Drawing.Point(232, 36);
                //            this.btnSave.Name = "btnSave";
                //            this.btnSave.Size = new System.Drawing.Size(75, 23);
                //            this.btnSave.TabIndex = 0;
                //            this.btnSave.Text = "Save";
                //            this.btnSave.UseVisualStyleBackColor = true;
                //            //
                //            // btnCancel
                //            //
                //            this.btnCancel.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
                //            this.btnCancel.Location = new System.Drawing.Point(151, 36);
                //            this.btnCancel.Name = "btnCancel";
                //            this.btnCancel.Size = new System.Drawing.Size(75, 23);
                //            this.btnCancel.TabIndex = 1;
                //            this.btnCancel.Text = "Cancel";
                //            this.btnCancel.UseVisualStyleBackColor = true;
                //            //
                //            // label1
                //            //
                //            this.label1.AutoSize = true;
                //            this.label1.Location = new System.Drawing.Point(12, 9);
                //            this.label1.Name = "label1";
                //            this.label1.Size = new System.Drawing.Size(35, 13);
                //            this.label1.TabIndex = 2;
                //            this.label1.Text = "label1";
                //            //
                //            // textBox1
                //            //
                //            this.textBox1.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
                //            | System.Windows.Forms.AnchorStyles.Right)));
                //            this.textBox1.Location = new System.Drawing.Point(118, 6);
                //            this.textBox1.Name = "textBox1";
                //            this.textBox1.Size = new System.Drawing.Size(189, 20);
                //            this.textBox1.TabIndex = 3;
                //            //
                //            // Form1
                //            //
                //            this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
                //            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
                //            this.ClientSize = new System.Drawing.Size(319, 71);
                //            this.Controls.Add(this.textBox1);
                //            this.Controls.Add(this.label1);
                //            this.Controls.Add(this.btnCancel);
                //            this.Controls.Add(this.btnSave);
                //            this.Name = "Form1";
                //            this.Text = "Form1";
                //            this.ResumeLayout(false);
                //            this.PerformLayout();
                //        }

                //        #endregion

                //        private System.Windows.Forms.Button btnSave;
                //        private System.Windows.Forms.Button btnCancel;
                //        private System.Windows.Forms.Label label1;
                //        private System.Windows.Forms.TextBox textBox1;
                //    }
                //}
                #endregion

                if (sql_table == null)
                    return null;

                string class_name = "frmEdit" + NameFormatter.ToCSharpPropertyName(sql_table.Name);

                OutputObject output = new OutputObject();
                output.Name = class_name + ".Designer.cs";
                output.Type = OutputObject.eObjectType.CSharp;

                int total_form_height = 56 + (26 * sql_table.Columns.Values.Count);

                StringBuilder sb = new StringBuilder();

                sb.AppendLine("namespace " + NameFormatter.ToCSharpPropertyName(sql_table.Database.Name) + "Editor");
                sb.AppendLine("{");
                sb.AppendLine(AddTabs(1) + "partial class " + class_name);
                sb.AppendLine(AddTabs(1) + "{");
                sb.AppendLine(AddTabs(2) + "/// <summary>");
                sb.AppendLine(AddTabs(2) + "/// Required designer variable.");
                sb.AppendLine(AddTabs(2) + "/// </summary>");
                sb.AppendLine(AddTabs(2) + "private System.ComponentModel.IContainer components = null;");
                sb.AppendLine();

                sb.AppendLine(AddTabs(2) + "/// <summary>");
                sb.AppendLine(AddTabs(2) + "/// Clean up any resources being used.");
                sb.AppendLine(AddTabs(2) + "/// </summary>");
                sb.AppendLine(AddTabs(2) + "/// <param name=\"disposing\">true if managed resources should be disposed; otherwise, false.</param>");
                sb.AppendLine(AddTabs(2) + "protected override void Dispose(bool disposing)");
                sb.AppendLine(AddTabs(2) + "{");
                sb.AppendLine(AddTabs(3) + "if (disposing && (components != null))");
                sb.AppendLine(AddTabs(3) + "{");
                sb.AppendLine(AddTabs(4) + "components.Dispose();");
                sb.AppendLine(AddTabs(3) + "}");
                sb.AppendLine(AddTabs(3) + " base.Dispose(disposing);");
                sb.AppendLine(AddTabs(2) + "}");
                sb.AppendLine();

                sb.AppendLine(AddTabs(2) + "#region Windows Form Designer generated code");
                sb.AppendLine();
                sb.AppendLine(AddTabs(2) + "/// <summary>");
                sb.AppendLine(AddTabs(2) + "/// Required method for Designer support - do not modify");
                sb.AppendLine(AddTabs(2) + "/// the contents of this method with the code editor.");
                sb.AppendLine(AddTabs(2) + "/// </summary>");
                sb.AppendLine(AddTabs(2) + "private void InitializeComponent()");
                sb.AppendLine(AddTabs(2) + "{");
                sb.AppendLine(AddTabs(3) + "this.btnSave = new System.Windows.Forms.Button();");
                sb.AppendLine(AddTabs(3) + "this.btnCancel = new System.Windows.Forms.Button();");
                sb.AppendLine(AddTabs(3) + "this.cboItemList = new System.Windows.Forms.ComboBox();");
                sb.AppendLine();

                foreach (var sql_column in sql_table.Columns.Values)
                {
                    sb.AppendLine(AddTabs(3) + "this.lbl" + sql_column.Name + " = new System.Windows.Forms.Label();");
                    sb.AppendLine(AddTabs(3) + "this.txt" + sql_column.Name + " = new System.Windows.Forms.TextBox();");
                    sb.AppendLine();
                }

                sb.AppendLine(AddTabs(3) + "this.SuspendLayout();");
                sb.AppendLine(AddTabs(3) + "//");
                sb.AppendLine(AddTabs(3) + "// btnSave");
                sb.AppendLine(AddTabs(3) + "//");
                sb.AppendLine(AddTabs(3) + "this.btnSave.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));");
                sb.AppendLine(AddTabs(3) + "this.btnSave.Location = new System.Drawing.Point(232," + (total_form_height-26).ToString() + ");");
                sb.AppendLine(AddTabs(3) + "this.btnSave.Name = \"btnSave\";");
                sb.AppendLine(AddTabs(3) + "this.btnSave.Size = new System.Drawing.Size(75, 23);");
                sb.AppendLine(AddTabs(3) + "this.btnSave.TabIndex = 0;");
                sb.AppendLine(AddTabs(3) + "this.btnSave.Text = \"Save\";");
                sb.AppendLine(AddTabs(3) + "this.btnSave.UseVisualStyleBackColor = true;");
                sb.AppendLine(AddTabs(3) + "this.btnSave.Click += new System.EventHandler(this.btnSave_Click);");
                sb.AppendLine(AddTabs(3) + "//");
                sb.AppendLine(AddTabs(3) + "// btnCancel");
                sb.AppendLine(AddTabs(3) + "//");
                sb.AppendLine(AddTabs(3) + "this.btnCancel.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));");
                sb.AppendLine(AddTabs(3) + "this.btnCancel.Location = new System.Drawing.Point(151," + (total_form_height-26).ToString() + ");");
                sb.AppendLine(AddTabs(3) + "this.btnCancel.Name = \"btnCancel\";");
                sb.AppendLine(AddTabs(3) + "this.btnCancel.Size = new System.Drawing.Size(75, 23);");
                sb.AppendLine(AddTabs(3) + "this.btnCancel.TabIndex = 1;");
                sb.AppendLine(AddTabs(3) + "this.btnCancel.Text = \"Cancel\";");
                sb.AppendLine(AddTabs(3) + "this.btnCancel.UseVisualStyleBackColor = true;");
                sb.AppendLine(AddTabs(3) + "this.btnCancel.Click += new System.EventHandler(this.btnCancel_Click);");
                sb.AppendLine(AddTabs(3) + "//");
                sb.AppendLine(AddTabs(3) + "// cboItemList");
                sb.AppendLine(AddTabs(3) + "//");
                sb.AppendLine(AddTabs(3) + "this.cboItemList.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) | System.Windows.Forms.AnchorStyles.Right)));");
                sb.AppendLine(AddTabs(3) + "this.cboItemList.FormattingEnabled = true;");
                sb.AppendLine(AddTabs(3) + "this.cboItemList.Location = new System.Drawing.Point(12, 5);");
                sb.AppendLine(AddTabs(3) + "this.cboItemList.Name = \"cboItemList\";");
                sb.AppendLine(AddTabs(3) + "this.cboItemList.Size = new System.Drawing.Size(295, 21);");
                sb.AppendLine(AddTabs(3) + "this.cboItemList.TabIndex = 2;");
                sb.AppendLine(AddTabs(3) + "this.cboItemList.SelectedIndexChanged += new System.EventHandler(this.cboItemList_SelectedIndexChanged);");

                int height = 26;
                int tab_index = 3;

                foreach (var sql_column in sql_table.Columns.Values)
                {
                    string label_name       = "lbl" + NameFormatter.ToCSharpPropertyName(sql_column.Name);
                    string textbox_name     = "txt" + NameFormatter.ToCSharpPropertyName(sql_column.Name);

                    sb.AppendLine(AddTabs(3) + "//");
                    sb.AppendLine(AddTabs(3) + "// " + label_name);
                    sb.AppendLine(AddTabs(3) + "//");
                    sb.AppendLine(AddTabs(3) + "this." + label_name + ".AutoSize = true;");
                    sb.AppendLine(AddTabs(3) + "this." + label_name + ".Location = new System.Drawing.Point(12," + (height + 9).ToString() + ");");
                    sb.AppendLine(AddTabs(3) + "this." + label_name + ".Name = \"" + label_name + "\";");
                    sb.AppendLine(AddTabs(3) + "this." + label_name + ".Size = new System.Drawing.Size(35, 13);");
                    sb.AppendLine(AddTabs(3) + "this." + label_name + ".TabIndex = " + tab_index.ToString() + ";");
                    sb.AppendLine(AddTabs(3) + "this." + label_name + ".Text = \"" + NameFormatter.ToFriendlyName(sql_column.Name) + "\";");

                    tab_index++;

                    sb.AppendLine(AddTabs(3) + "//");
                    sb.AppendLine(AddTabs(3) + "// " + textbox_name);
                    sb.AppendLine(AddTabs(3) + "//");
                    sb.AppendLine(AddTabs(3) + "this." + textbox_name + ".Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) | System.Windows.Forms.AnchorStyles.Right)));");
                    sb.AppendLine(AddTabs(3) + "this." + textbox_name + ".Location = new System.Drawing.Point(118," + (height + 6).ToString() + ");");
                    sb.AppendLine(AddTabs(3) + "this." + textbox_name + ".Name = \"" + textbox_name + "\";");
                    sb.AppendLine(AddTabs(3) + "this." + textbox_name + ".Size = new System.Drawing.Size(189, 20);");
                    sb.AppendLine(AddTabs(3) + "this." + textbox_name + ".TabIndex = " + tab_index.ToString() + ";");
                    //sb.AppendLine(AddTabs(3) + "this." + textbox_name + ".MaxLength = " + sql_column.Length + ";");

                    tab_index++;
                    height += 26;
                }

                sb.AppendLine(AddTabs(3) + "//");
                sb.AppendLine(AddTabs(3) + "// " + class_name);
                sb.AppendLine(AddTabs(3) + "//");
                sb.AppendLine(AddTabs(3) + "this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);");
                sb.AppendLine(AddTabs(3) + "this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;");
                sb.AppendLine(AddTabs(3) + "this.ClientSize = new System.Drawing.Size(319," + total_form_height.ToString() + ");");

                sb.AppendLine(AddTabs(3) + "this.Controls.Add(this.btnCancel);");
                sb.AppendLine(AddTabs(3) + "this.Controls.Add(this.btnSave);");
                sb.AppendLine(AddTabs(3) + "this.Controls.Add(this.cboItemList);");
                sb.AppendLine();

                foreach (var sql_column in sql_table.Columns.Values)
                {
                    sb.AppendLine(AddTabs(3) + "this.Controls.Add(this.txt" + NameFormatter.ToCSharpPropertyName(sql_column.Name) + ");");
                    sb.AppendLine(AddTabs(3) + "this.Controls.Add(this.lbl" + NameFormatter.ToCSharpPropertyName(sql_column.Name) + ");");
                    sb.AppendLine();
                }

                sb.AppendLine(AddTabs(3) + "this.MinimumSize = new System.Drawing.Size(319," + total_form_height.ToString() + ");");
                sb.AppendLine(AddTabs(3) + "this.Name = \"" + class_name + "\";");
                sb.AppendLine(AddTabs(3) + "this.Text = \"" +  NameFormatter.ToCSharpPropertyName(sql_table.Name) + "\";");
                sb.AppendLine();

                sb.AppendLine(AddTabs(3) + "this.ResumeLayout(false);");
                sb.AppendLine(AddTabs(3) + "this.PerformLayout();");

                sb.AppendLine(AddTabs(2) + "}");
                sb.AppendLine();

                sb.AppendLine(AddTabs(2) + "#endregion");
                sb.AppendLine();
                sb.AppendLine(AddTabs(2) + "private System.Windows.Forms.Button btnSave;");
                sb.AppendLine(AddTabs(2) + "private System.Windows.Forms.Button btnCancel;");
                sb.AppendLine(AddTabs(2) + "private System.Windows.Forms.ComboBox cboItemList;");
                sb.AppendLine();

                foreach (var sql_column in sql_table.Columns.Values)
                {
                    sb.AppendLine(AddTabs(2) + "private System.Windows.Forms.Label lbl" + NameFormatter.ToCSharpPropertyName(sql_column.Name) + ";");
                    sb.AppendLine(AddTabs(2) + "private System.Windows.Forms.TextBox txt" + NameFormatter.ToCSharpPropertyName(sql_column.Name) + ";");
                    sb.AppendLine();
                }

                sb.AppendLine(AddTabs(2) + "}");
                sb.AppendLine(AddTabs(1) + "}");

                output.Body = sb.ToString();
                return output;
        }
 public SqlColumn(SqlTable sql_table, string column_name) : this(sql_table, column_name, string.Empty, 0, 0, 0, false, false, false, 0, string.Empty)
 {
 }
 public static OutputObject GenerateWinformMainCode(SqlTable sql_table)
 {
     return null;
 }