在线投票系统运行环境:VisualStudio2008和SQL2005功能分析(1)管理员的功能a.发布问题b.修改问题c.删除问题d.发布问题答案选项e.修改问题答案选项f.删除问题答案选项(2)普通用户的功能a.进行投票b.查看投票结果系统设计(1)框架设计a.发布问题功能是用来向管理员提供问题发布的接口,管理员使用该功能可以实现需要进行投票的问题的发布。相关属性设计如下图:管理员输入这些属性信息后,单击“添加选票”,完成问题的发布。b.发布完成投票的问题后,页面跳转到发布问题的列表中进行查看。在每行数据的最后三列是对该条数据操作的按钮,分别是:修改、删除和修改选项。①“修改”按钮用来实现对该条数据的修改。②“删除”按钮用来实现对该条数据的删除。③“修改选项”用来实现添加、修改或者删除与该问题相关的答案选项。c.管理员单击“修改”按钮,页面跳转到修改被选中问题属性的界面。在修改相关属性后,单击“更新”按钮来修改这些属性,或者单击“取消”按钮取消此次修改。d.管理员单击图中的“删除”按钮可以直接把该问题删除,但在删除问题的时候我们添加了一个提示窗口向用户作出提示以确认是否真的要删除,以避免因为误操作。e.在上图中单击“确认”按钮,说明要删除该问题,系统就会把该问题从数据库中删除,单击“取消”按钮则取消此次删除操作。f.管理员单击b图中的“修改选项”按钮则会打开选中的问题的答案进行操作的界面,如下图:g.在上图中,左边是选中的已经添加的可供选择的答案列表。用户可以通过“编辑”和“删除”按钮对相应数据进行操作。右边是一个文本框,通过它可以输入选中问题的答案,然后点击“添加”按钮添加该答案。h.用户可以通过投票功能界面对已经发布的问题进行投票。i.投票结束后,单击“查看结果”,显示结果如下。(2)数据库设计留言板的数据库包含如下几张表:①Admin数据表,用来存储管理员密码。②Vote数据表,用来存储发布的问题的信息。③Option数据表,用来存储问题的可供选择的答案的信息。(3)数据库接口程序设计为了更加方便的访问SQLServer数据库,我参考了资料书《ASP.NET网络编程技术与实践》一书,开发了一个名为DAL类空间来提供访问数据库的接口。DAL空间下包含以下几个类:①ConfigManager类,提供读取Web.config文件中数据库连接字符串的功能。实现代码:usingSystem;usingSystem.Configuration;namespaceDAL{///summary///获得.config中的数据库连接字符串////summarypublicclassConfigManager{privatestringdalConnectionString;///summary///获得连接字符串////summarypublicstringDALConnectionString{get{returndalConnectionString;}}publicConfigManager(){//通过配置类的AppSettings属性获取配置文件中数据库连接字符串并存储在ConnectionString中dalConnectionString=System.Configuration.ConfigurationSettings.AppSettings[ConnectionString];}}}②StoredProcedure类,封装数据库访问过程。实现代码:usingSystem;usingSystem.Data;usingSystem.Data.SqlClient;usingSystem.Diagnostics;namespaceDAL{///summary///封装访问数据库访问过程的类////summarysealedinternalclassStoredProcedure:IDisposable{publicstringErrorMessage=;//存储错误信息privateSystem.Data.SqlClient.SqlCommandcommand;//数据库的访问命令//执行SQL,命令的构造函数publicStoredProcedure(stringSqlText){ConfigManagerconfig=newConfigManager();command=newSqlCommand(SqlText,newSqlConnection(config.DALConnectionString));command.CommandType=CommandType.Text;command.Connection.Open();}publicStoredProcedure(stringsprocName,SqlParameter[]parameters){////TODO:在此处添加构造函数逻辑//ConfigManagerconfig=newConfigManager();command=newSqlCommand(sprocName,newSqlConnection(config.DALConnectionString));command.CommandType=CommandType.StoredProcedure;if(parameters!=null){foreach(SqlParameterparameterinparameters)command.Parameters.Add(parameter);}command.Connection.Open();}///summary///DisposeofthisStoredProcedure.////summarypublicvoidDispose(){if(command!=null){SqlConnectionconnection=command.Connection;Debug.Assert(connection!=null);command.Dispose();command=null;connection.Dispose();}}///summary///执行存储过程///returns返回一个整型/returns////summarypublicintRun(){if(command==null)thrownewObjectDisposedException(GetType().FullName);try{command.ExecuteNonQuery();return1;}catch(Exceptione){ErrorMessage=e.Message;return0;}}///summary///执行存储过程///returns返回一个整型/returns////summarypublicintRun(outintnum){if(command==null)thrownewObjectDisposedException(GetType().FullName);try{num=Convert.ToInt32(command.ExecuteScalar());return1;}catch(Exceptione){ErrorMessage=e.Message;num=0;return0;}}///summary///执行存储过程填充一个table.///paramname='dataTable'///DataTablefilledwiththeresultsofexecutingthestoredprocedure/param///returns///Int32valuereturnedbythestoredprocedure/returns////summarypublicintRun(DataTabledataTable){if(command==null)thrownewObjectDisposedException(GetType().FullName);try{SqlDataAdapterdataAdapter=newSqlDataAdapter();dataAdapter.SelectCommand=command;dataAdapter.Fill(dataTable);return1;}catch(Exceptione){ErrorMessage=e.Message;return0;}}}}③DAO类,执行数据库访问应用程序的基类。实现代码:usingSystem;usingSystem.Data;usingSystem.Data.SqlClient;namespaceDAL{///summary///DAO的摘要说明。////summarypublicclassDAO{internalStoredProceduresproc=null;}}④ExecuteSql类,提供执行SQL语句的方法。实现代码:usingSystem;usingSystem.Data;usingSystem.Data.SqlClient;usingSystem.Diagnostics;namespaceDAL{///summary///ExecuteSql的摘要说明。////summarypublicclassExecuteSql:DAO{publicstringErrorMessage=;publicintrun(stringsqlText){Debug.Assert(sproc==null);sproc=newStoredProcedure(sqlText);intflag=sproc.Run();this.ErrorMessage=sproc.ErrorMessage;sproc.Dispose();returnflag;}publicintrun(DataTabletable,stringsqlText){Debug.Assert(sproc==null);sproc=newStoredProcedure(sqlText);intflag=sproc.Run(table);this.ErrorMessage=sproc.ErrorMessage;sproc.Dispose();returnflag;}publicintrun(outintnum,stringsqlText){Debug.Assert(sproc==null);sproc=newStoredProcedure(sqlText);intflag=sproc.Run(outnum);this.ErrorMessage=sproc.ErrorMessage;sproc.Dispose();returnflag;}}}⑤ExecuteProcedure类,提供执行存储过程的方法。实现代码:usingSystem;usingSystem.Data;usingSystem.Data.SqlClient;usingSystem.Diagnostics;namespaceDAL{publicclassExecuteProcedure:DAO{publicstringErrorMessage=;publicintrun(stringsprocName,SqlParameter[]parameters){Debug.Assert(sproc==null);sproc=newStoredProcedure(sprocName,parameters);intflag=sproc.Run();this.ErrorMessage=sproc.ErrorMessage;sproc.Dispose();returnflag;}publicintrun(outintnum,stringsprocName,SqlParameter[]parameters){Debug.Assert(sproc==nul