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列表后即可得到数据字典。

posted @ 2007-06-05 14:38  bobomouse  阅读(1525)  评论(1编辑  收藏  举报