《电子技术应用》
您所在的位置:首页 > 通信与网络 > 设计应用 > 基于C#的数据库表结构报表系统的设计与实现
基于C#的数据库表结构报表系统的设计与实现
来源:微型机与应用2013年第21期
欧 微,程 岚,陈圣荣
(乌鲁木齐民族干部学院,新疆 乌鲁木齐 830002)
摘要: 为便于团队交流与系统维护,在对表的设计结构修改后,应及时更新项目技术文档。为克服现有方法存在的不足,在Visual Studio 2010环境下,基于C#编程语言,开发了一个针对SQL Server数据库表结构的报表生成系统。该系统支持单表导出和批量导出两种工作模式,支持将表结构导出到Word和Excel两种应用接口,具有操作简单、使用灵活和功能完善的优点,对提高团队开发效率和技术文档的规范性具有一定的应用价值。
Abstract:
Key words :

摘  要: 为便于团队交流与系统维护,在对表的设计结构修改后,应及时更新项目技术文档。为克服现有方法存在的不足,在Visual Studio 2010环境下,基于C#编程语言,开发了一个针对SQL Server数据库表结构的报表生成系统。该系统支持单表导出和批量导出两种工作模式,支持将表结构导出到Word和Excel两种应用接口,具有操作简单、使用灵活和功能完善的优点,对提高团队开发效率和技术文档的规范性具有一定的应用价值。
关键词: SQL Server数据库;表设计结构;报表生成

 数据库结构设计主要包括需求分析、概念结构、逻辑结构和物理结构设计等多个阶段,是一个反复探索、逐步求精的过程[1-2]。优化存储结构、提高查询效率,确保数据的准确性、一致性与完整性,在数据库结构设计时,需频繁地对表结构进行论证、修订和优化[3-4]。为方便团队交流与系统维护,表的逻辑结构说明是数据库项目技术文档不可或缺的内容,因此在对表的设计结构修改后,应及时更新表设计结构的说明文档,其实现方法通常有两种:一是借助数据库设计工具(Rose、Power Designer等)导出设计结构报表,该方法集成度高且生成技术文档相对规范,但在进入编码开发阶段后,再对表的逻辑结构修订完善,往往只需对个别表设计结构的小幅变更,由于模板定制复杂且流程性过强,该方法的适用性与灵活性受到局限。二是在表结构修改后,采用手工修订的方法调整开发文档中的相应内容,该方法灵活性高,但工作繁琐,且难以确保对表结构描述的一致性[5-6]。
 本文在Visual Studio 2010开发环境下,利用C#编程语言,针对SQL Server数据库环境,开发了一个针对数据库表结构的报表生成系统。该系统支持两种工作模式:即单表模式和批量模式。顾名思义,在单表模式下,用户通过一次操作可导出某个指定表格的设计结构;在批量模式下,系统支持一次导出数据库中的全部或多个表格的结构属性。同时,系统提供了相应接口,用户可根据需要将相应数据导出到Word或Excel文档中。限于篇幅,本文主要通过单表工作模式,介绍该系统的功能结构、实现方法及工作流程。
1 系统实现
 系统的用户主界面如图1所示,该系统主要包括数据库连接模块、属性选择模块、设计结构输出模块、数据导出模块等4部分。

1.1 数据库连接模块
 数据库连接模块用于与数据库建立连接,读取并输出数据中包含的所有表的名称。其中实现过程可描述为:(1)根据用户输入的服务器地址、数据库名称、用户名及密码,验证其是否正确,确保连接成功;(2)在连接成功后,读取数据中所包含的表,当操作模式批量导出时,输出到CheckedListBox复选列表框;当操作模式为单表导出时,输出到下拉列表,其关键代码下:
