Click here to Skip to main content
15,886,031 members
Articles / Database Development / SQL Server

Tier Generator 1.0

Rate me:
Please Sign up or sign in to vote.
4.89/5 (140 votes)
26 Jul 2008CPOL2 min read 253.3K   13.3K   297  
A powerful tool for rapid application development.
using System;
using System.Collections.Generic;
using System.Text;
using System.IO;

using TierGenerator.Properties;
using TierGenerator.Common;

namespace TierGenerator.CodeGeneration
{
    class CommonFileGenerator
    {

        #region Properties

        public string RootPath
        {
            get
            {
                return TierGeneratorSettings.Instance.CodeGenerationPath +
                       System.IO.Path.DirectorySeparatorChar +
                       TierGeneratorSettings.Instance.ProjectNameSpace;
            }
        }

        #endregion

        #region Public Methods

        /// <summary>
        /// method to generate app.config
        /// </summary>
        public void GenerateAppDotConfig()
        {

            string fileText = Resources.app;
            fileText = fileText.Replace(ProjectTokens.ConnectionString, TierGeneratorSettings.Instance.ConnectionString);


            FileWriter.WriteFile(RootPath, "app.Config", fileText);
        }

        /// <summary>
        /// method to generate Sql Store procedures
        /// </summary>
        public void GenerateSqlStoreProcedures()
        {

            string filePath = RootPath +
                              System.IO.Path.DirectorySeparatorChar +
                              TierGeneratorSettings.Instance.ProjectNameSpace +
                              "_StoredProcedures.sql";

            using (StreamWriter sw = new StreamWriter(filePath))
            {

                sw.WriteLine("SET NOCOUNT ON");
                sw.WriteLine("GO");
                sw.WriteLine("USE [" + TierGeneratorSettings.Instance.Database.Catalog + "]");
                sw.WriteLine("GO");


                foreach (DatabaseTable table in TierGeneratorSettings.Instance.Database.Tables)
                {
                    if (table.IsSelected)
                    {

                        // Insert
                        InsertSP(sw, table);

                        // UPdate
                        UpdateSP(sw, table);

                        // Select By Primary Key
                        SelectByPrimaryKeySP(sw, table);

                        // Select All
                        SelectAllSP(sw, table);

                        // Select By Field
                        SelectByFieldSP(sw, table);

                        // Delete by Primary key
                        DeleteByPrimaryKeySP(sw, table);

                        // Delete by field
                        DeleteByFieldSP(sw, table);
                    }
                }
            }
        }

        
        #endregion

        #region Private Methods

        #region Store Procedures

        /// <summary>
        /// Get parameters
        /// </summary>
        /// <param name="column">column name</param>
        /// <returns>paramter string</returns>
        private string GetParameter(DatabaseColumn column)
        {
            string parameter = column.SqlParameterName + " " + column.DataType;

            switch (column.DataType)
            {
                case "binary":
                case "char":
                case "nchar":
                case "nvarchar":
                case "varbinary":
                case "varchar":
                    {
                        string size = (column.ColumnSize >= 2147483647) ? "MAX" : column.ColumnSize.Value.ToString();
                        parameter += "(" + size + ")";
                        break;
                    }
            }


            if (column.IsNull)
                parameter += " = null";

            return parameter;

        }

        /// <summary>
        /// Method to get delete store procedure statement
        /// </summary>
        /// <param name="storeProcedures">name of store procedure</param>
        /// <returns>statement</returns>
        private string GetDeleteExistProcedureSQL(string storeProcedures)
        {
            return "if exists (select * from dbo.sysobjects where id = object_id(N'" + storeProcedures + "') and OBJECTPROPERTY(id, N'IsProcedure') = 1) drop procedure " + storeProcedures + "\r\nGO";
        }

