/// <summary> /// Generates a pair of user defined functions for each enumeration column. /// The functions are used to convert enumeration column name/value pairs. /// </summary> /// <param name="table">The table that may contain enumeration columns.</param> internal void GenerateEnumerationFunctions(Table table) { foreach (Column col in table.Columns) { if (col.DataType == SqlDbType.TinyInt && col.Properties.Contains("codal_enumeration")) { CodeBuilder cb; EnumColumn objEnum; // Name to value function. cb = new CodeBuilder(); SqlGenerator.AddComment(cb); cb.WriteLine(""); cb.WriteLine("CREATE FUNCTION dbo.CoDAL_" + table.Name + "_" + col.Name + "_NameToValue (@Param AS VarChar(30)) RETURNS TinyInt AS"); cb.WriteLine(""); cb.WriteLine("BEGIN"); cb.WriteLine(1, "DECLARE @RetVal TinyInt"); cb.WriteLine(""); cb.WriteLine(1, "SET @RetVal ="); cb.WriteLine(2, "CASE"); objEnum = new EnumColumn(col); for (int n = 0; n < objEnum.EnumColumnValues.Count; n++) { EnumColumnValue objEnumValue = objEnum.EnumColumnValues[n]; cb.WriteLine(2, "WHEN @Param = '" + objEnumValue.Name + "' THEN " + objEnumValue.Value); } cb.WriteLine(2, "ELSE NULL"); cb.WriteLine(1, "END"); cb.WriteLine(""); cb.WriteLine(1, "RETURN(@RetVal)"); cb.WriteLine("END"); this.AddProcedure("CoDAL_" + table.Name + "_" + col.Name + "_NameToValue", cb.CodeText, false); // Value to name function. cb = new CodeBuilder(); SqlGenerator.AddComment(cb); cb.WriteLine(""); cb.WriteLine("CREATE FUNCTION dbo.CoDAL_" + table.Name + "_" + col.Name + "_ValueToName (@Param AS TinyInt) RETURNS VarChar(30) AS"); cb.WriteLine(""); cb.WriteLine("BEGIN"); cb.WriteLine(1, "DECLARE @RetVal VarChar(30)"); cb.WriteLine(""); cb.WriteLine(1, "SET @RetVal ="); cb.WriteLine(2, "CASE"); objEnum = new EnumColumn(col); for (int n = 0; n < objEnum.EnumColumnValues.Count; n++) { EnumColumnValue objEnumValue = objEnum.EnumColumnValues[n]; cb.WriteLine(2, "WHEN @Param = " + objEnumValue.Value + " THEN '" + objEnumValue.Name + "'"); } cb.WriteLine(2, "ELSE NULL"); cb.WriteLine(1, "END"); cb.WriteLine(""); cb.WriteLine(1, "RETURN(@RetVal)"); cb.WriteLine("END"); this.AddProcedure("CoDAL_" + table.Name + "_" + col.Name + "_ValueToName", cb.CodeText, false); } } return; }
/// <summary> /// Builds two constructors. One is used to initialize a new instance of the business class. The other /// is used by the retrieval methods to build an instance based on a current row in the table. /// </summary> /// <param name="cb">The CodeBuilder that this region should be added to.</param> /// <param name="table">The table that code is being built for.</param> private static void BuildConstructorsRegion(CodeBuilder cb, Table table) { // Start region. cb.WriteLine(1, "#region Constructors"); cb.WriteLine(""); // Build a no parameter constructor. cb.WriteLine(2, "protected " + table.Name + "Base()"); cb.WriteLine(2, "{"); foreach (Column objColumn in table.Columns) { cb.Write(3, "this._" + objColumn.Name + " = "); switch (objColumn.DataType) { case SqlDbType.TinyInt: if (objColumn.Properties.Contains("codal_enumeration")) { EnumColumn objEnumColumn = new EnumColumn(objColumn); cb.Write(objColumn.Name + "Enum." + objEnumColumn.EnumColumnValues[0].Name + ";"); } else if (objColumn.AllowNulls) { cb.Write("null;"); } else { //cb.Write("Blank" + objColumn.Name + ";"); cb.Write(objColumn.GetBlankValueForType()); cb.Write(";"); } break; case SqlDbType.Bit: cb.Write("false;"); break; case SqlDbType.Int: case SqlDbType.SmallInt: case SqlDbType.BigInt: case SqlDbType.DateTime: case SqlDbType.SmallDateTime: case SqlDbType.Decimal: case SqlDbType.Money: case SqlDbType.SmallMoney: case SqlDbType.Char: case SqlDbType.VarChar: case SqlDbType.Text: case SqlDbType.NChar: case SqlDbType.NVarChar: case SqlDbType.NText: if (objColumn.AllowNulls) { cb.Write("null;"); } else { //cb.Write("Blank" + objColumn.Name + ";"); cb.Write(objColumn.GetBlankValueForType()); cb.Write(";"); } break; default: throw new NotSupportedException("Unsupported data type in constructor"); } cb.WriteLine(""); } cb.WriteLine(2, "}"); cb.WriteLine(""); // Build a constructor that takes a reader object. cb.WriteLine(2, "protected " + table.Name + "Base" + "(SqlDataReader reader)"); cb.WriteLine(2, "{"); foreach (Column objColumn in table.Columns) { if (objColumn.AllowNulls == false) { cb.Write(3, "this._" + objColumn.Name + " = "); if (objColumn.Properties.Contains("codal_enumeration")) { cb.Write("(" + objColumn.Name + "Enum) "); } cb.WriteLine("reader." + objColumn.DataType.GetReaderFunction() + "((byte) Columns." + objColumn.Name + ");"); } else { cb.WriteLine(3, "if (reader.IsDBNull((byte) Columns." + objColumn.Name + "))"); //cb.WriteLine(4, "this._" + objColumn.Name + " = Blank" + objColumn.Name + ";"); cb.WriteLine(4, "this._" + objColumn.Name + " = null;"); cb.WriteLine(3, "else"); cb.WriteLine(4, "this._" + objColumn.Name + " = reader." + objColumn.DataType.GetReaderFunction() + "((byte) Columns." + objColumn.Name + ");"); } } cb.WriteLine(2, "}"); // End region. cb.WriteLine(""); cb.WriteLine(1, "#endregion"); cb.WriteLine(""); }
/// <summary> /// Initializes an EnumColumnValue. /// </summary> /// <param name="enumColumn">The EnumColumn that this EnumColumnValue belongs to.</param> /// <param name="value">The underlying integer value.</param> /// <param name="name">The name.</param> internal EnumColumnValue(EnumColumn enumColumn, byte value, string name) { this._EnumColumn = enumColumn; this._Value = value; this._Name = name; }
/// <summary> /// Builds a region containing enumerations. The enumerations consist of a Columns enumeration /// which contains the oridinal positions of columns in the table, as well as an enuemration for /// each TinyInt column that has a codegen_enumration extended property. /// </summary> /// <param name="cb">The CodeBuilder that this region should be added to.</param> /// <param name="table">The table that code is being built for.</param> private static void BuildEnumerationsRegion(CodeBuilder cb, Table table) { // Start region. cb.WriteLine(1, "#region Enumerations"); cb.WriteLine(""); // Columns enumeration. cb.WriteLine(2, "public enum Columns : byte"); cb.WriteLine(2, "{"); for (int n = 0; n < table.Columns.Count; n++) { Column objColumn = table.Columns[n]; cb.Write(3, objColumn.Name + " = " + n.ToString()); // Add a column for all but the last value. if (n == table.Columns.Count - 1) { cb.WriteLine(""); } else { cb.WriteLine(","); } } cb.WriteLine(2, "}"); // TinyInt enumeration columns. foreach (Column objColumn in table.Columns) { if (objColumn.DataType == SqlDbType.TinyInt && objColumn.Properties.Contains("codal_enumeration")) { EnumColumn objEnum = new EnumColumn(objColumn); cb.WriteLine(""); cb.WriteLine(2, "public enum " + objEnum.Name + " : byte"); cb.WriteLine(2, "{"); for (int n = 0; n < objEnum.EnumColumnValues.Count; n++) { EnumColumnValue objEnumValue = objEnum.EnumColumnValues[n]; cb.Write(3, objEnumValue.Name + " = " + objEnumValue.Value.ToString()); // Add a column for all but the last value. if (n == objEnum.EnumColumnValues.Count - 1) { cb.WriteLine(""); } else { cb.WriteLine(","); } } cb.WriteLine(2, "}"); } } // End region. cb.WriteLine(""); cb.WriteLine(1, "#endregion"); cb.WriteLine(""); }