数据库项目探索工具开发心得

在处理一个包含数百张表、视图和存储过程的数据库项目时,遇到了一个挑战:没有一个数据集在数据源中列出。所有的内连接等操作都在视图和存储过程中实现。由于使用的是MicrosoftSQL2000,不得不编写一个小应用程序来帮助理解这个项目和数据库。将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#还比较新,经常使用这个网站,并且愿意回馈一些东西。

沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485