65.9K
CodeProject 正在变化。 阅读更多。
Home

解析大型数据库

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.92/5 (4投票s)

2009年10月20日

CPOL

3分钟阅读

viewsIcon

22608

downloadIcon

268

一篇关于解析大型数据库的文章。

引言

我最近的任务是重写一个大型应用程序,该应用程序包含数百个表、视图和存储过程。在数据源中没有列出任何数据集。所有的内连接等都在视图和存储过程中。

我被迫编写了一个小型应用程序,帮助我解开项目和数据库的奥秘。(我无法让它与 Microsoft SQL 2000 配合使用,这就是我正在使用的。我只是备份了 SQL 2000 的数据,并在 SQL 2005 中恢复它,以使该程序工作。)

这张图片是有意模糊的。如果你们看到了数据,我的雇主会不高兴的(我是一名承包商,这个程序是我的财产,而不是他们的)。但你们可以看到足够的内容来让我描述正在发生的事情。

左边的第一个数据网格是项目中所有表的列表。

左边的第二个数据网格列出了选定表(第一个数据网格)中的所有字段,显示字段名、数据类型和唯一性。通过单击列标题来排序列。这有很大的帮助,因为我可以对小数、整数等进行分组。(例如:如果我正在寻找与货币价值相关的每个字段,我可以只查看小数字段组。)

屏幕顶部是一个水平数据网格,其中包含选定数据库中的前四行。只查看一小部分最新数据有很大帮助。其中一些表包含数十万行,在 Visual Studio 中简单地查看最新的表数据是不可行的。

左边的第三个数据网格有两个用途。

“查找文件”按钮搜索项目中每个文件的文本,以查找选定的表名,并将结果填充到第三个数据网格中。我用它来查找访问选定表的其他窗体或文件。

当选中“自动查找文件”复选框时,程序会在选定的表更改时自动搜索,而无需按下“查找文件”按钮。

“仅 *.cs 文件”将搜索限制为 *.cs 文件。

“打印字段名称”打印第二个数据网格的字段名称和类型列。

“偏移量”值允许我并排打印最多三列的表字段,如下所示

我将每张纸穿过打印机两到三次。每次穿过打印机都会打印另一个表的字段,仅通过“偏移量”值向右偏移。这有助于我通过在纸上绘制线条来建立内连接等。“偏移量”会在每次打印时自动递增,为下一个表做好准备。这些打印输出的大部分将被粘贴到大型白板上。

“查找带文本的字段名称”搜索项目中每个表的每个字段名称的文本,以查找在文本框(按钮下方)中输入的文本,然后将结果填充到第三个数据网格中。示例:搜索“QuoteNum”将返回上面显示的两个表(我的项目中超过二十个表)。

当用户从第一个数据网格中选择一个表时,我调用此过程。

private void tablesDataGridView_RowEnter(object sender, DataGridViewCellEventArgs e)
{
    this.Cursor = Cursors.WaitCursor;
    DataSet DETAIL = new DataSet();
    ConnectionStringSettings cS = ConfigurationManager.ConnectionStrings[1];
    string connString = cS.ConnectionString;
    SqlConnection conn = new SqlConnection(connString);
    
    string table = tablesDataGridView.Rows[e.RowIndex].Cells[0].Value.ToString();
    string sqlstring = "SELECT * FROM " + table + " WHERE 1 = 0";   // dummy to 
							// just get column names
    
    DETAIL.Clear();
    conn.Open();
    SqlDataAdapter adapter = new SqlDataAdapter(sqlstring, conn);
    adapter.Fill(DETAIL);
    conn.Close();
    adapter.Dispose();
    conn.Dispose();
    
    DetaildataGridView.Columns.Clear();
    DetaildataGridView.Rows.Clear();
    DetaildataGridView.ColumnCount = 3;
    DetaildataGridView.RowCount = DETAIL.Tables[0].Columns.Count;
    DetaildataGridView.Columns[0].HeaderText = "Field Name";
    DetaildataGridView.Columns[1].HeaderText = "Type";
    DetaildataGridView.Columns[2].HeaderText = "Unique";
    
    for (int i = 0; i < DETAIL.Tables[0].Columns.Count; ++i)
    {
        DetaildataGridView.Rows[i].Cells[0].Value = 
			DETAIL.Tables[0].Columns[i].ColumnName.ToString();
        string type = DETAIL.Tables[0].Columns[i].DataType.ToString();
        DetaildataGridView.Rows[i].Cells[1].Value = 
		type.Substring(7, type.Length - 7); // get rid of "System" text
        DetaildataGridView.Rows[i].Cells[2].Value = 
		DETAIL.Tables[0].Columns[i].Unique.ToString();
    }
    DetaildataGridView.Width = DetaildataGridView.Columns[0].Width + 
	DetaildataGridView.Columns[1].Width + DetaildataGridView.Columns[2].Width + 21;
    
    DETAIL.Dispose();
    
    getSamples(table, DetaildataGridView.Rows[0].Cells[0].Value.ToString());
    
    this.Cursor = Cursors.Default;
}

这就是我填写顶部水平数据网格的地方

private void ListDirectoriesAndFiles(FileSystemInfo[] FSInfo, string SearchString)
{
    string tablelook = tablesDataGridView.SelectedCells[0].Value.ToString();
    foreach (FileSystemInfo i in FSInfo)
    {
        if (i is DirectoryInfo)    // Check to see if this is a DirectoryInfo object.
        {
            DirectoryInfo dInfo = (DirectoryInfo)i;  	// Iterate through all 
						// sub-directories.
            ListDirectoriesAndFiles(dInfo.GetFileSystemInfos(SearchString), SearchString);
        }
        else if (i is FileInfo)   // Check to see if this is a FileInfo object.
        {
            if (OnlyCSfilescheckBox.Checked && i.Name.Contains(".cs") == false) continue;
            string totalpath = i.FullName;
            StreamReader rdr = new StreamReader(i.FullName);
            string line;
            while ((line = rdr.ReadLine()) != null)
            {
                if (line.Contains(tablelook))
                {
                    CSfilesdataGridView.Rows[rowcounter++].Cells[0].Value = i.Name;
                    break;
                }
            }
            rdr.Dispose();
        }
    }
}

我只是为我自己的利益而把它拼凑起来。代码不是为了供其他人使用。但我认为它对有类似问题的人可能有用。我刚开始接触 Visual Studio 和 C#,经常使用这个网站,并想回馈一些东西。

我想通过一种方法来搜索视图和存储过程来改进这一点,但我还没有找到解决办法。如果有人知道方法,请在此处发布。

历史

  • 2009 年 10 月 18 日:初始版本
© . All rights reserved.