        /// <summary>
        /// Method to generate insert store procedure
        /// </summary>
        /// <param name="sw">stream writer</param>
        /// <param name="table">Database table</param>
        private void InsertSP(StreamWriter sw, DatabaseTable table)
        {
            string spName = TierGeneratorSettings.Instance.GetStoreProcedureName(table.TableSchema, table.TableName, StoreProcedureType.Insert);
            sw.WriteLine();
            sw.WriteLine(GetDeleteExistProcedureSQL(spName));

            StringBuilder strInputParams = new StringBuilder();
            StringBuilder strOutputParams = new StringBuilder();
            StringBuilder strFields = new StringBuilder();
            StringBuilder strValues = new StringBuilder();
            StringBuilder strOutSelect = new StringBuilder();

            int count = table.Columns.Count;

            for (int i = 0; i < count; i++)
            {
                DatabaseColumn column = table.Columns[i];
                string end = ",";
                string pType = column.IsAutoNumber ? "output" : "";
                if (i == count - 1) end = "";

                // Parameters
                strInputParams.AppendLine("\t" + GetParameter(column) + " " + pType + end);

                if (!column.IsAutoNumber)
                {
                    // Fileds
                    strFields.AppendLine("\t[" + column.Name + "]" + end);

                    // Values
                    strValues.AppendLine("\t" + column.SqlParameterName + end);
                }

                // Output select
                if (column.IsAutoNumber)
                {
                    strOutSelect.AppendLine("\tSELECT " + column.SqlParameterName + "=SCOPE_IDENTITY();");
                }

            }

            sw.WriteLine("CREATE PROCEDURE " + spName);

            // Parameters
            sw.WriteLine(strInputParams.ToString());

            sw.WriteLine("AS");
            sw.WriteLine("");

            sw.WriteLine("INSERT [" + table.TableSchema + "].[" + table.TableName + "]");
            sw.WriteLine("(");

            // Fileds
            sw.WriteLine(strFields.ToString());

            sw.WriteLine(")");
            sw.WriteLine("VALUES");
            sw.WriteLine("(");

            // Values
            sw.WriteLine(strValues.ToString());

            sw.WriteLine(")");

            sw.WriteLine(strOutSelect.ToString());

            sw.WriteLine("");
            sw.WriteLine("GO");

        }

        /// <summary>
        /// Method to generate Update store procedure
        /// </summary>
        /// <param name="sw">stream writer</param>
        /// <param name="table">Database table</param>
        private void UpdateSP(StreamWriter sw, DatabaseTable table)
        {
            string spName = TierGeneratorSettings.Instance.GetStoreProcedureName(table.TableSchema, table.TableName, StoreProcedureType.Update);
            sw.WriteLine();
            sw.WriteLine(GetDeleteExistProcedureSQL(spName));

            StringBuilder strInputParams = new StringBuilder();
            StringBuilder strSet = new StringBuilder();
            StringBuilder strWhere = new StringBuilder();


            int count = table.Columns.Count;

            for (int i = 0; i < count; i++)
            {
                DatabaseColumn column = table.Columns[i];
                string end = ",";
                if (i == count - 1) end = "";

                // Parameters
                strInputParams.AppendLine("\t" + GetParameter(column) + end);

                // Set Value
                if (!column.IsAutoNumber)
                {
                    if (strSet.Length > 0) strSet.Append(",\r\n");
                    strSet.Append("\t[" + column.Name + "] = " + column.SqlParameterName);
                }

                // Where
                if (column.IsPK)
                {
                    if (strWhere.Length > 0) strWhere.Append(" AND \r\n");
                    strWhere.Append("\t[" + column.Name + "] = " + column.SqlParameterName);
                }



            }

            sw.WriteLine("CREATE PROCEDURE " + spName);

            // Parameters
            sw.WriteLine(strInputParams.ToString());

            sw.WriteLine("AS");
            sw.WriteLine("");

            sw.WriteLine("UPDATE [" + table.TableSchema + "].[" + table.TableName + "]");
            sw.WriteLine("SET");

            // Set Values
            sw.WriteLine(strSet.ToString());

            // where clause
            sw.WriteLine(" WHERE ");

            // Where
            sw.WriteLine(strWhere.ToString());

            sw.WriteLine("");
            sw.WriteLine("GO");

        }

