• 在PowerDesigner中生成SQL脚本时,如何生成备注信息?


    在留言中,听棠.net提到了一个问题: 在Powerdesigner中生成 SQL时如何生成相关备注信息? 这个问题以前也有很多朋友问过,现在在这里详细阐述一下。

    不同版本的PowerDesigner在不同的数据库模型中,生成Sql脚本的方式是不一样的。在PD6.5生成 Oracle脚本时,会自动根据模型中的Comment生成数据库中相关的注释,但是在9.0以上版本好象就比较麻烦。 而不论什么样版本的PD,都不能自动生成Sql server的注释。

    要想解决这个问题,也比较简单:直接利用Powerdesigner提供的OLE对象编程。 PD提供多种语言的开发例子,在Sybase\PowerDesigner 10\Ole Automation目录下,在这里就关键地方进行说明:

    1、利用OLE打开模型:
        private    StreamWriter SW;
        private PdCommon.Application pd;
        private     PdPDM.Model  model;

        private void cmdOpenModal_Click(object sender, System.EventArgs e)
            {
           
                pd = new PdCommon.Application();

                if (pd != null)
                {
                    // 打开一个模型
                    openFileDialog1.Title="选择模型文件";
                    openFileDialog1.Filter="模型文件(*.pdm)|*.pdm";
                    if (openFileDialog1.ShowDialog()==DialogResult.Cancel)
                    {
                        return;
                    }
               
                    string strFileName=openFileDialog1.FileName;
               
               
                    model = (PdPDM.Model)pd.OpenModel(strFileName,PdCommon.OpenModelFlags.omf_Default);
                    if (model == null)
                    {
               
                        MessageBox.Show("不能打开Powerdesigner模型!", "Powerdesigner", MessageBoxButtons.OK, MessageBoxIcon.Error);
                        return;
                   
                    }
                    foreach( Control c in  panel1.Controls            )
                       
                    {
                        c.Enabled=true;
                    }
                   
                }
                else
                {
                    MessageBox.Show("不能创建Powerdesigner应用,请检查是否安装或者Powerdeisnger是否注册。 可以可使用 命令注册该对象: pdshell10.exe /RegServer",
                        "Powerdesigner", MessageBoxButtons.OK, MessageBoxIcon.Error);
                }
            }

    2、生成备注的SQL脚本

           private void BuilderCommentSql()
            {
                openFileDialog1.Title="选择SQL文件文件";
                openFileDialog1.Filter="脚本文件(*.sql)|*.sql";
                openFileDialog1.CheckFileExists=false;
                openFileDialog1.ShowDialog();
                string strSqlFile=openFileDialog1.FileName;

           
                if (strSqlFile==null || strSqlFile=="") return;
                FileInfo FI=new FileInfo(strSqlFile);
           
                if (!FI.Exists)  //文件不存在
                {
                    SW=FI.CreateText();
                }
                else
                {
                    SW=new StreamWriter(strSqlFile,false,System.Text.Encoding.GetEncoding("GB2312"));
                }
           
                //DialogResult dr =MessageBox.Show("要删除已经有的描述吗》?");
                //处理包
                foreach (PdPDM.Package p in  model.Packages)
                {
                    ProcessPakageToMSSQL(p);
                }

           
                SW.Close();

                MessageBox.Show("成功生成备注文件");
               
           }
    3、核心处理函数 (SQL Server)
           private void ProcessPakageToMSSQL(PdPDM.Package pk)
            {
               
                //处理包
                foreach (PdPDM.Package p in pk.Packages)
                {
                    ProcessPakageToMSSQL(p);
                }

                foreach (PdPDM.Table table in pk.Tables)
                {
                       
                    foreach(PdPDM.Column cl in table.Columns)
                    {
                        string strWriteLine;
                        strWriteLine="exec sp_dropextendedproperty  N'MS_Description',"+
                             "N'user', N'dbo', N'table', N'"+ table.Code +"', " +
                            "N'column', N'" +cl.Code+"'";
                        SW.WriteLine(strWriteLine);
                        SW.WriteLine("go");
                        strWriteLine="exec sp_addextendedproperty N'MS_Description',"+
                            "N'"+cl.Name+"', N'user', N'dbo', N'table', N'"+ table.Code +"', " +
                            "N'column', N'" +cl.Code+"'";
     
                        SW.WriteLine(strWriteLine);
                        SW.WriteLine("go");
                   
                    }
                }
               
            }
      ///ORACLE
            private void ProcessPakageOracle(PdPDM.Package pk)
            {
               
              
                //处理包
                foreach (PdPDM.Package p in pk.Packages)
                {
                    ProcessPakageOracle(p);
                }

                foreach (PdPDM.Table table in pk.Tables)
                {
                    string strWriteLine;
                    strWriteLine="COMMENT ON TABLE "+table.Code+" IS '"+table.Comment+"';";
                    SW.WriteLine(strWriteLine);
                    foreach(PdPDM.Column cl in table.Columns)
                    {
                        strWriteLine="COMMENT ON COLUMN "+table.Code+"."+cl.Code+" IS '"+cl.Comment+"';";
                        SW.WriteLine(strWriteLine);
                   
                    }
                }
               
            }

        }

    以上的这种方案虽然能将问题解决,但不是很完美。以前在用PD生成NHibernate配置文件时,使用了PD OO模型中的Object Language, 可以非常方便地在PD中实现Preview功能 。 但是在DBMS模型中,开放的对象和支持的语法都比较少,不能实现这种需求(感兴趣的话可以看一下 %Tabldefn%,它是系统变量,无法配置。)



  • 相关阅读:
    杨辉三角
    100以内的素数
    九九
    MyDate
    计算器
    100以内素数
    杨辉三角形
    九九乘法表
    窗口关闭事件
    计算器界面
  • 原文地址:https://www.cnblogs.com/wljcan/p/115000.html
Copyright © 2020-2023  润新知