/// <summary>
        /// Function to determine how many characters an input field should take in for a give data type.
        /// -1 returned if we cannot work it out.
        /// </summary>
        public static int ComputeStringLength(SqlColumn sql_column)
        {
            switch (sql_column.SqlDataType)
                {
                    case SqlDbType.BigInt:		    	return long.MaxValue.ToString().Length;
                    case SqlDbType.Binary:		    	return sql_column.Length;
                    case SqlDbType.Bit:			    	return 1;
                    case SqlDbType.Char:		    	return 1;
                    //case SqlDbType.Date:		    	return "DateTime?";
                    //case SqlDbType.DateTime:	    	return "DateTime?";
                    //case SqlDbType.DateTime2:	    	return "DateTime?";
                    //case SqlDbType.DateTimeOffset:  	return "DateTime?";
                    case SqlDbType.Decimal:		    	return decimal.MaxValue.ToString().Length;
                    case SqlDbType.Float:               return double.MaxValue.ToString().Length;
                    //case SqlDbType.Image:               return "byte[]";
                    case SqlDbType.Int:                 return int.MaxValue.ToString().Length;
                    //case SqlDbType.Money:               return "decimal?";
                    case SqlDbType.NChar:               return sql_column.Length;
                    //case SqlDbType.NText:               return "string";
                    case SqlDbType.NVarChar:            return sql_column.Length;
                    //case SqlDbType.Real:                return "float?";
                    //case SqlDbType.SmallDateTime:       return "DateTime?";
                    case SqlDbType.SmallInt:            return short.MaxValue.ToString().Length;
                    //case SqlDbType.SmallMoney:          return "float?";
                    //case SqlDbType.Structured:          return "// NO TYPE AVAILABLE FOR " + sql_column.SqlDataType.ToString();
                    //case SqlDbType.Text:                return "string";
                    //case SqlDbType.Time:                return "DateTime?";
                    //case SqlDbType.Timestamp:           return "string";
                    case SqlDbType.TinyInt:             return byte.MaxValue.ToString().Length;
                    //case SqlDbType.Udt:                 return "byte[]";
                    //case SqlDbType.UniqueIdentifier:    return "Guid?";
                    //case SqlDbType.VarBinary:           return "bool[]";
                    case SqlDbType.VarChar:             return sql_column.Length;
                    //case SqlDbType.Variant:             return "byte[]";
                    case SqlDbType.Xml:                 return sql_column.Length;

                    default:
                        return -1;
                }
        }
 /// <summary>
 /// Returns the SQL column name formatted to be used as a T-SQL
 /// variable. Sample: Foo -> @Foo;
 /// </summary>
 public static string ToTSQLVariableName(SqlColumn sql_column)
 {
     return "@" + sql_column.Name;
 }
        /// <summary>
        /// Returns a T-SQL representation of the SQL datatype.
        /// Sample: VARCHAR(50)
        /// </summary>
        public static string ToTSQLType(SqlColumn column)
        {
            SqlDbType sql_type = column.SqlDataType;

                if  (sql_type == SqlDbType.Binary || sql_type == SqlDbType.Char || sql_type == SqlDbType.NChar || sql_type == SqlDbType.NVarChar ||
                    sql_type == SqlDbType.VarBinary || sql_type == SqlDbType.VarChar)
                {
                    if (column.Length == -1)
                    {
                        return string.Format("{0}(MAX)", column.SqlDataType.ToString().ToUpper(), column.Length);
                    }
                    else
                    {
                        return string.Format("{0}({1})", column.SqlDataType.ToString().ToUpper(), column.Length);
                    }
                }
                else if (sql_type == SqlDbType.Decimal)
                {
                    return string.Format("{0}({1},{2})", column.SqlDataType.ToString().ToUpper(), column.Precision.ToString(), column.Scale.ToString());
                }
                else
                {
                    return column.SqlDataType.ToString().ToUpper();
                }
        }
        /// <summary>
        /// Generates a complete parameter string. 
        /// Sample: parameter = new SqlParameter("@TabIndex", SqlDbType.Int, 4);
        /// </summary>
        public static string ToCSharpSQLParameterString(SqlColumn sql_column)
        {
            // Output:
                // parameter = new SqlParameter("@TabIndex", SqlDbType.Int, 4);

                switch (sql_column.SqlDataType)
                {
                    case SqlDbType.Text:
                        return String.Format("parameter = new SqlParameter(\"{0}\", SqlDbType.{1});", ToTSQLVariableName(sql_column), sql_column.SqlDataType.ToString());

                    default:
                        return String.Format("parameter = new SqlParameter(\"{0}\", SqlDbType.{1}, {2});", ToTSQLVariableName(sql_column), sql_column.SqlDataType.ToString(), sql_column.Length.ToString());
                }
        }
        /// <summary>
        /// Returns the SQL column name formatted as a C# property name
        /// Includes a to string call if the property needs it
        /// Sample: foo_bar -> FooBar.ToString()
        /// </summary>
        public static string ToCSharpPropertyNameString(SqlColumn sql_column)
        {
            string output = NormalizeForCSharp(sql_column.Name);

                if (sql_column.BaseType == eSqlBaseType.String)
                    return output;
                else
                    return output + ".ToString()";
        }
        /// <summary>
        /// Returns the CSharp mapping of the SQL datatype.
        /// Maps actual datatypes, not datatype names.
        /// sample: varchar(50) -> string
        /// </summary>
        public static string SQLTypeToCSharpType(SqlColumn sql_column)
        {
            if (sql_column.IsNullable)
                {
                    switch (sql_column.SqlDataType)
                    {
                        case SqlDbType.BigInt:		    	return "long?";
                        case SqlDbType.Binary:		    	return "byte[]";
                        case SqlDbType.Bit:			    	return "bool?";
                        case SqlDbType.Char:		    	return "string";
                        case SqlDbType.Date:		    	return "DateTime?";
                        case SqlDbType.DateTime:	    	return "DateTime?";
                        case SqlDbType.DateTime2:	    	return "DateTime?";
                        case SqlDbType.DateTimeOffset:  	return "DateTime?";
                        case SqlDbType.Decimal:		    	return "decimal?";
                        case SqlDbType.Float:               return "double?";
                        case SqlDbType.Image:               return "byte[]";
                        case SqlDbType.Int:                 return "int?";
                        case SqlDbType.Money:               return "decimal?";
                        case SqlDbType.NChar:               return "string";
                        case SqlDbType.NText:               return "string";
                        case SqlDbType.NVarChar:            return "string";
                        case SqlDbType.Real:                return "float?";
                        case SqlDbType.SmallDateTime:       return "DateTime?";
                        case SqlDbType.SmallInt:            return "short?";
                        case SqlDbType.SmallMoney:          return "float?";
                        case SqlDbType.Structured:          return "// NO TYPE AVAILABLE FOR " + sql_column.SqlDataType.ToString();
                        case SqlDbType.Text:                return "string";
                        case SqlDbType.Time:                return "DateTime?";
                        case SqlDbType.Timestamp:           return "string";
                        case SqlDbType.TinyInt:             return "byte?";
                        case SqlDbType.Udt:                 return "byte[]";
                        case SqlDbType.UniqueIdentifier:    return "Guid?";
                        case SqlDbType.VarBinary:           return "byte[]";
                        case SqlDbType.VarChar:             return "string";
                        case SqlDbType.Variant:             return "byte[]";
                        case SqlDbType.Xml:                 return "string";

                        default:
                            return "// NO TYPE AVAILABLE FOR " + sql_column.SqlDataType.ToString();
                    }
                }
                else
                {
                    switch (sql_column.SqlDataType)
                    {
                        case SqlDbType.BigInt:		    	return "long";
                        case SqlDbType.Binary:		    	return "byte[]";
                        case SqlDbType.Bit:			    	return "bool";
                        case SqlDbType.Char:		    	return "string";
                        case SqlDbType.Date:		    	return "DateTime";
                        case SqlDbType.DateTime:	    	return "DateTime";
                        case SqlDbType.DateTime2:	    	return "DateTime";
                        case SqlDbType.DateTimeOffset:  	return "DateTime";
                        case SqlDbType.Decimal:		    	return "decimal";
                        case SqlDbType.Float:               return "double";
                        case SqlDbType.Image:               return "byte[]";
                        case SqlDbType.Int:                 return "int";
                        case SqlDbType.Money:               return "decimal";
                        case SqlDbType.NChar:               return "string";
                        case SqlDbType.NText:               return "string";
                        case SqlDbType.NVarChar:            return "string";
                        case SqlDbType.Real:                return "float";
                        case SqlDbType.SmallDateTime:       return "DateTime";
                        case SqlDbType.SmallInt:            return "short";
                        case SqlDbType.SmallMoney:          return "float";
                        case SqlDbType.Structured:          return "// NO TYPE AVAILABLE FOR " + sql_column.SqlDataType.ToString();
                        case SqlDbType.Text:                return "string";
                        case SqlDbType.Time:                return "DateTime";
                        case SqlDbType.Timestamp:           return "string";
                        case SqlDbType.TinyInt:             return "byte";
                        case SqlDbType.Udt:                 return "byte[]";
                        case SqlDbType.UniqueIdentifier:    return "Guid";
                        case SqlDbType.VarBinary:           return "byte[]";
                        case SqlDbType.VarChar:             return "string";
                        case SqlDbType.Variant:             return "byte[]";
                        case SqlDbType.Xml:                 return "string";

                        default:
                            return "// NO TYPE AVAILABLE FOR " + sql_column.SqlDataType.ToString();
                    }
                }
        }
        /// <summary>
        /// Returns a ASP.NET match of the SQL datatype
        /// </summary>
        public static string SQLToASPType(SqlColumn sql_column)
        {
            #region Sample
                //<UpdateParameters>
                //    <asp:Parameter Name="foo" Type="Boolean" />
                //    <asp:Parameter Name="foo" Type="Byte" />
                //    <asp:Parameter Name="foo" Type="Char" />
                //    <asp:Parameter Name="foo" Type="DateTime" />
                //    <asp:Parameter Name="foo" Type="DBNull" />
                //    <asp:Parameter Name="foo" Type="Decimal" />
                //    <asp:Parameter Name="foo" Type="Double" />
                //    <asp:Parameter Name="foo" Type="Empty" />
                //    <asp:Parameter Name="foo" Type="Int16" />
                //    <asp:Parameter Name="foo" Type="Int32" />
                //    <asp:Parameter Name="foo" Type="Int64" />
                //    <asp:Parameter Name="foo" Type="Object" />
                //    <asp:Parameter Name="foo" Type="SByte" />
                //    <asp:Parameter Name="foo" Type="Single" />
                //    <asp:Parameter Name="foo" Type="String" />
                //    <asp:Parameter Name="foo" Type="UInt16" />
                //    <asp:Parameter Name="foo" Type="UInt32" />
                //    <asp:Parameter Name="foo" Type="UInt64" />
                //</UpdateParameters>
                #endregion

                switch (sql_column.SqlDataType)
                {
                    case SqlDbType.BigInt:		    	return "UInt64";
                    case SqlDbType.Binary:		    	return "Object";
                    case SqlDbType.Bit:			    	return "Boolean";
                    case SqlDbType.Char:		    	return "Char";;
                    case SqlDbType.Date:		    	return "DateTime";
                    case SqlDbType.DateTime:	    	return "DateTime";
                    case SqlDbType.DateTime2:	    	return "DateTime";
                    case SqlDbType.DateTimeOffset:  	return "DateTime";
                    case SqlDbType.Decimal:		    	return "Decimal";
                    case SqlDbType.Float:               return "Decimal";
                    case SqlDbType.Image:               return "Object";
                    case SqlDbType.Int:                 return "Int32";
                    case SqlDbType.Money:               return "Decimal";;
                    case SqlDbType.NChar:               return "string";
                    case SqlDbType.NText:               return "string";
                    case SqlDbType.NVarChar:            return "string";
                    case SqlDbType.Real:                return "Decimal";
                    case SqlDbType.SmallDateTime:       return "DateTime";
                    case SqlDbType.SmallInt:            return "Int16";
                    case SqlDbType.SmallMoney:          return "Decimal";
                    case SqlDbType.Structured:          return "Object";
                    case SqlDbType.Text:                return "string";
                    case SqlDbType.Time:                return "DateTime";
                    case SqlDbType.Timestamp:           return "string";
                    case SqlDbType.TinyInt:             return "Byte";
                    case SqlDbType.Udt:                 return "Object";
                    case SqlDbType.UniqueIdentifier:    return "String";
                    case SqlDbType.VarBinary:           return "Object";
                    case SqlDbType.VarChar:             return "string";
                    case SqlDbType.Variant:             return "Object";
                    case SqlDbType.Xml:                 return "string";

                    default:
                        return "Int32";
                }
        }
        /// <summary>
        /// Returns the minimum C# value for the given SQL datatype.
        /// </summary>
        public static string GetCSharpMinValue(SqlColumn sql_column)
        {
            switch (sql_column.SqlDataType)
                {
                    case SqlDbType.BigInt:		    	return "long.MinValue";
                    case SqlDbType.Binary:		    	return "null";
                    case SqlDbType.Bit:			    	return "false";
                    case SqlDbType.Char:		    	return "string.Empty";
                    case SqlDbType.Date:		    	return "DateTime.MinValue";
                    case SqlDbType.DateTime:	    	return "DateTime.MinValue";
                    case SqlDbType.DateTime2:	    	return "DateTime.MinValue";
                    case SqlDbType.DateTimeOffset:  	return "DateTime.MinValue";
                    case SqlDbType.Decimal:		    	return "decimal.MinValue";
                    case SqlDbType.Float:               return "double.MinValue";
                    case SqlDbType.Image:               return "null";
                    case SqlDbType.Int:                 return "int.MinValue";
                    case SqlDbType.Money:               return "decimal.MinValue";
                    case SqlDbType.NChar:               return "string.Empty";
                    case SqlDbType.NText:               return "string.Empty";
                    case SqlDbType.NVarChar:            return "string.Empty";
                    case SqlDbType.Real:                return "float.MinValue";
                    case SqlDbType.SmallDateTime:       return "DateTime.Now";
                    case SqlDbType.SmallInt:            return "int.MinValue";
                    case SqlDbType.SmallMoney:          return "float.MinValue";
                    case SqlDbType.Structured:          return "null";
                    case SqlDbType.Text:                return "string.Empty";
                    case SqlDbType.Time:                return "DateTime.MinValue";
                    case SqlDbType.Timestamp:           return "string.Empty";
                    case SqlDbType.TinyInt:             return "byte.MinValue";
                    case SqlDbType.Udt:                 return "null";
                    case SqlDbType.UniqueIdentifier:    return "Guid.Empty";
                    case SqlDbType.VarBinary:           return "null";
                    case SqlDbType.VarChar:             return "string.Empty";
                    case SqlDbType.Variant:             return "null";
                    case SqlDbType.Xml:                 return "string.Empty";

                    default:
                        return "// NO MIN VALUE AVAILABLE FOR " + sql_column.SqlDataType.ToString();
                }
        }
        /// <summary>
        /// Returns a valid C# default value for the given SQL datatype.
        /// </summary>
        public static string GetCSharpDefaultValue(SqlColumn sql_column)
        {
            // do we have a non default value?
                if (sql_column.DefaultValue != string.Empty)
                {
                    switch (sql_column.SqlDataType)
                    {
                        case SqlDbType.BigInt:		    	return sql_column.DefaultValue;
                        //case SqlDbType.Binary:		    	return "null";
                        case SqlDbType.Bit:
                            if (sql_column.DefaultValue == "1")
                                return "true";
                            else
                                return "false";

                        case SqlDbType.Char:		    	return "\"" + sql_column.DefaultValue + "\"";
                        case SqlDbType.Date:		    	return sql_column.DefaultValue.ToLower() == "getdate()" ? "DateTime.Now;" :"DateTime.Parse(\"" + sql_column.DefaultValue + "\")";
                        case SqlDbType.DateTime:	    	return sql_column.DefaultValue.ToLower() == "getdate()" ? "DateTime.Now;" :"DateTime.Parse(\"" + sql_column.DefaultValue + "\")";
                        case SqlDbType.DateTime2:	    	return sql_column.DefaultValue.ToLower() == "getdate()" ? "DateTime.Now;" :"DateTime.Parse(\"" + sql_column.DefaultValue + "\")";
                        case SqlDbType.DateTimeOffset:  	return sql_column.DefaultValue.ToLower() == "getdate()" ? "DateTime.Now;" :"DateTime.Parse(\"" + sql_column.DefaultValue + "\")";
                        case SqlDbType.Decimal:		    	return sql_column.DefaultValue;
                        case SqlDbType.Float:               return sql_column.DefaultValue;
                        //case SqlDbType.Image:               return "null";
                        case SqlDbType.Int:                 return sql_column.DefaultValue;
                        case SqlDbType.Money:               return sql_column.DefaultValue + "m";
                        case SqlDbType.NChar:               return "\"" + sql_column.DefaultValue + "\"";
                        case SqlDbType.NText:               return "\"" + sql_column.DefaultValue + "\"";
                        case SqlDbType.NVarChar:            return "\"" + sql_column.DefaultValue + "\"";
                        case SqlDbType.Real:                return sql_column.DefaultValue + "f";
                        case SqlDbType.SmallDateTime:       return "\"" + DateTime.MinValue.ToString() + "\"";
                        case SqlDbType.SmallInt:            return sql_column.DefaultValue;
                        case SqlDbType.SmallMoney:          return sql_column.DefaultValue + "f";
                        //case SqlDbType.Structured:          return "null";
                        case SqlDbType.Text:                return "string.Empty";
                        case SqlDbType.Time:                return "DateTime.Now";
                        //case SqlDbType.Timestamp:           return "string.Empty";
                        case SqlDbType.TinyInt:             return sql_column.DefaultValue;
                        //case SqlDbType.Udt:                 return "null";
                        case SqlDbType.UniqueIdentifier:    return "Guid.Empty";
                        //case SqlDbType.VarBinary:           return "null";
                        case SqlDbType.VarChar:             return "\"" + sql_column.DefaultValue + "\"";
                        //case SqlDbType.Variant:             return "null";
                        case SqlDbType.Xml:                 return "\"" + sql_column.DefaultValue + "\"";

                        default:
                            return "// NO DEFAULT AVAILABLE FOR " + sql_column.SqlDataType.ToString();
                    }

                }

                if (sql_column.IsNullable)
                {
                    switch (sql_column.SqlDataType)
                    {
                        case SqlDbType.Variant:
                            return "// NO DEFAULT AVAILABLE FOR " + sql_column.SqlDataType.ToString();

                        default:
                            return "null";
                    }
                }
                else
                {
                    switch (sql_column.SqlDataType)
                    {
                        case SqlDbType.BigInt:		    	return "0";
                        case SqlDbType.Binary:		    	return "null";
                        case SqlDbType.Bit:			    	return "false";
                        case SqlDbType.Char:		    	return "string.Empty";
                        case SqlDbType.Date:		    	return "DateTime.Now";
                        case SqlDbType.DateTime:	    	return "DateTime.Now";
                        case SqlDbType.DateTime2:	    	return "DateTime.Now";
                        case SqlDbType.DateTimeOffset:  	return "DateTime.Now";
                        case SqlDbType.Decimal:		    	return "0.0m";
                        case SqlDbType.Float:               return "0.0d";
                        case SqlDbType.Image:               return "null";
                        case SqlDbType.Int:                 return "0";
                        case SqlDbType.Money:               return "0.0m";
                        case SqlDbType.NChar:               return "string.Empty";
                        case SqlDbType.NText:               return "string.Empty";
                        case SqlDbType.NVarChar:            return "string.Empty";
                        case SqlDbType.Real:                return "0.0f";
                        case SqlDbType.SmallDateTime:       return "DateTime.Now";
                        case SqlDbType.SmallInt:            return "0";
                        case SqlDbType.SmallMoney:          return "0.0f";
                        case SqlDbType.Structured:          return "null";
                        case SqlDbType.Text:                return "string.Empty";
                        case SqlDbType.Time:                return "DateTime.Now";
                        case SqlDbType.Timestamp:           return "string.Empty";
                        case SqlDbType.TinyInt:             return "byte.MinValue";
                        case SqlDbType.Udt:                 return "null";
                        case SqlDbType.UniqueIdentifier:    return "Guid.Empty";
                        case SqlDbType.VarBinary:           return "null";
                        case SqlDbType.VarChar:             return "string.Empty";
                        case SqlDbType.Variant:             return "null";
                        case SqlDbType.Xml:                 return "string.Empty";

                        default:
                            return "// NO DEFAULT AVAILABLE FOR " + sql_column.SqlDataType.ToString();
                    }
                }
        }
        /// <summary>
        /// Returns the proper cast to C# type for the given SQL datatype.
        /// Example: int -> Convert.ToInt32
        /// </summary>
        public static string GetCSharpCastString(SqlColumn sql_column)
        {
            //if (sql_column.IsNullable)
                //{
                //    // TODO
                //    return string.Empty;
                //}
                //else
                //{
                    switch (sql_column.SqlDataType)
                    {
                        case SqlDbType.BigInt:		    	return "Convert.ToInt64";
                        //case SqlDbType.Binary:		    	return Convert"null";
                        case SqlDbType.Bit:			    	return "Convert.ToBoolean";
                        case SqlDbType.Char:		    	return "Convert.ToChar";
                        case SqlDbType.Date:		    	return "Convert.ToDateTime";
                        case SqlDbType.DateTime:	    	return "Convert.ToDateTime";
                        case SqlDbType.DateTime2:	    	return "Convert.ToDateTime";
                        case SqlDbType.DateTimeOffset:  	return "DateTime.Now";
                        case SqlDbType.Decimal:		    	return "Convert.ToDecimal";
                        case SqlDbType.Float:               return "Convert.ToDouble";
                        //case SqlDbType.Image:               return "null";
                        case SqlDbType.Int:                 return "Convert.ToInt32";
                        case SqlDbType.Money:               return "Convert.ToDecimal";
                        case SqlDbType.NChar:               return "Convert.ToString";
                        case SqlDbType.NText:               return "Convert.ToString";
                        case SqlDbType.NVarChar:            return "Convert.ToString";
                        case SqlDbType.Real:                return "Convert.ToDouble";
                        case SqlDbType.SmallDateTime:       return "DateTime.Now";
                        case SqlDbType.SmallInt:            return "Convert.ToInt16";
                        case SqlDbType.SmallMoney:          return "Convert.ToDecimal";
                        //case SqlDbType.Structured:          return "null";
                        case SqlDbType.Text:                return "Convert.ToString";
                        case SqlDbType.Time:                return "DateTime.Now";
                        //case SqlDbType.Timestamp:           return "string.Empty";
                        case SqlDbType.TinyInt:             return "byte.MinValue";
                        //case SqlDbType.Udt:                 return "null";
                        case SqlDbType.UniqueIdentifier:    return "Convert.ToString";
                        //case SqlDbType.VarBinary:           return "null";
                        case SqlDbType.VarChar:             return "Convert.ToString";
                        //case SqlDbType.Variant:             return "null";
                        case SqlDbType.Xml:                 return "Convert.ToString";

                        default:
                            return "// NO CONVERSION AVAILABLE FOR " + sql_column.SqlDataType.ToString();
                    }
                //}
        }