        /// <summary>
        /// Method to generate select by primary key store procedure
        /// </summary>
        /// <param name="sw">stream writer</param>
        /// <param name="table">Database table</param>
        private void SelectByPrimaryKeySP(StreamWriter sw, DatabaseTable table)
        {
            string spName = TierGeneratorSettings.Instance.GetStoreProcedureName(table.TableSchema, table.TableName, StoreProcedureType.SelectByPrimaryKey);
            sw.WriteLine();
            sw.WriteLine(GetDeleteExistProcedureSQL(spName));

            StringBuilder strInputParams = new StringBuilder();
            StringBuilder strParams = new StringBuilder();
            StringBuilder strWhere = new StringBuilder();


            int count = table.Columns.Count;

            for (int i = 0; i < count; i++)
            {
                DatabaseColumn column = table.Columns[i];

                // Parameters
                if (column.IsPK)
                {
                    if (strInputParams.Length > 0) strInputParams.Append(",\r\n");
                    strInputParams.Append("\t" + GetParameter(column));
                }

                // Select Parameters
                if (strParams.Length > 0) strParams.Append(", ");
                strParams.Append("[" + column.Name + "]");


                // Where
                if (column.IsPK)
                {
                    if (strWhere.Length > 0) strWhere.Append(" AND \r\n");
                    strWhere.Append("\t[" + column.Name + "] = " + column.SqlParameterName);
                }



            }

            sw.WriteLine("CREATE PROCEDURE " + spName);

            // Parameters
            sw.WriteLine(strInputParams.ToString());

            sw.WriteLine("AS");
            sw.WriteLine("");

            sw.WriteLine("\tSELECT ");
            sw.WriteLine("\t\t" + strParams.ToString());
            sw.WriteLine("\tFROM [" + table.TableSchema + "].[" + table.TableName + "]");

            // where clause
            sw.WriteLine("\tWHERE ");

            // Where
            sw.WriteLine("\t\t" + strWhere.ToString());

            sw.WriteLine("");
            sw.WriteLine("GO");

        }

        /// <summary>
        /// Method to generate select All store procedure
        /// </summary>
        /// <param name="sw">stream writer</param>
        /// <param name="table">Database table</param>
        private void SelectAllSP(StreamWriter sw, DatabaseTable table)
        {
            string spName = TierGeneratorSettings.Instance.GetStoreProcedureName(table.TableSchema, table.TableName, StoreProcedureType.SelectAll);
            sw.WriteLine();
            sw.WriteLine(GetDeleteExistProcedureSQL(spName));


            StringBuilder strParams = new StringBuilder();


            int count = table.Columns.Count;

            for (int i = 0; i < count; i++)
            {
                DatabaseColumn column = table.Columns[i];


                // Select Parameters
                if (strParams.Length > 0) strParams.Append(", ");
                strParams.Append("[" + column.Name + "]");

            }

            sw.WriteLine("CREATE PROCEDURE " + spName);
            sw.WriteLine("AS");
            sw.WriteLine("");

            sw.WriteLine("\tSELECT ");
            sw.WriteLine("\t\t" + strParams.ToString());
            sw.WriteLine("\tFROM [" + table.TableSchema + "].[" + table.TableName + "]");

            sw.WriteLine("");
            sw.WriteLine("GO");

        }

        /// <summary>
        /// Method to generate select by field store procedure
        /// </summary>
        /// <param name="sw">stream writer</param>
        /// <param name="table">Database table</param>
        private void SelectByFieldSP(StreamWriter sw, DatabaseTable table)
        {
            string spName = TierGeneratorSettings.Instance.GetStoreProcedureName(table.TableSchema, table.TableName, StoreProcedureType.SelectByField);
            sw.WriteLine();
            sw.WriteLine(GetDeleteExistProcedureSQL(spName));

            StringBuilder strParams = new StringBuilder();



            int count = table.Columns.Count;

            for (int i = 0; i < count; i++)
            {
                DatabaseColumn column = table.Columns[i];

                // Select Parameters
                if (strParams.Length > 0) strParams.Append(", ");
                strParams.Append("[" + column.Name + "]");

            }

            sw.WriteLine("CREATE PROCEDURE " + spName);

            // Parameters
            sw.WriteLine("\t@FieldName varchar(100),");
            sw.WriteLine("\t@Value varchar(1000)");

            sw.WriteLine("AS");
            sw.WriteLine("");
            sw.WriteLine("\tDECLARE @query varchar(2000);");
            sw.WriteLine("");
            sw.WriteLine("\tSET @query = 'SELECT " + strParams.ToString() + " FROM [" + table.TableSchema + "].[" + table.TableName + "] WHERE [' + @FieldName  + '] = ''' + @Value + ''''");
            sw.WriteLine("\tEXEC(@query)");
            sw.WriteLine("");
            sw.WriteLine("GO");

        }

