解析大型数据库
一篇关于解析大型数据库的文章。
引言
我最近的任务是重写一个大型应用程序,该应用程序包含数百个表、视图和存储过程。在数据源中没有列出任何数据集。所有的内连接等都在视图和存储过程中。
我被迫编写了一个小型应用程序,帮助我解开项目和数据库的奥秘。(我无法让它与 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 日:初始版本