Click here to Skip to main content
15,881,967 members
Articles / Programming Languages / C#

Dynamically Generate C# Data Access Code for Microsoft SQL and Other Databases

Rate me:
Please Sign up or sign in to vote.
3.45/5 (13 votes)
19 Dec 2008CDDL3 min read 76.5K   1.5K   76  
With this tool, dynamically generate C# data layer code (CRUD functions) for Microsoft SQL and other databases
/*
 ******************************************************************************
 This file is part of MattRaffelNetCode.

    MattRaffelNetCode is free software; you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation; either version 2 of the License, or
    (at your option) any later version.

    MattRaffelNetCode is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.

    You should have received a copy of the GNU General Public License
    along with MattRaffelNetCode; if not, write to the Free Software
    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA


    architected and written by 
    matt raffel 
    matt.raffel@mindspring.com

       copyright (c) 2007 by matt raffel unless noted otherwise

 ******************************************************************************
*/
#region using statements
using System;
using System.Collections.Generic;
using System.Text;
using System.IO;
using MattRaffelNetCode.Apps.SqlCodeGen.Classes;
#endregion

namespace MattRaffelNetCode.Apps.SqlCodeGen
{
    /// <summary>
    /// Generates the code for Properties and data members
    /// </summary>
    internal class GenerateDataProperty : BaseCodeGeneratorPart
    {
        #region private data
        #endregion

        #region propties
        #endregion

        #region private methods
        /// <summary>
        /// Assumption is that the snippets for property/private data/and combined are similar
        /// enough that text replacement is all that is needed.
        /// </summary>
        /// <param name="snippetName"></param>
        /// <returns></returns>
        private string GenerateFromSnippet(string snippetName)
        {
            // if this assert fires it means initialize was never called
            System.Diagnostics.Debug.Assert(0 < _privateData.Count);

            string dataTypeTag = _currentTemplate.GetCodeSubstitutionTag(CodeSubstutionType.MemberType).Region;
            string propertyNameTag = _currentTemplate.GetCodeSubstitutionTag(CodeSubstutionType.MemberPropertyName).Region;
            string dataNameTag = _currentTemplate.GetCodeSubstitutionTag(CodeSubstutionType.MemberDataName).Region;

            SnippetData snippet = _templateMgr.Snippets.GetByName(snippetName);
            string snippetTemplate = snippet.Load();

            System.Text.StringBuilder builder = new StringBuilder();
            foreach (PrivateDataMemberProperty member in _privateData)
            {
                string generatedText = snippetTemplate;
                generatedText = generatedText.Replace(dataTypeTag, member.DataType);
                generatedText = generatedText.Replace(dataNameTag, member.MemberName);
                generatedText = generatedText.Replace(propertyNameTag, member.PropertyName);

                builder.Append(generatedText);
            }

            return builder.ToString();

        }

        #endregion

        #region ctor/init/cleanup
        public GenerateDataProperty(TableDefinition table, TemplateData template) : base(table, template) { }
        #endregion

        #region public methods
        /// <summary>
        /// Causes the class to evaluate all the columns and creating the code "parts" for
        /// each column
        /// </summary>
        public void Initialize()
        {
            ProcessColumns();
        }
       
        /// <summary>
        /// Generates Propertye code based on the property.cs.snippet 
        /// </summary>
        /// <returns>string</returns>
        public string GenerateProperties()
        {
            // if this assert fires it means initialize was never called
            System.Diagnostics.Debug.Assert(0 < _privateData.Count);

            return GenerateFromSnippet("Property");
        }

        /// <summary>
        /// Generates the private data members based on data.cs.snippet
        /// </summary>
        /// <returns>string</returns>
        public string GenerateDataMembers()
        {
            // if this assert fires it means initialize was never called
            System.Diagnostics.Debug.Assert(0 < _privateData.Count);

            return GenerateFromSnippet("PrivateData");
        }

        /// <summary>
        /// Generates combined properties and private data members based 
        /// on dataproperty.cs.snippet
        /// </summary>
        /// <returns>string</returns>
        public string GenerateAll()
        {
            // if this assert fires it means initialize was never called
            System.Diagnostics.Debug.Assert(0 < _privateData.Count);

            return GenerateFromSnippet("DataProperty");
        }

        #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 Common Development and Distribution License (CDDL)


Written By
Architect
United States United States
This member has not yet provided a Biography. Assume it's interesting and varied, and probably something to do with programming.

Comments and Discussions