DataBaseInfo.cs
本代碼生成器包括了 DataBaseInfo.cs文件,其中就是比較底層的描述數據庫表結構和字段設計信息的對象。這個 文件中定義了多個類型,其中DataBaseInfo表示一個數據庫,TableInfo表示數據表設計信息 可,FIEldInfo表示數據庫字段設計信息。這三個類型構成了一個數據庫-數據表-字段的三層 對象樹狀結構。TableInfo和FIEldInfo的代碼不復雜。現在說一下DataBaseInfo類型中的一 些代碼。
首先看看LoadFromPDMXMLFile和LoadFromPDMXMLDocument函數,這個函數能 分析PDM格式的XML文檔,找出其中的數據表和字段設計信息並填充到內部結構中。某些版本 的PowerDesigner生成的PDM文件是XML格式的,這方便其他程序能加載其中的數據結構設計信 息。關於這個函數詳細的處理過程,大家可以參考一個PDM的文件仔細分析。
/// <summary>
/// 從PDM數據結構定義XML文件中加載數據結構 信息
/// </summary>
/// <param name="doc">XML文檔 對象</param>
/// <returns>加載的字段信息個數</returns>
public int LoadFromPDMXMLDocument( XMLDocument doc )
{
intFillStyle = FillStyleConst.PDM ;
int RecordCount = 0 ;
myTables.Clear();
XmlNamespaceManager nsm = new XMLNamespaceManager( doc.NameTable );
nsm.AddNamespace( "a" , "attribute" );
nsm.AddNamespace( "c" , "collection" );
nsm.AddNamespace( "o" , "object");
XMLNode RootNode = doc.SelectSingleNode("/Model/o:RootObject/c:Children/o:Model" , nsm );
if( RootNode == null )
return 0 ;
strName = ReadXMLValue( RootNode , "a:Name" , nsm );
strDescription = strName ;
// 數據表
foreach( XMLNode TableNode in RootNode.SelectNodes("c:Tables/o:Table" , nsm ))
{
TableInfo table = new TableInfo();
myTables.Add( table );
table.Name = ReadXMLValue( TableNode , "a:Code" , nsm );
table.Remark = ReadXMLValue( TableNode , "a:Name" , nsm );
string keyid = ReadXMLValue( TableNode , "c:PrimaryKey/o:Key/@Ref" , nsm );
System.Collections.Specialized.StringCollection Keys =
new System.Collections.Specialized.StringCollection();
if( keyid != null )
{
foreach( XMLNode KeyNode in TableNode.SelectNodes(
"c:Keys/o:Key[@Id = '" + keyid + "']/c:Key.Columns/o:Column/@Ref" , nsm ))
{
Keys.Add( KeyNode.Value );
}
}
foreach( XMLNode FIEldNode in TableNode.SelectNodes ("c:Columns/o:Column" , nsm ))
{
RecordCount ++ ;
string id = ( ( XMLElement ) FIEldNode).GetAttribute("Id");
FieldInfo field = new FIEldInfo();
table.Fields.Add( fIEld );
fIEld.Name = ReadXMLValue( FIEldNode , "a:Code" , nsm );
fIEld.Remark = ReadXMLValue( FIEldNode , "a:Name" , nsm );
fIEld.Description = ReadXMLValue( FIEldNode , "a:Comment" , nsm );
string FIEldType = ReadXMLValue( FIEldNode , "a:DataType" , nsm );
if( FIEldType != null )
{
int index = FIEldType.IndexOf("(");
if( index > 0 )
FieldType = FIEldType.Substring( 0 , index );
}
field.FieldType = FIEldType ;
field.FIEldWidth = ReadXMLValue( FIEldNode , "a:Length" , nsm );
if( Keys.Contains( id ))
fIEld.PrimaryKey = true;
}
}
return RecordCount ;
}
private string ReadXMLValue(
System.Xml.XMLNode node ,
string path ,
System.Xml.XMLNamespaceManager nsm )
{
System.Xml.XMLNode node2 = node.SelectSingleNode( path , nsm );
if( node2 == null )
return null ;
else
{
if( node2 is System.Xml.XMLElement )
return ( ( System.Xml.XMLElement ) node2).InnerText ;
else
return node2.Value ;
}
}