Click here to Skip to main content
15,881,882 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 System.Xml;
using System.Xml.Serialization;
using MattRaffelNetCode.Apps.SqlCodeGen.Classes;
#endregion

namespace MattRaffelNetCode.Apps.SqlCodeGen
{
    #region ColumnSubstitutionManager implementation
    /// <summary>
    /// The purpose of the column substitutions is to allow the C# data members and properties to be
    /// represented with different names than the database columns they eventually bind to.  This can be important
    /// as database column names can be cryptic but the C# names do not need to be.
    /// 
    /// The data is read from the datatypes file, as specified by the ApplicationSettings.Settings.DefaultSQLNameChart
    /// entry in the config file.
    /// 
    /// The current assumption is that every instance of the same db column name gets the same substitution values.  Later on
    /// it would be nice to let tables have overrides as needed.
    /// 
    /// This class is a singleton
    /// </summary>
    internal class ColumnSubstitutionManager
    {
        #region private data
        private static ColumnSubstitutionManager _instance = new ColumnSubstitutionManager();
        private ColumnSubstitutionsCollection _substitutions = null;
        #endregion

        #region properties
        public static ColumnSubstitutionManager Instance
        {
            get { return _instance; }
        }

        public ColumnSubstitutionsCollection Substitutions
        {
            get { return _substitutions; }
        }
        #endregion

        #region private methods
        /// <summary>
        /// loads the subsitution information from the file, file name specified in the application config file
        /// </summary>
        private void Load()
        {
            XmlSerializer serializer = new XmlSerializer(typeof(ColumnSubstitutionsCollection));
            
            using (TextReader reader = new StreamReader(ProgramConfiguration.Instance.DefaultNamesChart))
            {
                _substitutions = (ColumnSubstitutionsCollection)serializer.Deserialize(reader);
                reader.Close();
            }
        }
        #endregion

        #region ctor/init/cleanup
        private ColumnSubstitutionManager() 
        {
            _substitutions = new ColumnSubstitutionsCollection();
            Load();
        }
        #endregion

        #region public methods    
        /// <summary>
        /// Given a column name, name as found in the database (expectation is ITableInquiry built this information)
        /// find a matching ColumnSubstitution.  It is possible there is no ColumnSubstitution entry.
        /// </summary>
        /// <param name="sqlColumnName">string, sql colum name</param>
        /// <returns>ColumnSubstitution, null if no match found</returns>
        public ColumnSubstitution GetColumnBySqlName(string sqlColumnName)
        {
            ColumnSubstitution ret = null;

            foreach (ColumnSubstitution col in _substitutions)
            {
                if (0 == string.Compare(col.SqlName, sqlColumnName, true))
                {
                    ret = col;
                    break;
                }
            }

            return ret;
        }

        /// <summary>
        /// Helper function.  Returns the value of the datamembername property of a ColumnSubstitution having 
        /// matching column name.  It is possible no match is found.  Assumption is that the caller already knows
        /// a ColumnSubstitution exists.  
        /// </summary>
        /// <param name="sqlColumnName">string</param>
        /// <returns>string, empty of no match is found</returns>
        public string GetDataMemberNameBySqlName(string sqlColumnName)
        {
            string ret = string.Empty;

            foreach (ColumnSubstitution col in _substitutions)
            {
                if (0 == string.Compare(col.SqlName, sqlColumnName, true))
                {
                    ret = col.DataMemberName;
                    break;
                }
            }

            return ret;
        }

        /// <summary>
        /// Helper function.  Returns the value of the propertyname property of a ColumnSubstitution having
        /// matching column name.  It is possible no match is found.  Assumption is that the caller already knows
        /// a ColumnSubstitution exists.  
        /// </summary>
        /// <param name="sqlColumnName">string</param>
        /// <returns>string, empty of no match is found</returns>
        public string GetPropertyNameBySqlName(string sqlColumnName)
        {
            string ret = string.Empty;

            foreach (ColumnSubstitution col in _substitutions)
            {
                if (0 == string.Compare(col.SqlName, sqlColumnName, true))
                {
                    ret = col.PropertyName;
                    break;
                }
            }

            return ret;
        }

        /// <summary>
        /// Helper function.  Returns the value of the KeepCase property a ColumnSubstitution having
        /// matching column name.  It is possible no match is found.  Assumption is that the caller already knows
        /// a ColumnSubstitution exists.  
        /// </summary>
        /// <param name="sqlColumnName">string</param>
        /// <returns>bool, false does not ensure a match was found</returns>
        public bool GetKeepCaseBySqlName(string sqlColumnName)
        {
            foreach (ColumnSubstitution col in _substitutions)
            {
                if (0 == string.Compare(col.SqlName, sqlColumnName, true))
                {
                    return col.KeepCase;
                }
            }

            return false;
        }
  
        #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 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