⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 codegenerator.cs

📁 oracle dal gen,生成.NET ORACLE DAL层代码
💻 CS
📖 第 1 页 / 共 2 页
字号:
            }

            return list;
        }

        private CodeTypeMemberCollection GenerateProperties(DataColumnCollection columns)
        {
            CodeTypeMemberCollection list = new CodeTypeMemberCollection();
            foreach (DataColumn col in columns)
            {
                /*
                 *  Creating property
                 */
                CodeMemberProperty property = CreateProperty(col.ColumnName, col.DataType);

                /*
                 *  Adding mappings for the column
                 */
                CodeAttributeDeclaration cad = GenerateAttribute(col.ColumnName);
                if (cad != null)
                    property.CustomAttributes.Add(cad);

                list.Add(property);
            }

            return list;
        }

        private CodeMemberProperty CreateProperty(string columnName, Type dataType)
        {
            return CreateProperty(columnName, dataType.ToString());
        }

        private CodeMemberProperty CreateProperty(string columnName, string dataType)
        {
            /*
             *  Add a property for a column
             */
            CodeMemberProperty property = new CodeMemberProperty();
            property.Attributes = MemberAttributes.Public;
            property.Name = GetPublicName(columnName);
            property.Type = new CodeTypeReference(dataType);
            property.GetStatements.Add(new CodeMethodReturnStatement(new CodeFieldReferenceExpression(new CodeThisReferenceExpression(), GetPrivateName(columnName))));
            property.SetStatements.Add(new CodeAssignStatement(new CodeFieldReferenceExpression(new CodeThisReferenceExpression(), GetPrivateName(columnName)), new CodePropertySetValueReferenceExpression()));

            return property;
        }

        private CodeAttributeDeclaration GenerateAttribute(string columnName)
        {
            /*
             *  Creating mapping Attribute
             */

            CodeAttributeDeclaration cad = null;
            if (columnsInfo.ContainsKey(columnName))
            {
                ColumnInfo ci = columnsInfo[columnName];
                if (ci.Pk == 1) // It's a PK Column, add the IdColumn attribute
                {
                    cad = new CodeAttributeDeclaration(new CodeTypeReference(typeof(IdColumn)));
                    cad.Arguments.Add(new CodeAttributeArgument(new CodePrimitiveExpression(columnName)));
                }
                else if (ci.Fk == 1) // It's a foreign key column add a ObjectColumn attribute
                {
                    string className = GetPublicName(ci.RefTableName);
                    if (generateTree) // Follow foreign keys and generate the classes
                    {
                        CodeGenerator cg = new CodeGenerator(tableIgnoreList, ci.RefTableName, nameSpace, generateFromTable, saveAsFile, connection);
                        cg.Generate(className, true, generateDBPkg, outputDirectory);
                        if (cg.Class != null && !saveAsFile)
                            cs.Types.Add(cg.Class);
                    }

                    cad = new CodeAttributeDeclaration(new CodeTypeReference(typeof(ObjectColumn)));
                    cad.Arguments.Add(new CodeAttributeArgument(new CodePrimitiveExpression(columnName)));
                    cad.Arguments.Add(new CodeAttributeArgument(new CodeVariableReferenceExpression("OracleDbType.Decimal")));
                    cad.Arguments.Add(new CodeAttributeArgument(new CodeVariableReferenceExpression(string.Format("typeof({0})", className))));
                }

                foreach (ColumnInfo cil in ci.Links)
                {
                    /*
                     *  Found some foreign keys. Generate the classes and add references to them.
                     */
                    string className = GetPublicName(cil.TableName);

                    CodeGenerator cg = new CodeGenerator(tableIgnoreList, cil.TableName, nameSpace, generateFromTable, saveAsFile, connection);
                    cg.Generate(className, true, generateDBPkg, outputDirectory);
                    if (cg.Class != null)
                    {
                        CodeMemberProperty property = CreateProperty(cil.TableName, string.Format("List<{0}>", className));
                        CodeAttributeDeclaration listCad = new CodeAttributeDeclaration(new CodeTypeReference(typeof(ListColumn)));
                        listCad.Arguments.Add(new CodeAttributeArgument(new CodePrimitiveExpression(columnName)));
                        listCad.Arguments.Add(new CodeAttributeArgument(new CodePrimitiveExpression(cil.ColumnName)));
                        listCad.Arguments.Add(new CodeAttributeArgument(new CodePrimitiveExpression("stored proc")));
                        listCad.Arguments.Add(new CodeAttributeArgument(new CodeVariableReferenceExpression("Method.Select")));
                        listCad.Arguments.Add(new CodeAttributeArgument(new CodeVariableReferenceExpression("CommandType.StoredProcedure")));                        
                        listCad.Arguments.Add(new CodeAttributeArgument(new CodeVariableReferenceExpression(string.Format("typeof({0})", className))));
                        listCad.Arguments.Add(new CodeAttributeArgument(new CodeVariableReferenceExpression("OracleDbType.Decimal")));

                        property.CustomAttributes.Add(listCad);
                        foreignPropertyList.Add(property);

                        if (!saveAsFile)
                            cs.Types.Add(cg.Class);
                    }
                }
            }
            else // Just a column, add the DbColumn attribute
            {
                cad = new CodeAttributeDeclaration(new CodeTypeReference(typeof(DbColumn)));
                cad.Arguments.Add(new CodeAttributeArgument(new CodePrimitiveExpression(columnName)));
            }

            return cad;
        }

        #endregion

        #region Generate methods

        private CodeMemberMethod GenerateLoadMethod(DataColumnCollection columns)
        {
            CodeMemberMethod method = new CodeMemberMethod();

            return new CodeMemberMethod();
        }

        private CodeMemberMethod GenereateSaveMethod(DataColumnCollection columns)
        {
            return new CodeMemberMethod();
        }

        #endregion

        #region Support functions
        private bool GenerateDBPkg(string tableName)
        {
            string pkgName = string.Format("{0}$", tableName);
            
            List<OracleParameter> pkgHeaderOp = new List<OracleParameter>();
            pkgHeaderOp.Add(new OracleParameter("p_p", OracleDbType.Clob, ParameterDirection.ReturnValue));
            pkgHeaderOp.Add(new OracleParameter("p_table_name", OracleDbType.Varchar2, tableName, ParameterDirection.Input));
            pkgHeaderOp.Add(new OracleParameter("p_package_name", OracleDbType.Varchar2, pkgName, ParameterDirection.Input));

            string pkgHeader = (string)DBUtils.ExecuteNonQuery(CreatePackage, pkgHeaderOp, connection, CommandType.StoredProcedure, OracleDbType.Clob);

            List<OracleParameter> pkgBodyOp = new List<OracleParameter>();
            pkgBodyOp.Add(new OracleParameter("p_p", OracleDbType.Clob, ParameterDirection.ReturnValue));
            pkgBodyOp.Add(new OracleParameter("p_table_name", OracleDbType.Varchar2, tableName, ParameterDirection.Input));
            pkgBodyOp.Add(new OracleParameter("p_package_name", OracleDbType.Varchar2, pkgName, ParameterDirection.Input));

            string pkgBody = (string)DBUtils.ExecuteNonQuery(CreatePackageBody, pkgBodyOp, connection, CommandType.StoredProcedure, OracleDbType.Clob);


            if (pkgHeader != null && pkgBody != null)
            {
                bool result = true;

                result &= DBUtils.Execute(pkgHeader, null, CommandType.Text, connection);
                result &= DBUtils.Execute(pkgBody, null, CommandType.Text, connection);

                return result;
            }
            else
                return false;
        }

        private void LoadColumnsInfo(string tableName)
        {
            DatabaseLoader dl = new DatabaseLoader();
            Param tblParam = new Param("TABLE_NAME", tableName.ToUpper());
            Param refParam = new Param("REFERENCE", 0);
            IList<ColumnInfo> cols = dl.LoadAll<ColumnInfo>(new Param[] { tblParam }, connection);
            columnsInfo.Clear();
            bool hasPK = false;
            foreach (ColumnInfo ci in cols)
            {
                if (ci.Pk == 1)
                    hasPK = true;

                if (!columnsInfo.ContainsKey(ci.ColumnName))
                    columnsInfo.Add(ci.ColumnName, ci);
            }

            if (!hasPK)
                throw new Exception(string.Format("Table {0} is missing primary key", tableName));
        }

        public static string GetPrivateName(string name)
        {
            name = name.ToLower();

            if (name.IndexOf('_') == -1)
                return name;

            int i = 0;
            StringBuilder sb = new StringBuilder();
            while (i < name.Length)
            {
                if (name[i] == '_')
                {
                    sb.Append(name[i + 1].ToString().ToUpper());
                    i++;
                }
                else
                    sb.Append(name[i]);

                i++;
            }

            return sb.ToString();
        }

        public static string GetPublicName(string name)
        {
            name = GetPrivateName(name);
            char c = name[0];
            name = name.Remove(0, 1);
            name = c.ToString().ToUpper() + name;

            return name;
        }

        #endregion
    }
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -