惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

H
Hackread – Cybersecurity News, Data Breaches, AI and More
The Last Watchdog
The Last Watchdog
T
Threatpost
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
S
Security @ Cisco Blogs
S
Securelist
L
LINUX DO - 最新话题
The Hacker News
The Hacker News
S
SegmentFault 最新的问题
C
Cyber Attacks, Cyber Crime and Cyber Security
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
博客园_首页
博客园 - Franky
H
Heimdal Security Blog
G
Google Developers Blog
N
News and Events Feed by Topic
Cisco Talos Blog
Cisco Talos Blog
Engineering at Meta
Engineering at Meta
B
Blog RSS Feed
S
Schneier on Security
T
Threat Research - Cisco Blogs
D
DataBreaches.Net
Simon Willison's Weblog
Simon Willison's Weblog
Hacker News: Ask HN
Hacker News: Ask HN
WordPress大学
WordPress大学
Latest news
Latest news
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
博客园 - 聂微东
N
Netflix TechBlog - Medium
T
Tor Project blog
月光博客
月光博客
D
Docker
美团技术团队
Recent Announcements
Recent Announcements
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
Cyberwarzone
Cyberwarzone
小众软件
小众软件
TaoSecurity Blog
TaoSecurity Blog
Blog — PlanetScale
Blog — PlanetScale
L
LINUX DO - 热门话题
O
OpenAI News
人人都是产品经理
人人都是产品经理
www.infosecurity-magazine.com
www.infosecurity-magazine.com
V
V2EX
C
Cisco Blogs
NISL@THU
NISL@THU
Recent Commits to openclaw:main
Recent Commits to openclaw:main
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
酷 壳 – CoolShell
酷 壳 – CoolShell
博客园 - 司徒正美

博客园 - wljcan

用户中心 - 博客园 FMEFB开始上传 代码实现的事件响应 UIAlertView的使用方法 开始新的学习历程--ios开发 nod32 制作的手机电子书UMD文件编辑器 关于IOC 精彩的讨论《数据库时代的终结 》 Oracle开发中,关于查询的一个问题 使用NHibernate时需要考虑的另一个问题 关于crystal report和NHibernate应用的一个问题 使用NHibernate时,如何提高访问Oracle数据库(ODP.net)的性能 在Google 上搜书的方法 (转) - wljcan 一个NHibernate的好工具---Query Analyzer 北京公司招聘 .net开发人员 ArrayList中的排序 .net使用Com组件的问题 应用中的安全管理方案
在PowerDesigner中生成SQL脚本时,如何生成备注信息?
wljcan · 2005-03-08 · via 博客园 - wljcan

在留言中,听棠.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%,它是系统变量,无法配置。)