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