CodeSmithJames/CommonSqlCode.cs using CodeSmith.Engine; using SchemaExplorer; using System; using System.Windows.Forms.Design; using System.Collections; using System.ComponentModel; using System.Data; using System.Data.SqlClient; using System.Text; using System.Text.RegularExpressions; using System.IO; namespace MoM.Templates { /// <summary> /// Common code-behind class used to simplify SQL Server based CodeSmith templates /// </summary> public class CommonSqlCode : CodeTemplate { public string GetSqlParameterStatement(ColumnSchema column) { string param = "@" + column.Name + " " + column.NativeType; switch (column.DataType) { case DbType.Decimal: { param += "(" + column.Precision + ", " + column.Scale + ")"; break; } default: { if (column.Size > 0) { param += "(" + column.Size + ")"; } break; } } return param; } public string GetSqlDeclareMaxStatement(ColumnSchema column) { string param = "DECLARE @Max" + column.Name + " AS " + column.NativeType; switch (column.DataType) { case DbType.Decimal: { param += "(" + column.Precision + ", " + column.Scale + ")"; break; } case DbType.Int16: case DbType.Int32: case DbType.Int64: case DbType.UInt16: case DbType.UInt32: case DbType.UInt64: { break; } default: { if (column.Size > 0) { param += "(" + column.Size + ")"; } break; } } return param; } /// <summary> /// 把数据库字段的数据类型转化为C#的数据类型 /// </summary> public string ConvertDBTypeToCSType(DataObjectBase column) { if (column.NativeType.ToLower() == "real") return "System.Single" + (column.AllowDBNull?"?":""); else if (column.NativeType.ToLower() == "xml") return "string"; else if (IsNeedQuestionMark(column) && column.AllowDBNull) return column.SystemType.ToString() + "?"; else return column.SystemType.ToString(); } /// <summary> /// 在允许为空的情况下,此字段是否需要问号 /// </summary> public bool IsNeedQuestionMark(DataObjectBase column) { DbType dataType = column.DataType; switch (dataType) { case DbType.Boolean: case DbType.Guid: case DbType.Byte: case DbType.Currency: case DbType.Date: case DbType.DateTime: case DbType.Decimal: case DbType.Double: case DbType.Int16: case DbType.Int32: case DbType.Int64: case DbType.Object: case DbType.Single: case DbType.Time: case DbType.VarNumeric: return true; default: return false; } } #region 属性类 /// <summary> /// 对数据表对应的class名称进行处理,使第一个字母大写 /// </summary> public string GetClassName(string name) { name = Regex.Replace(name, @"[/W]", ""); name = name.TrimStart(new char[] {'_', '-', '+', '=', '*'}); name = name.Substring(0, 1).ToUpper() + name.Substring(1); return name; } /// <summary> /// 得到数据表字段在class内对应的Private成员名称 /// </summary> public string GetPrivateNameInClass(string name) { return "Pri_"+name; } /// <summary> /// 得到数据表字段在class内对应的Public成员名称.为避免出现CS的关键字,需对其进行特殊处理 /// </summary> public string GetPublicNameInClass(string name) { name = Regex.Replace(name, @"[/W]", ""); name = name.TrimStart(new char[] {'_', '-', '+', '=', '*'}); name = name.Substring(0, 1).ToUpper() + name.Substring(1); return name; } /// <summary> /// 得到数据表字段在函数内对应的参数名称 /// </summary> public string GetRefNameInFunction(string name) { return name; } #endregion 属性类 #region 数据访问类 /// <summary> /// 判断此表是否有主键 /// </summary> public bool HasPrimaryKey(TableSchema table) { if (table.GetType().GetProperty("HasPrimaryKey") != null) { if (!(bool)table.GetType().GetProperty("HasPrimaryKey").GetValue(table, null)) return false; } if (table.PrimaryKey == null || table.PrimaryKey.MemberColumns.Count == 0) return false; return true; } /// <summary> /// 得到数据表栏位的DbType /// </summary> public string GetDbType(DataObjectBase field) { if (field.NativeType.ToLower() == "xml") { return "DbType.Xml"; } else { return "DbType." + field.DataType.ToString(); } } public string GetReaderAssignmentStatement(ColumnSchema column, int index){ string statement = "if (!dr.IsDBNull(" + index.ToString() + ")) "; statement += "detail." + GetPublicNameInClass(column.Name) + " = "; //if (column.Name.EndsWith("TypeCode")) statement += "(" + GetPublicNameInClass(column.Name) + ")"; statement += "dr." + GetReaderMethod(column) + "(" + index.ToString() + ");"; return statement; } public string GetReaderMethod(ColumnSchema column) { switch (column.DataType) { case DbType.Byte: { return "GetByte"; } case DbType.Int16: { return "GetInt16"; } case DbType.Int32: { return "GetInt32"; } case DbType.Int64: { return "GetInt64"; } case DbType.AnsiStringFixedLength: case DbType.AnsiString: case DbType.String: case DbType.StringFixedLength: { return "GetString"; } case DbType.Boolean: { return "GetBoolean"; } case DbType.Guid: { return "GetGuid"; } case DbType.Currency: case DbType.Decimal: { return "GetDecimal"; } case DbType.DateTime: case DbType.Date: { return "GetDateTime"; } case DbType.Binary: { return "GetBytes"; } default: { return "__SQL__" + column.DataType; } } } public bool IsStringType(DataObjectBase column) { DbType dataType = column.DataType; switch (dataType) { case DbType.AnsiString: case DbType.AnsiStringFixedLength: case DbType.String: case DbType.StringFixedLength: return true; default: return false; } } /// <summary> /// Check if a column is an identity column,para:DB table column to be checked /// </summary> public bool IsIdentityColumn(ColumnSchema column) { // for sql server if (column.ExtendedProperties["CS_IsIdentity"] != null) return (bool)column.ExtendedProperties["CS_IsIdentity"].Value; // for access if (column.ExtendedProperties["Autoincrement"] != null) return (bool)column.ExtendedProperties["Autoincrement"].Value; return false; } #endregion 数据访问类 } }