cShowTableStructure sts=new cShowTableStructure();
sts.connStr=String.Format("server={0};database={1};
uid={2};pwd={3}",
serverName,dBaseName,userId,userPwd);//连接字符串
sts.sqlStr=String.Format("select*from+{0}.dbo.sysobjects
 where xtype=′U′
order by name asc",dBaseName);//查询语句
DataTable dtable=sts.mReadTableInfors();
//读取数据库中的表名,返回一个DataTable
if(dtable =null)
{
   MessageBox.Show("连接成功,请选择表格!");
   //将表格名称添加为下拉列表的Items
   for(int i=0;i<=dtable.Rows.Count-1;i++)
   {
      string tName=dtable.Rows[i][0].ToString();
      cmb_TableName.Items.Add(tName);
      cmb_TableName.SelectedIndex=0;
    }
   btnChooseTable.Enabled=true;//允许用户提交选择项
 }
else{……}
1.2 属性选择模块
 在用户建立表的过程中,数据库管理系统将保存表设计结构的信息,包括字段名、数据类型、长度、默认值及字段说明等。为方便用户进行选择,通过类型为CheckBox的数组ckBoxs,呈现在表设计的常用属性,供用户选择。其中,序号与字段名为必选项,其他信息用户根据需要进行选择,默认为全选。通过条件选择语句对SQL查询语句的组合,实现对用户所关心属性的选择性输出,其关键代码如下:
//根据用户选择的属性,控制SQL查询的输出字段
string sqlstr="Select";
if(ckBoxs[0].Checked){sqlstr+="a.colorder N′序号′,";}
if(ckBoxs[1].Checked){sqlstr+="a.name N′字段名′,";}
if(ckBoxs[2].Checked){sqlstr+="(case when
COLUMNPROPERTY(a.id,a.name,
′IsIdentity′)=1 then′√¨?′else′′end)N′是否标识′,";}
…… ……
if(ckBoxs[9].Checked){sqlstr+="isnull(e.text,′′)N′默认值′,";}
if(ckBoxs[10].Checked){sqlstr+="isnull(g.[value],′′)AS N′字段说明′,";}
//去掉语句最后一个逗号,保证查询语句的正确性
sqlstr=sqlstr.Remove(sqlstr.LastIndexOf(′,′),1);
1.3 表结构输出模块
 属性选择模块实现对输出字段与查询条件的控制,生成了相应的SQL查询语句。表设计结构输出模块的任务是利用已有的查询语句,访问数据库并读取表设计信息,然后输出到用户界面,其关键代码如下:
cShowTableStructure sts=new cShowTableStructure()
{sqlStr=sqlstr,connStr=connstr};
DataTable dtable=new DataTable();
dtable=sts.mReadTableInfors();
if(dtable!=null)
{
   dgv_TableStructure.DataSource=dtable;
   for(int i=1;i<=dgv_TableStructure.Columns.Count-1;
i++)
   {dgv_TableStructure.Columns[i].Width=80;}
//设置DataGridView列宽
}
 其中,SQL查询语句sqlstr由属性选择模块生成,连接字符串connstr与数据库连接模块一致。因此,该模块的运行流程可描述为:(1)通过实例化cShowTableStructure类,新建一个sts对象,设置连接字符串与查询语句;(2)调用mReadTableInfors方法,读取表结构信息,以DataTable格式返回查询结果;(3)将查询结果作为DataGridView控件的数据源,输出到用户界面。
1.4 数据导出模块
 通过表设计结构输出模块,可以方便地获取相应表所包含的字段及其属性,为了实现数据设计与文档整理的同步,需要将DataGridView控件中的信息导出到Excel或word文档中,以便开发编写开发文档和团队交流时使用。系统提供了两种应用接口,用户可根据需要将表结构输出到Excel或word文档。限于篇幅,本文仅介绍将表结构导出到Excel文档的实现方法,其关键代码如下:
//新建一个Excel应用,设置属性与文档名
Excel.Application texcel=new Excel.Application();
texcel.Application.Workbooks.Add(true);
texcel.Visible=isShowExcel;
texcel.SaveWorkspace(TableName+"表的结构");
int co_count=dgv_TableStructure.Columns.Count;
int row_count=dgv_TableStructure.Rows.Count;
//第一行合并单元格,输出表名
string Title_End=endChar+"1";
texcel.Cells.get_Range("A1",Title_End).MergeCells=true;
texcel.Cells[1,1]=TableName+"表的设计结构";
//第二行输出相应的字段名
for(int i=0;i<=co_count-1;i++)
{texcel.Cells[2,i+1]=dgv_TableStructure.Columns[i].
HeaderText;}
//从第三行开始,输出表的结构信息
for(int i=0;i<row_count-1;i++){
   for(int j=0;j<=co_count-1;j++){
     if(dgv_TableStructure[j,i].ValueType==typeof
(string))
      texcel.Cells[i+3,j+1]=""+dgv_TableStructure[j,i].
Value;
     else
      texcel.Cells[i+3,j+1]=dgv_TableStructure[j,i].
Value.ToString();
    }
}
//设置Excel有效数据区域的格式
char endChar=Convert.ToChar(′A′+co_count-1);
 …… ……
content_range.Borders.LineStyle=BorderStyle.FixedSingle;
 因此,该模块的工作流程可描述为:(1)新建一个Excel应用,设置相关属性;(2)计算输出到有效数据的行、列数,在第一行输出表名称;(3)将DataGridView控件表头文本作为字段名,输出到第二行;(4)从第三行开始,逐单元格输出对应信息;(4)选择Excel中的数据区域,设置其边框、字体等格式样式。
1.5 关键类cShowTableStructure实现

 


 在1.1节数据库连接模块与1.3节表设计结构输出模块中,都用到了一个名为cShowTableStructure的类,该类的主要功能是实现对数据库的查询,并将查询结果通过一个DataTable返回。cShowTableStructure类封装了两个属性(SQL查询语句sqlStr与连接字符串connStr)及一个方法mReadTableInfors,mReadTableInfors的关键代码如下:
SqlConnection conn=new SqlConnection(connstr);
SqlCommand cmd=new SqlCommand(sqlstr,conn);
DataTable dtable=new DataTable();
SqlDataAdapter sda=new SqlDataAdapter();
try
{   conn.Open();
    sda=new SqlDataAdapter(cmd);
    sda.Fill(dtable);
}
catch(Exception x)
{  ……      //异常处理}
Finally
{  ……      //资源释放}
return dtable;
2 业务流程图
 系统的业务流程如图2所示,该流程可描述为:(1)选择操作模式(单表导出或批量导出);(2)用户输入数据库服务器地址(名称)、数据库名、用户名和密码;(3)系统验证数据库所提交信息的正确性,若通过验证,则转第(4)步,否则转第(2)步;(4)读取数据库包含的所有表格,将表名输出到用户界面,用户选择并提交所选表格;(5)选择对所选表需查看、输出的结构属性;(6)提交查询,在用户界面显示查询结果;(7)选择导出方式,将表的设计结构导出到Word或Excel文档。

 数据库设计是项目开发的一项重要内容,在数据库设计阶段,开发团队需就其表结构反复地进行论证、修订与完善;进入编码阶段后,尽管不鼓励对数据库结构再进行修改,但小幅度的调整与优化往往难以杜绝。为方便团队协作与后期维护,在对数据库结构调整后,及时更新项目开发文档显得尤为重要。但在对数据库结构改动后,手工调整或借助第三方工具重新生成说明文档,工作繁复且难以确保对表结构描述的一致性。针对这一需求,本文开发了一个数据库表结构自动导出系统,以方便用户根据需要导出表的结构信息,具有小巧便捷、操作简单的优点,将其作为团队开发的辅助工具,能较大幅度提高工作效率。
参考文献
[1] 何玉洁.数据库原理与实践教程[M].北京:清华大学出版社,2010.
[2] 王征,吕雷.SQL Server 2008中文版数据库基础与实践教程[M].北京:电子工业出版社,2009.
[3] 李伟.数据完整性在数据库应用系统的设计与实施[J].煤炭技术,2011,30(3):167-168.
[4] 朱晓辉,王杰华,石振国,等..NET下基于PowerDesigner和CodeSmith的软件自动化开发技术[J].计算机科学,2010,37(7):156-160.
[5] 谢星星,沈懿卓.UML基础与Rose建模实用教程[M].北京:清华大学出版社,2008.
[6] 张庆辉,邵易峰.基于Power Designer的通信装备数据库设计实现[J].舰船电子工程,2012(2):68-70.

此内容为AET网站原创,未经授权禁止转载。