Click here to Skip to main content
15,884,472 members
Articles / Database Development / SQL Server

.NET Installer that automatically installs MSDE

Rate me:
Please Sign up or sign in to vote.
3.63/5 (7 votes)
26 Jul 2008GPL36 min read 45.4K   557   30  
This project enables developers to create a setup package that automatically installs MSDE and attaches database
using System;
using System.Data;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace JohnKenedy.DataAccess
{
    public class DataAccessTableDefinition
    {
        #region Properties
        private DataAccessLayer _DALLayer = null;
        public DataAccessLayer DALLayer
        {
            get
            {
                return _DALLayer;
            }
        }

        private string _TableName = "";
        public string TableName
        {
            get
            {
                return _TableName;
            }
        }

        private DataTable _ColumnDefinition = null;
        public DataTable ColumnDefinition
        {
            get
            {
                return _ColumnDefinition;
            }
        }

        private List<string> _PrimaryKeyColumns = new List<string>();
        public List<string> PrimaryKeyColumns
        {
            get
            {
                return _PrimaryKeyColumns;
            }
        }

        private List<string> _IdentityColumns = new List<string>();
        public List<string> IdentityColumns
        {
            get
            {
                return _IdentityColumns;
            }
        }

        private List<string> _NullAbleColumns = new List<string>();
        public List<string> NullAbleColumns
        {
            get
            {
                return _NullAbleColumns;
            }
        }
        #endregion

        public DataAccessTableDefinition(DataAccessLayer _dALLayer, string _tableName)
        {
            _DALLayer = _dALLayer;
            _TableName = _tableName;
            GetColumnDefinition();
        }

        private void GetColumnDefinition()
        {
            string _sql = "";
            if (_DALLayer.ConnectionType == SqlServerType.MSSQL)
            {
                 _sql = @"select a.COLUMN_NAME, a.DATA_TYPE, a.CHARACTER_MAXIMUM_LENGTH, b.IsPrimaryKey, a.IsIdentity, CASE WHEN a.IS_NULLABLE = 'YES' THEN CAST(1 AS BIT) ELSE CAST(0 AS BIT) END AS IsNullAble
                            FROM
                            (
                                select *, COLUMNPROPERTY(OBJECT_ID(QUOTENAME(TABLE_SCHEMA) + '.' + QUOTENAME(TABLE_NAME)), COLUMN_NAME, 'IsIdentity') AS IsIdentity from information_schema.columns where table_name = '{0}'
                            ) a
                            LEFT JOIN
                            (
                                select a.column_name, CAST(1 AS BIT) as ISPrimaryKey from information_schema.key_column_usage a
                                    left join information_schema.table_constraints b
                                    on a.constraint_name = b.constraint_name AND a.table_name = b.table_name
                                    where a.table_name = '{0}' and b.constraint_type = 'PRIMARY KEY'
                            ) b
                            on a.column_name = b.column_name
                            ORDER BY a.Ordinal_Position";
            
                _sql = string.Format(_sql, _TableName);
                _ColumnDefinition = _DALLayer.ExecuteDataSetText(_sql).Tables[0];
            }
            else if (_DALLayer.ConnectionType == SqlServerType.MYSQL)
            {
                _sql = @"select a.COLUMN_NAME, a.DATA_TYPE, a.CHARACTER_MAXIMUM_LENGTH, b.IsPrimaryKey, a.IsIdentity, CASE WHEN a.IS_NULLABLE = 'YES' THEN CAST(1 AS BIT) ELSE CAST(0 AS BIT) END AS IsNullAble
                            FROM
                            (
                                select *, COLUMNPROPERTY(OBJECT_ID(QUOTENAME(TABLE_SCHEMA) + '.' + QUOTENAME(TABLE_NAME)), COLUMN_NAME, 'IsIdentity') AS IsIdentity from information_schema.columns where table_name = '{0}'
                            ) a
                            LEFT JOIN
                            (
                                select a.column_name, CAST(1 AS BIT) as ISPrimaryKey from information_schema.key_column_usage a
                                    left join information_schema.table_constraints b
                                    on a.constraint_name = b.constraint_name AND a.table_name = b.table_name
                                    where a.table_name = '{0}' and b.constraint_type = 'PRIMARY KEY'
                            ) b
                            on a.column_name = b.column_name
                            ORDER BY a.Ordinal_Position";

                _sql = string.Format(_sql, _TableName);
                _ColumnDefinition = _DALLayer.ExecuteDataSetText(_sql).Tables[0];
            }
            else if (_DALLayer.ConnectionType == SqlServerType.OLEDB)
            {
                _sql = @"select a.COLUMN_NAME, a.DATA_TYPE, a.CHARACTER_MAXIMUM_LENGTH, b.IsPrimaryKey, a.IsIdentity, CASE WHEN a.IS_NULLABLE = 'YES' THEN CAST(1 AS BIT) ELSE CAST(0 AS BIT) END AS IsNullAble
                            FROM
                            (
                                select *, COLUMNPROPERTY(OBJECT_ID(QUOTENAME(TABLE_SCHEMA) + '.' + QUOTENAME(TABLE_NAME)), COLUMN_NAME, 'IsIdentity') AS IsIdentity from information_schema.columns where table_name = '{0}'
                            ) a
                            LEFT JOIN
                            (
                                select a.column_name, CAST(1 AS BIT) as ISPrimaryKey from information_schema.key_column_usage a
                                    left join information_schema.table_constraints b
                                    on a.constraint_name = b.constraint_name AND a.table_name = b.table_name
                                    where a.table_name = '{0}' and b.constraint_type = 'PRIMARY KEY'
                            ) b
                            on a.column_name = b.column_name
                            ORDER BY a.Ordinal_Position";

                _sql = string.Format(_sql, _TableName);
                _ColumnDefinition = _DALLayer.ExecuteDataSetText(_sql).Tables[0];
            }
            else if (_DALLayer.ConnectionType == SqlServerType.ORACLE)
            {
            }

            #region Get All PrimaryKey/Identity Columns
            _PrimaryKeyColumns.Clear();
            foreach (DataRow _row in _ColumnDefinition.Rows)
            {
                if (_row["IsPrimaryKey"].ToString() == "1" || _row["IsPrimaryKey"].ToString().ToLower() == "true")
                {
                    _PrimaryKeyColumns.Add(_row["Column_Name"].ToString().ToLower());
                }
                if (_row["IsIdentity"].ToString() == "1" || _row["IsIdentity"].ToString().ToLower() == "true")
                {
                    _IdentityColumns.Add(_row["Column_Name"].ToString().ToLower());
                }
                if (_row["IsNullAble"].ToString() == "1" || _row["IsNullAble"].ToString().ToLower() == "true")
                {
                    _NullAbleColumns.Add(_row["Column_Name"].ToString().ToLower());
                }
            }
            #endregion
        }

        #region Is PrimaryKey/Identity/Exist
        private bool IsColumnPrimaryKey(string _columnName)
        {
            DataRow[] _rows = _ColumnDefinition.Select("COLUMN_NAME = '" + _columnName + "'");
            if (_rows == null || _rows.Length <= 0) return false;
            if (_rows[0]["IsPrimaryKey"].ToString() == "1") return true;
            return false;
        }

        private bool IsColumnIdentity(string _columnName)
        {
            DataRow[] _rows = _ColumnDefinition.Select("COLUMN_NAME = '" + _columnName + "'");
            if (_rows == null || _rows.Length <= 0) return false;
            if (_rows[0]["IsIdentity"].ToString() == "1") return true;
            return false;
        }

        private bool IsColumnExist(string _columnName)
        {
            DataRow[] _rows = _ColumnDefinition.Select("COLUMN_NAME = '" + _columnName + "'");
            if (_rows == null || _rows.Length <= 0) return false;
            return true;
        }

        public int GetStringColumnMaxLength(string _columnName)
        {
            DataRow[] _rows = _ColumnDefinition.Select("COLUMN_NAME = '" + _columnName + "'");
            if (_rows == null || _rows.Length <= 0) return 0;
            return DataAccessTableManager.IntParse(_rows[0]["CHARACTER_MAXIMUM_LENGTH"]);
        }
        #endregion

        #region Insert/Update/Select
        // INSERT/UPDATE
        public DataAccessTableFiller GetFiller()
        {
            DataAccessTableFiller _new = new DataAccessTableFiller(this);
            return _new;
        }

        // SELECT All
        public IDbCommand GetDataAll(string _sort)
        {
            IDbCommand _com = _DALLayer.GetCommand();
            _com.CommandType = CommandType.Text;

            _com.CommandText = "SELECT * FROM " + _TableName;

            if (_sort != null && _sort != "")
            {
                _com.CommandText = " ORDER BY " + _sort;
            }
            return _com;
        }

        // SELECT COMMAND
        public IDbCommand GetDataByWhere(IList<string> _selectColumn, string _where, IDbDataParameter[] _params, string _sort)
        {
            IDbCommand _com = _DALLayer.GetCommand();
            _com.CommandType = CommandType.Text;

            string _columns = "*";
            if (_selectColumn != null && _selectColumn.Count > 0)
            {
                _columns = "";
                foreach (string _str in _selectColumn)
                {
                    if (_columns != "") _columns = _columns + ",";
                    _columns = _columns + _str;
                }
            }
            
            string _select = "";
            if (_where == "")
            {
                _select = "SELECT {0} FROM {1}";
                _select = string.Format(_select, _columns, _TableName);
            }
            else
            {
                _select = "SELECT {0} FROM {1} WHERE {2}";
                _select = string.Format(_select, _columns, _TableName, _where);
            }

            if (_sort != null && _sort != "")
            {
                _select += " ORDER BY " + _sort;
            }

            _com.CommandText = _select;

            foreach (IDbDataParameter _param in _params)
            {
                _com.Parameters.Add(_param);
            }

            return _com;
        }

        // SELECT
        public IDbCommand GetDataBy(IList<string> _selectColumn, IList<KeyValuePair<string, object>> _pairFilter, string _sort)
        {
            IDbCommand _com = _DALLayer.GetCommand();
            _com.CommandType = CommandType.Text;            

            string _columns = "*";
            if (_selectColumn != null && _selectColumn.Count > 0)
            {
                _columns = "";
                foreach (string _str in _selectColumn)
                {
                    if (_columns != "") _columns = _columns + ",";
                    _columns = _columns + _str;
                }
            }

            string _select = "SELECT {0} FROM {1} ";
            _select = string.Format(_select, _columns, _TableName);

            string _where = " WHERE ";
            string _filter = "";

            int _count = 1;
            
            foreach(KeyValuePair<string, object> _pair in _pairFilter)
            {
                if (_filter != "") _filter = _filter + " AND ";
                _filter = _filter + _pair.Key + "=@Param" + _count.ToString();

                IDbDataParameter _newParam = _com.CreateParameter();
                _newParam.ParameterName = "@Param" + _count.ToString();
                _newParam.Value = _pair.Value;

                _com.Parameters.Add(_newParam);
                _count++;
            }

            if (_filter != "")
                _com.CommandText = _select + _where + _filter;
            else
                _com.CommandText = _select;

            if (_sort != null && _sort != "")
            {
                _com.CommandText = _com.CommandText + " ORDER BY " + _sort;
            }
            return _com;
        }

        // SELECT
        public IDbCommand GetDataByManual(string _sql, IDbDataParameter[] _params)
        {
            IDbCommand _com = _DALLayer.GetCommand();
            _com.CommandType = CommandType.Text;
            _com.CommandText = _sql;

            if (_params != null)
            {
                foreach (IDbDataParameter _param in _params)
                {
                    _com.Parameters.Add(_param);
                }
            }

            return _com;
        }
        #endregion

        #region IDbCommand Execution Return
        public DataSet ExecuteDataSetFromCommand(IDbCommand _com)
        {
            DataSet _ds = new DataSet();
            IDataAdapter _adapter = _DALLayer.GetDataAdapter(_com);
            _adapter.Fill(_ds);
            //DataAccessLayer.Audit.AddAuditForSessionUser(_TableName, GetCommandAuditStatement(_com));
            return _ds;
        }

        public DataTable ExecuteDataTableFromCommand(IDbCommand _com)
        {
            DataTable _result = null;
            DataSet _ds = new DataSet();
            IDataAdapter _adapter = _DALLayer.GetDataAdapter(_com);
            _adapter.Fill(_ds);
            if (_ds.Tables.Count > 0) _result = _ds.Tables[0];            

            //DataAccessLayer.Audit.AddAuditForSessionUser(_TableName, GetCommandAuditStatement(_com));
            return _result;
        }

        public IDataReader ExecuteReaderFromCommand(IDbCommand _com)
        {
            IDataReader _reader = _com.ExecuteReader();
            //DataAccessLayer.Audit.AddAuditForSessionUser(_TableName, GetCommandAuditStatement(_com));

            return _reader;
        }

        public long ExecuteNonQueryInsertIdentityValueFromCommandWithoutAudit(DataAccessTableFiller _filler)
        {
            object _result = _filler.LastCommand.ExecuteScalar();
            long _long = DataAccessTableManager.LongParse(_result);
            return _long;
        }

        public long ExecuteNonQueryInsertIdentityValueFromCommand(DataAccessTableFiller _filler)
        {
            object _result = _filler.LastCommand.ExecuteScalar();            
            long _long = DataAccessTableManager.LongParse(_result);
            DataAccessLayer.Audit.AddAuditForSessionUser(_TableName, DataAccessAudit.GetCommandAuditStatement(_filler.LastCommand), _filler.AuditNote);
            if (_filler.Definition.PrimaryKeyColumns.Count == 1 && _result != null)
            {
                _filler.AddColumnValue(_filler.Definition.PrimaryKeyColumns[0], _result);
                if (_filler.RowData != null)
                {
                    _filler.RowData[_filler.Definition.PrimaryKeyColumns[0]] = _result;
                    _filler.RowData.AcceptChanges();
                }
            }
            return _long;
        }

        public int ExecuteNonQueryInsertFromCommand(DataAccessTableFiller _filler)
        {
            int _result = _filler.LastCommand.ExecuteNonQuery();
            DataAccessLayer.Audit.AddAuditForSessionUser(_TableName, DataAccessAudit.GetCommandAuditStatement(_filler.LastCommand), _filler.AuditNote);
            return _result;
        }

        public int ExecuteNonQueryUpdateFromCommand(DataAccessTableFiller _filler)
        {
            int _result = _filler.LastCommand.ExecuteNonQuery();
            DataAccessLayer.Audit.AddAuditForSessionUser(_TableName, DataAccessAudit.GetCommandAuditStatement(_filler.LastCommand), _filler.AuditNote);
            return _result;
        }

        public int ExecuteNonQueryDeleteFromCommand(DataAccessTableFiller _filler)
        {
            int _result = _filler.LastCommand.ExecuteNonQuery();
            DataAccessLayer.Audit.AddAuditForSessionUser(_TableName, DataAccessAudit.GetCommandAuditStatement(_filler.LastCommand), _filler.AuditNote);
            return _result;
        }

        public int ExecuteNonQueryDeleteFromWhere(string _sql, IDbDataParameter[] _params)
        {
            string _sqlx = "DELETE FROM {0} WHERE " + _sql;
            _sqlx = string.Format(_sqlx, _TableName);

            IDbCommand _com = _DALLayer.GetCommand();
            _com.CommandType = CommandType.Text;
            _com.CommandText = _sqlx;

            if (_params != null)
            {
                foreach (IDbDataParameter _param in _params)
                {
                    _com.Parameters.Add(_param);
                }
            }
            
            int _result = _com.ExecuteNonQuery();
            DataAccessLayer.Audit.AddAuditForSessionUser(_TableName, DataAccessAudit.GetCommandAuditStatement(_com), "");
            return _result;
        }   
        #endregion

        #region IsType
        public string GetTypeName(string _typename)
        {
            if (_ColumnDefinition == null || _ColumnDefinition.Rows.Count <= 0) return "";
            DataRow[] _rows = _ColumnDefinition.Select("Column_Name='" + _typename + "'");
            if (_rows == null || _rows.Length <= 0) return "";
            return _rows[0]["Data_Type"].ToString();
        }
        
        public bool IsDateTimeType(string _columnName)
        {
            string _typename = GetTypeName(_columnName);
            _typename = _typename.ToLower();
            if (_typename == "datetime" || _typename == "date" || _typename == "smalldatetime" || _typename == "date")
            {
                return true;
            }
            return false;
        }

        public bool IsFixStringType(string _columnName)
        {
            string _typename = GetTypeName(_columnName);
            _typename = _typename.ToLower();
            if (_typename == "varchar" || _typename == "char")
            {
                return true;
            }
            return false;
        }

        public bool IsNonFixStringType(string _columnName)
        {
            string _typename = GetTypeName(_columnName);
            _typename = _typename.ToLower();
            if (_typename == "nvarchar" || _typename == "nchar")
            {
                return true;
            }
            return false;
        }

        public bool IsStringType(string _columnName)
        {
            string _typename = GetTypeName(_columnName);
            _typename = _typename.ToLower();
            if (_typename == "varchar" || _typename == "nvarchar" ||
                _typename == "char" || _typename == "nchar")
            {
                return true;
            }
            return false;
        }

		public bool IsImageType(string _columnName)
		{
			string _typename = GetTypeName(_columnName);
			_typename = _typename.ToLower();
			if (_typename == "image" || _typename == "byte")
			{
				return true;
			}
			return false;
		}

        public bool IsValueType(string _columnName)
        {
            string _typename = GetTypeName(_columnName);
            _typename = _typename.ToLower();
            if (_typename == "int" || _typename == "bigint" ||
                _typename == "tinyint" || _typename == "smallint" ||
                _typename == "decimal" || _typename == "float")
            {
                return true;
            }
            return false;
        }

        public bool IsIntValueType(string _columnName)
        {
            string _typename = GetTypeName(_columnName);
            _typename = _typename.ToLower();
            if (_typename == "int")
            {
                return true;
            }
            return false;
        }

        public bool IsBigIntValueType(string _columnName)
        {
            string _typename = GetTypeName(_columnName);
            _typename = _typename.ToLower();
            if (_typename == "bigint")
            {
                return true;
            }
            return false;
        }

        public bool IsDecimalValueType(string _columnName)
        {
            string _typename = GetTypeName(_columnName);
            _typename = _typename.ToLower();
            if (_typename == "decimal")
            {
                return true;
            }
            return false;
        }

        public bool IsShortValueType(string _columnName)
        {
            string _typename = GetTypeName(_columnName);
            _typename = _typename.ToLower();
            if (_typename == "tinyint" || _typename == "smallint")
            {
                return true;
            }
            return false;
        }

        public bool IsBitType(string _columnName)
        {
            string _typename = GetTypeName(_columnName);
            _typename = _typename.ToLower();
            if (_typename == "bit")
            {
                return true;
            }
            return false;
        }

        public object GetDefaultValueFor(string _columnName)
        {
            if (IsValueType(_columnName)) return 0;
            if (IsImageType(_columnName)) return new byte[] { 0 };
            if (IsNonFixStringType(_columnName)) return "";
            if (IsFixStringType(_columnName)) return "".PadLeft(GetStringColumnMaxLength(_columnName), ' ');
            if (IsDateTimeType(_columnName)) return DateTime.MinValue;
            if (IsBitType(_columnName)) return false;
            return 0;
        }
        #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 GNU General Public License (GPLv3)


Written By
Software Developer (Senior)
Singapore Singapore
I write code mostly in C#, VB.NET, PHP and Assembly.

Comments and Discussions