论文部分内容阅读
摘要:为了能在原有的办公系统中,当办公事务到来时能及时提醒办公人员,应用C#.NET技术﹑数据库技术和邮件服务系统,提出了用来实现此功能的事务提醒模块的设计思想和实现方法。该事务提醒模块对节省时间,提高办公效率既有重要的使用价值。
关键词:C#.NET;SQL Server;Imail邮件服务系统;Windows服务
中图分类号:TP319文献标识码:A文章编号:1009-3044(2007)18-31648-02
The Design and Implement of Affair Alert Module Based on .NET
WANG Chuan,SUN Bin
(Faculty of Information Engineering,China University of Geosciences,WuHan 430074,China)
Abstract:In order to alert office staff immediately when office affairs coming in an old office system, applying C#.NET﹑database technology and mail service system, it presents the design idea and implement means of an Affair Alert Module which implies this function.
Key words:C#.NET;SQL Server;Imail Server system;Windows Service
1 引言
在原有的网络办公系统中,由于办公人员不可能一直登录办公系统去查询最新的事务信息,而新的事务请求可能会随时出现,这样有可能一些紧急事务得不到及时处理。若是在新的事务出现时能及时通知给办公人员,就可以弥补这个不足。可以在服务器加入一个事务提醒模块来实现这个通知的功能,该模块工作原理是:它每隔一段时间自动查询办公系统数据库,对办公系统数据库的事务工作流进行分析,从中获取新事务的详细信息,然后把这些信息用邮件发送到相关办公人员的邮箱中。办公人员可以在繁忙时,只需要打开邮件接收客户端,将其设置为定时自动收信,并使用新邮件到来时的语音提示,便可及时处理新的事务,提高办公效率。若办公人员出差在外,也可以通过查看邮件去了解事务的详细信息,为远程处理事务提供了有力的支持。
2 事务提醒模块的功能结构设计
如果将事务提醒模块设计为运行在服务器的Windows服务应用程序(Windows服务应用程序的特点是,它们会随系统启动时自动启动,可以长时间运行,可以暂停和重新启动,而且不显示任何用户界面),就可以不必对原有的办公软件做改动,只需要对数据库的结构加入一些字段就可以了,从而大大地减轻软件开发任务的负担和复杂度。
事务提醒模块由三个子模块组成:(1)账户同步子模块;(2)信息收集子模块;(3)邮件发送子模块。下面将对这三个子模块的功能进行详细分析:
2.1账户同步子模块
如果要将事务信息发送邮件给办公人员,那么需要给每个办公人员一个办公用的邮箱账号,可以使用Imail邮件系统为办公人员提供邮件服务。在安装Imail邮件系统后,会提示需要指定Imail邮件系统的用户表的存放位置。为方便对用户表进行操作,我们将用户表设置为存放至外部数据库SQL Server 2005中。Imail邮件系统本身并没有提供比较方便的用户帐号远程管理程序,而办公系统数据库的用户表是可以远程管理的,完全可以将办公数据库的用户名和密码自动拷贝为该办公人员在邮件系统中用户名和密码。如果能将办公系统数据库的用户表中的用户名和密码和Imail邮件系统的用户表中的用户名和密码能够始终保持一致,那么就可以自动地对Imail邮件系统的用户进行管理,这样也完全符合我们的需要。
账户同步子模块的功能是:对比办公数据库的用户表和Imail邮件系统用户表的用户名和密码,如果办公数据库的用户表中新加入了用户,它将这些新建用户记录的用户名和密码自动地复制到邮件系统的用户表的新记录中;如果办公数据库中删除了用户记录,它将这些用户对应地邮件帐户删除;如果办公数据库的用户表中某些用户更改了用户密码,它将邮件系统中这些用户的密码改得与办公系统数据库的用户密码一致。
2.2信息收集子模块
办公系统的每一个事务都会分阶段完成,事务在它的每个阶段都有不同的处理任务。在办公数据库中有一个事务工作流表,就是用来记录事务在每个阶段的处理任务。事务工作流表以工作流号和阶段号为关键字段,其中,工作流号字段表示一个事务的编号,通过它可以在办公数据库中查询出事务的内容信息;而阶段号表示事务的处理阶段编号,事务的处理任务按阶段进行编号。为了便于发送邮件,可以在办公数据库中建立一个邮件队列表,用来存放发送邮件所需要的全部信息。信息收集子模块用来完成这些信息的收集整理工作,并把这些信息存放包邮件队列表中。在事务工作流表中加入一个标志字段Queue_Flag,用来标志该事务处理阶段的完整信息是否已加入到邮件队列表中。
信息收集子模块的功能就是:在事务工作流表中,对每条记录的标志字段Queue_Flag判断,对于没有加入到邮件队列表中的事务处理任务,根据任务的记录信息,在办公数据库中查询并整理出发信人的邮箱﹑收信人的邮箱﹑信件标题﹑信件内容正文等信息,然后将这些信息写入到邮件队列表的对应字段中。最后更改事务工作流表的标志字段Queue_Flag的值,表示已经将该事务处理任务加入了邮件队列表。
2.3邮件发送子模块
邮件发送子模块就是用来将邮件队列表中的记录以邮件发送的子模块。为了便于判断邮件队列表中的记录是否已经用邮件发送,需要为邮件队列表加一个标志字段Send_Flag,用来标志该条记录是否已被发送。
邮件发送子模块的功能是:对邮件队列表中的记录的标志字段Send_Flag进行判断,对没有用邮件发送出去的记录,用邮件发送出去。最后改变标志字段Send_Flag的值,表示该条事务处理任务已经被发送给相应的办公人员邮箱,完成了事务提醒模块的提醒任务。
2.4事务提醒模块功能结构图
事务提醒模块由前述所说的三个子模块组成,它每隔一定的时间,会自动地将这三个子模块依次执行一次。只有保持邮件帐号存在并且真实的情况下,给此人发送邮件提醒才有意义,因而帐户同步子模块要最先运行。然后就是收集需要提醒的事务信息,用邮件发送出去,因而信息收集子模块随后执行,最后执行邮件发送子模块。这个执行顺序不可以颠倒,否则会出问题。
事务提醒模块功能结构图如下:
3 实现事务提醒模块的技术点
3.1通过ADO.NET访问SQL Server 2005
用ADO.NET访问数据库分为如下几个步骤,首先用类SqlConnection打开数据库连接,然后用类SqlCommand执行SQL语句访问数据库,用类SqlDataReader读取SQL语句的执行结果然后关闭类SqlDataReader,最后关闭数据库连接。现以帐户同步子模块中读取办公数据库用户表的源代码为例来说明如何访问数据库,该代码的功能是读出用户表的用户名和密码。
string source = @"server=(local);" + "integrated security=SSPI;" + "database=办公数据库";
SqlConnection conn = new SqlConnection(source);
conn.Open();
string sele = @"SELECT TOP 1 用户名,密码 FROM 办公数据库.用户表";
SqlCommand cmd = new SqlCommand(sele, conn);
SqlDataReader read = cmd.ExecuteReader();
read.Read();
string username = read[0].ToString().Trim();
string password = read[1].ToString().Trim();
read.Close();
conn.Close();
3.2用System.Net.Mail发送邮件
C#发送电子邮件需要使用.net 2.0中新的命名空间System.Net.Mail中的类MailMessage和类SmtpClient。在类MailMessage的属性中存放发信人邮箱,收信人邮箱、信件标题、信件内容正文,然后用类SmtpClient发送的电子邮件。源代码中变量sender传递的是发信人的邮箱,变量receiver传递的是收信人的邮箱,变量subject传递的是信件标题,变量body传递的是信件内容正文,变量password传递的是发信人的邮箱密码,这些变量全部都可以从邮件队列表的相应字段中直接读取。
MailMessage mail = new MailMessage(sender, receiver);
mail.Subject = subject;
mail.Body = body;
mail.BodyEncoding = System.Text.Encoding.GetEncoding("GB2312");
mail.SubjectEncoding = System.Text.Encoding.GetEncoding("GB2312");
mail.IsBodyHtml = true;
SmtpClient smtp = new SmtpClient(smtpserver);
smtp.Credentials = new NetworkCredential(sender, password);
smtp.Send(mail);
3.3创建Windows服务应用程序
事务提醒模块做成Windows服务应用程序分为以下四个步骤:
(1)在从Visual C# 工程中选取Windows Services选项,给工程一个新文件名AlertService,然后点击确定,这时工程中自动生成了一个服务类AlertService。在该类中OnStart方法里添加语句,AlertServer abc = new AlertServer()。
(2)在该工程中新建一个AlertServer类,然后将事务提醒模块的三个子模块的实现代码放入到该类中。打开AlertServer类的设计视图,然后在工具箱中用鼠标拖过来一个Timer组件。双击Timer组件的图标,在AlertServer的Ontimer事件代码中加入三个子模块的方法,让它们在OnTimer事件出现时都按顺序执行一次。通过设置Timer组件的Interval属性来决定了事务提醒模块隔多久运行一次。
(3)在工程的解决方案资源管理器中,打开AlertService的设计视图,在设计视图窗口中,在鼠标右键弹出菜单中单击添加安装程序,这时项目中就添加了一个新类ProjectInstaller和两个安装组件ServiceProcessInstaller和 ServiceInstaller。单击ServiceInstaller组件并将它的 StartType属性设置为Automatic。这样每次计算机重新启动时,事务提醒模块都会自动启动。
(4)通过Visual Studio的生成菜单中选择生成来生成项目后,在已编译可执行文件所在的目录中,可以看到名为AlertService.exe的可执行文件。在Visual Studio的命令提示下,进入AlertService.exe所在的目录,使用.NET的服务安装工具InstallUtil.exe来安装服务,在命令行中输入下列代码 InstallUtil AlertService.exe 。同样的,卸载服务的操作是,在命令行中输入下列代码 InstallUtil /u AlertService.exe 。
安装好服务后,就可以通过运行“控制面板->管理工具->服务控制台程序”来启动或停止事务提醒模块了。
4 结束语
该事务提醒模块已经在原办公系统的服务器安装使用,经过一定时间的测试运行,运行状态良好。通过把事务提醒模块加入办公系统中实现了事务的及时提醒功能,可节省时间,显著地提高工作效率。随着3G时代的到来,手机上网业务迅猛发展,用手机收发邮件也将会普及,办公人员在出门在外时也可以通过手机得到事务的提醒信息。因而事务提醒模块在办公系统中确实很有应用价值。
参考文献:
[1]Christian Nagel,Bill Evjen,Jay Glynn.李敏波.译.C#高级编程(第3版)[M].北京:清华大学出版社,2006.
[2]Karli Watson,Christian Nagel.C#入门经典(第4版)[M].北京:清华大学出版社,2006.
[3]System.Net.Mail 命名空间[EB/OL]. ms-help://MS.MSDNQTR.v80.chs/MS.MSDN.v80/MS.NETDEVFX.v20.chs/cpref10/html/N_System_Net_Mail.htm.
[4]Sikha Saha Bagui, Richard Walsh Earp. Learning SQL on SQL Server 2005[M]. O'Reilly, 2006.
[5]在ADO.NET中连接和检索数据[EB/OL].
ms-help://MS.MSDNQTR.v80.chs/MS.MSDN.v80/MS.VisualStudio.v80.chs/WD_ADONET/html/722e7f87-3691-46c6-87e8-7d159722d675.htm.
注:本文中所涉及到的图表、注解、公式等内容请以PDF格式阅读原文。
关键词:C#.NET;SQL Server;Imail邮件服务系统;Windows服务
中图分类号:TP319文献标识码:A文章编号:1009-3044(2007)18-31648-02
The Design and Implement of Affair Alert Module Based on .NET
WANG Chuan,SUN Bin
(Faculty of Information Engineering,China University of Geosciences,WuHan 430074,China)
Abstract:In order to alert office staff immediately when office affairs coming in an old office system, applying C#.NET﹑database technology and mail service system, it presents the design idea and implement means of an Affair Alert Module which implies this function.
Key words:C#.NET;SQL Server;Imail Server system;Windows Service
1 引言
在原有的网络办公系统中,由于办公人员不可能一直登录办公系统去查询最新的事务信息,而新的事务请求可能会随时出现,这样有可能一些紧急事务得不到及时处理。若是在新的事务出现时能及时通知给办公人员,就可以弥补这个不足。可以在服务器加入一个事务提醒模块来实现这个通知的功能,该模块工作原理是:它每隔一段时间自动查询办公系统数据库,对办公系统数据库的事务工作流进行分析,从中获取新事务的详细信息,然后把这些信息用邮件发送到相关办公人员的邮箱中。办公人员可以在繁忙时,只需要打开邮件接收客户端,将其设置为定时自动收信,并使用新邮件到来时的语音提示,便可及时处理新的事务,提高办公效率。若办公人员出差在外,也可以通过查看邮件去了解事务的详细信息,为远程处理事务提供了有力的支持。
2 事务提醒模块的功能结构设计
如果将事务提醒模块设计为运行在服务器的Windows服务应用程序(Windows服务应用程序的特点是,它们会随系统启动时自动启动,可以长时间运行,可以暂停和重新启动,而且不显示任何用户界面),就可以不必对原有的办公软件做改动,只需要对数据库的结构加入一些字段就可以了,从而大大地减轻软件开发任务的负担和复杂度。
事务提醒模块由三个子模块组成:(1)账户同步子模块;(2)信息收集子模块;(3)邮件发送子模块。下面将对这三个子模块的功能进行详细分析:
2.1账户同步子模块
如果要将事务信息发送邮件给办公人员,那么需要给每个办公人员一个办公用的邮箱账号,可以使用Imail邮件系统为办公人员提供邮件服务。在安装Imail邮件系统后,会提示需要指定Imail邮件系统的用户表的存放位置。为方便对用户表进行操作,我们将用户表设置为存放至外部数据库SQL Server 2005中。Imail邮件系统本身并没有提供比较方便的用户帐号远程管理程序,而办公系统数据库的用户表是可以远程管理的,完全可以将办公数据库的用户名和密码自动拷贝为该办公人员在邮件系统中用户名和密码。如果能将办公系统数据库的用户表中的用户名和密码和Imail邮件系统的用户表中的用户名和密码能够始终保持一致,那么就可以自动地对Imail邮件系统的用户进行管理,这样也完全符合我们的需要。
账户同步子模块的功能是:对比办公数据库的用户表和Imail邮件系统用户表的用户名和密码,如果办公数据库的用户表中新加入了用户,它将这些新建用户记录的用户名和密码自动地复制到邮件系统的用户表的新记录中;如果办公数据库中删除了用户记录,它将这些用户对应地邮件帐户删除;如果办公数据库的用户表中某些用户更改了用户密码,它将邮件系统中这些用户的密码改得与办公系统数据库的用户密码一致。
2.2信息收集子模块
办公系统的每一个事务都会分阶段完成,事务在它的每个阶段都有不同的处理任务。在办公数据库中有一个事务工作流表,就是用来记录事务在每个阶段的处理任务。事务工作流表以工作流号和阶段号为关键字段,其中,工作流号字段表示一个事务的编号,通过它可以在办公数据库中查询出事务的内容信息;而阶段号表示事务的处理阶段编号,事务的处理任务按阶段进行编号。为了便于发送邮件,可以在办公数据库中建立一个邮件队列表,用来存放发送邮件所需要的全部信息。信息收集子模块用来完成这些信息的收集整理工作,并把这些信息存放包邮件队列表中。在事务工作流表中加入一个标志字段Queue_Flag,用来标志该事务处理阶段的完整信息是否已加入到邮件队列表中。
信息收集子模块的功能就是:在事务工作流表中,对每条记录的标志字段Queue_Flag判断,对于没有加入到邮件队列表中的事务处理任务,根据任务的记录信息,在办公数据库中查询并整理出发信人的邮箱﹑收信人的邮箱﹑信件标题﹑信件内容正文等信息,然后将这些信息写入到邮件队列表的对应字段中。最后更改事务工作流表的标志字段Queue_Flag的值,表示已经将该事务处理任务加入了邮件队列表。
2.3邮件发送子模块
邮件发送子模块就是用来将邮件队列表中的记录以邮件发送的子模块。为了便于判断邮件队列表中的记录是否已经用邮件发送,需要为邮件队列表加一个标志字段Send_Flag,用来标志该条记录是否已被发送。
邮件发送子模块的功能是:对邮件队列表中的记录的标志字段Send_Flag进行判断,对没有用邮件发送出去的记录,用邮件发送出去。最后改变标志字段Send_Flag的值,表示该条事务处理任务已经被发送给相应的办公人员邮箱,完成了事务提醒模块的提醒任务。
2.4事务提醒模块功能结构图
事务提醒模块由前述所说的三个子模块组成,它每隔一定的时间,会自动地将这三个子模块依次执行一次。只有保持邮件帐号存在并且真实的情况下,给此人发送邮件提醒才有意义,因而帐户同步子模块要最先运行。然后就是收集需要提醒的事务信息,用邮件发送出去,因而信息收集子模块随后执行,最后执行邮件发送子模块。这个执行顺序不可以颠倒,否则会出问题。
事务提醒模块功能结构图如下:
3 实现事务提醒模块的技术点
3.1通过ADO.NET访问SQL Server 2005
用ADO.NET访问数据库分为如下几个步骤,首先用类SqlConnection打开数据库连接,然后用类SqlCommand执行SQL语句访问数据库,用类SqlDataReader读取SQL语句的执行结果然后关闭类SqlDataReader,最后关闭数据库连接。现以帐户同步子模块中读取办公数据库用户表的源代码为例来说明如何访问数据库,该代码的功能是读出用户表的用户名和密码。
string source = @"server=(local);" + "integrated security=SSPI;" + "database=办公数据库";
SqlConnection conn = new SqlConnection(source);
conn.Open();
string sele = @"SELECT TOP 1 用户名,密码 FROM 办公数据库.用户表";
SqlCommand cmd = new SqlCommand(sele, conn);
SqlDataReader read = cmd.ExecuteReader();
read.Read();
string username = read[0].ToString().Trim();
string password = read[1].ToString().Trim();
read.Close();
conn.Close();
3.2用System.Net.Mail发送邮件
C#发送电子邮件需要使用.net 2.0中新的命名空间System.Net.Mail中的类MailMessage和类SmtpClient。在类MailMessage的属性中存放发信人邮箱,收信人邮箱、信件标题、信件内容正文,然后用类SmtpClient发送的电子邮件。源代码中变量sender传递的是发信人的邮箱,变量receiver传递的是收信人的邮箱,变量subject传递的是信件标题,变量body传递的是信件内容正文,变量password传递的是发信人的邮箱密码,这些变量全部都可以从邮件队列表的相应字段中直接读取。
MailMessage mail = new MailMessage(sender, receiver);
mail.Subject = subject;
mail.Body = body;
mail.BodyEncoding = System.Text.Encoding.GetEncoding("GB2312");
mail.SubjectEncoding = System.Text.Encoding.GetEncoding("GB2312");
mail.IsBodyHtml = true;
SmtpClient smtp = new SmtpClient(smtpserver);
smtp.Credentials = new NetworkCredential(sender, password);
smtp.Send(mail);
3.3创建Windows服务应用程序
事务提醒模块做成Windows服务应用程序分为以下四个步骤:
(1)在从Visual C# 工程中选取Windows Services选项,给工程一个新文件名AlertService,然后点击确定,这时工程中自动生成了一个服务类AlertService。在该类中OnStart方法里添加语句,AlertServer abc = new AlertServer()。
(2)在该工程中新建一个AlertServer类,然后将事务提醒模块的三个子模块的实现代码放入到该类中。打开AlertServer类的设计视图,然后在工具箱中用鼠标拖过来一个Timer组件。双击Timer组件的图标,在AlertServer的Ontimer事件代码中加入三个子模块的方法,让它们在OnTimer事件出现时都按顺序执行一次。通过设置Timer组件的Interval属性来决定了事务提醒模块隔多久运行一次。
(3)在工程的解决方案资源管理器中,打开AlertService的设计视图,在设计视图窗口中,在鼠标右键弹出菜单中单击添加安装程序,这时项目中就添加了一个新类ProjectInstaller和两个安装组件ServiceProcessInstaller和 ServiceInstaller。单击ServiceInstaller组件并将它的 StartType属性设置为Automatic。这样每次计算机重新启动时,事务提醒模块都会自动启动。
(4)通过Visual Studio的生成菜单中选择生成来生成项目后,在已编译可执行文件所在的目录中,可以看到名为AlertService.exe的可执行文件。在Visual Studio的命令提示下,进入AlertService.exe所在的目录,使用.NET的服务安装工具InstallUtil.exe来安装服务,在命令行中输入下列代码 InstallUtil AlertService.exe 。同样的,卸载服务的操作是,在命令行中输入下列代码 InstallUtil /u AlertService.exe 。
安装好服务后,就可以通过运行“控制面板->管理工具->服务控制台程序”来启动或停止事务提醒模块了。
4 结束语
该事务提醒模块已经在原办公系统的服务器安装使用,经过一定时间的测试运行,运行状态良好。通过把事务提醒模块加入办公系统中实现了事务的及时提醒功能,可节省时间,显著地提高工作效率。随着3G时代的到来,手机上网业务迅猛发展,用手机收发邮件也将会普及,办公人员在出门在外时也可以通过手机得到事务的提醒信息。因而事务提醒模块在办公系统中确实很有应用价值。
参考文献:
[1]Christian Nagel,Bill Evjen,Jay Glynn.李敏波.译.C#高级编程(第3版)[M].北京:清华大学出版社,2006.
[2]Karli Watson,Christian Nagel.C#入门经典(第4版)[M].北京:清华大学出版社,2006.
[3]System.Net.Mail 命名空间[EB/OL]. ms-help://MS.MSDNQTR.v80.chs/MS.MSDN.v80/MS.NETDEVFX.v20.chs/cpref10/html/N_System_Net_Mail.htm.
[4]Sikha Saha Bagui, Richard Walsh Earp. Learning SQL on SQL Server 2005[M]. O'Reilly, 2006.
[5]在ADO.NET中连接和检索数据[EB/OL].
ms-help://MS.MSDNQTR.v80.chs/MS.MSDN.v80/MS.VisualStudio.v80.chs/WD_ADONET/html/722e7f87-3691-46c6-87e8-7d159722d675.htm.
注:本文中所涉及到的图表、注解、公式等内容请以PDF格式阅读原文。