AdventureWorks数据库数据字典研究
在研究SQL SERVER 2005自带的数据库AdventureWorks遇到一个问题,表大概有70多个,关系不明确,字段都是英文,学习起来很吃力。
于是,想把数据的结构和表与表之间的关系弄出来。这样,想到了用Rational Rose的逆向工程来做。完成后打印成PDF文件后可以大致看清部分逻辑关系。下面就是生成的PDF文件:
OLTP事例数据库
DW数据仓库示例
后来在MSDN上找到了该数据库的数据字典的网址:
http://msdn2.microsoft.com/zh-cn/library/ms124438.aspx
由于MSDN的一个页面只显示一个表的结构,于是又想到是不是能将这些表的字段说明整理到一个页面或一个word文档里,便于阅读。利用.NET里面的System.Net实现读取相应的html文件,并提取表格列表部分的html,最后生成一个html文件。
核心程序如下:
public void GetHtmlData(string UrlIDs)
{
System.Text.StringBuilder sb = new System.Text.StringBuilder();
string prefix = "http://msdn2.microsoft.com/zh-cn/library/ms";
string postfix = ".aspx";
string url = "";
string html = "";
string tablename = "";
string discription = "";
string content = "";
DataTable dt = new DataTable();
dt.Columns.Add("序号");
dt.Columns.Add("ID");
dt.Columns.Add("表名");
dt.Columns.Add("表的说明");
dt.Columns.Add("表的内容");
try
{
// 得到Html
if (UrlIDs != "")
{
//得到ID的数组
string[] ids = UrlIDs.Split(new char[] {','});
if (ids.Length > 0)
{
// 循环得到数据
for (int i = 1; i < ids.Length + 1; i ++)
{
url = prefix + ids[i-1] + postfix;
System.Net.HttpWebRequest request = (System.Net.HttpWebRequest) System.Net.WebRequest.Create(url);
System.Net.HttpWebResponse response = (System.Net.HttpWebResponse) request.GetResponse();
System.IO.StreamReader stream = new System.IO.StreamReader(response.GetResponseStream(), System.Text.Encoding.GetEncoding("utf-8"));
html = stream.ReadToEnd().Trim();
html = html.Replace("\r","");
html = html.Replace("\n","");
if (html.Length > 0)
{
html = html.Substring(html.IndexOf("<div class=\"majorTitle\" >SQL Server 2005 联机丛书") + 45,html.Length - html.IndexOf("<div class=\"majorTitle\" >SQL Server 2005 联机丛书") - 45);
tablename = html.Substring(html.IndexOf("</div><div class=\"title\" >") + 26, html.IndexOf("表 (AdventureWorks)") - html.IndexOf("</div><div class=\"title\" >") - 8);
discription = html.Substring(html.IndexOf("<span id=\"changeHistory\"> </span> <p>") + 38,html.IndexOf("</p> <div class=\"MTPS_CollapsibleRegion\">") - html.IndexOf("<span id=\"changeHistory\"> </span> <p>") -38);
html = html.Substring(html.IndexOf("<h3 class=\"subHeading\"><!----></h3>"),html.Length - html.IndexOf("<h3 class=\"subHeading\"><!----></h3>") - 35);
content = html.Substring(html.IndexOf("<table"),html.IndexOf("</table>") - html.IndexOf("<table") + 8);
DataRow dr = dt.NewRow();
dr[0] = i.ToString();
dr[1] = ids[i-1];
dr[2] = tablename;
dr[3] = discription;
dr[4] = content;
dt.Rows.Add(dr);
this.statusBar1.Text = "正在获取第" + i.ToString() + "条数据……";
this.dataGrid1.DataSource = dt.DefaultView;
}
}
}
}
if (dt.Rows.Count > 0)
{
StreamWriter sw = new StreamWriter("C:\\tables.html",false,System.Text.Encoding.GetEncoding("GB2312"));
sw.Write("<html><head><title>AdventureWorks数据字典</title></head>");
sw.Write("<br><br>");
sw.Write("<body>");
sw.WriteLine();
for (int k = 0; k < dt.Rows.Count; k ++)
{
sw.Write(dt.Rows[k][2].ToString() + ":" + dt.Rows[k][3].ToString() + "<br>" + dt.Rows[k][4].ToString());
sw.Write("<br><br>");
}
sw.Write("</body></html>");
sw.Close();
}
}
catch(IOException ex)
{
Console.Write(ex.ToString());
}
if (dt.Rows.Count > 0)
{
this.statusBar1.Text = "成功获取" + dt.Rows.Count.ToString() + "条数据!";
}
else
{
this.statusBar1.Text = "没有获取任何数据,请确认ID是否正确!";
}
}
填写ID列表后即可得到数据字典。