示例#11
0
        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(string.Format("Column {0} already exists in table {1}.", column_name, _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;
        }
示例#12
0
        protected void GetColumnMetaData(DataTable dt)
        {
            _Columns.Clear();

                if (dt != null && dt.Rows.Count != 0 && dt.Columns.Count != 0)
                {
                    SqlColumn obj;

                    foreach (DataRow dr in dt.Rows)
                    {
                        // For some strange reason, if a column's type is nvarchar SQL2K
                        // will add an additional entry to the syscolumns table with the
                        // type listed as a sysname. Since we don't want duplicat entries, omit.

                        //if ((string)dr["DataType"] == "sysname")
                        //    continue;

                        obj = new SqlColumn
                        (
                                this,
                                (string)dr["ColumnName"],
                                (string)dr["DataType"],
                                (int)dr["Length"],
                                (int)dr["Precision"],
                                (int)dr["Scale"],
                                (bool)dr["IsNullable"],
                                (bool)dr["IsPK"],
                                (bool)dr["IsIdentity"],
                                (int)dr["ColumnOrdinal"],
                                (string)dr["DefaultValue"]
                        );

                        _Columns.Add(obj.Name, obj);
                    }
                }
                else
                {
                    throw new Exception("Cannot retrieve metadata for table " + this._Name + ".");
                }
        }