您的位置:首页 > 数据库

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

2005-03-08 15:04 609 查看
在留言中,听棠.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%,它是系统变量,无法配置。)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: