/// <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(); } //} }
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; }
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 + "."); } }