        /// <summary>
        /// Method to generate delete store procedure
        /// </summary>
        /// <param name="sw">stream writer</param>
        /// <param name="table">Database table</param>
        private void DeleteByPrimaryKeySP(StreamWriter sw, DatabaseTable table)
        {
            string spName = TierGeneratorSettings.Instance.GetStoreProcedureName(table.TableSchema, table.TableName, StoreProcedureType.DeleteByPrimaryKey);
            sw.WriteLine();
            sw.WriteLine(GetDeleteExistProcedureSQL(spName));

            StringBuilder strInputParams = new StringBuilder();
            StringBuilder strWhere = new StringBuilder();

            int count = table.Columns.Count;

            for (int i = 0; i < count; i++)
            {
                DatabaseColumn column = table.Columns[i];

                // Parameters
                if (column.IsPK)
                {
                    if (strInputParams.Length > 0) strInputParams.Append(",\r\n");
                    strInputParams.Append("\t" + GetParameter(column));
                }

                // Where
                if (column.IsPK)
                {
                    if (strWhere.Length > 0) strWhere.Append(" AND \r\n");
                    strWhere.Append("\t[" + column.Name + "] = " + column.SqlParameterName);
                }



            }

            sw.WriteLine("CREATE PROCEDURE " + spName);

            // Parameters
            sw.WriteLine(strInputParams.ToString());

            sw.WriteLine("AS");
            sw.WriteLine("");

            sw.WriteLine("DELETE FROM [" + table.TableSchema + "].[" + table.TableName + "]");
            // where clause
            sw.WriteLine(" WHERE ");

            // Where
            sw.WriteLine(strWhere.ToString());

            sw.WriteLine("");
            sw.WriteLine("GO");

        }

        /// <summary>
        /// Method to generate delete by field store procedure
        /// </summary>
        /// <param name="sw">stream writer</param>
        /// <param name="table">Database table</param>
        private void DeleteByFieldSP(StreamWriter sw, DatabaseTable table)
        {
            string spName = TierGeneratorSettings.Instance.GetStoreProcedureName(table.TableSchema, table.TableName, StoreProcedureType.DeleteByField);
            sw.WriteLine();
            sw.WriteLine(GetDeleteExistProcedureSQL(spName));


            sw.WriteLine("CREATE PROCEDURE " + spName);

            // Parameters
            sw.WriteLine("\t@FieldName varchar(100),");
            sw.WriteLine("\t@Value varchar(1000)");

            sw.WriteLine("AS");
            sw.WriteLine("");
            sw.WriteLine("\tDECLARE @query varchar(2000);");
            sw.WriteLine("");
            sw.WriteLine("\tSET @query = 'DELETE FROM [" + table.TableSchema + "].[" + table.TableName + "] WHERE [' + @FieldName  + '] = ''' + @Value + ''''");
            sw.WriteLine("\tEXEC(@query)");
            sw.WriteLine("");
            sw.WriteLine("GO");

        }

        #endregion

        #endregion

    }
}

By viewing downloads associated with this article you agree to the Terms of Service and the article's licence.

If a file you wish to view isn't highlighted, and is a text file (not binary), please let us know and we'll add colourisation support for it.

License

This article, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)


Written By
Chief Technology Officer
Pakistan Pakistan
Passion and positive dedication is essential part of success. I believe on hardworking and sharing knowledge with others. I always try to be a better than I am and think positive for positive result.

My Blogs

My Linked-In Profile

Comments and Discussions