1、 超市收银管理系统的实现 目 录1 绪论 21.1 课题的背景及意义 .21.1.1 系统功能设计 .21.1.2 系统设计 .31.2 论文主要工作和结构安排 32 系统功能 52.1 系统功能设计 .53 相关技术及工具介绍 93.1 系统应用程序开发环境 .93.2 系统后台数据库开发工具 .93.3 系统设计采用框架结构 .104 设计总结 .124.1 总结 .12附 录 14RFID 原理与应用课程设计11 绪论该部分主要介绍当前文件管理系统的背景及意义。本次设计就是利用数据库有效、完整、安全储存、便于管理等多项优点对超市的会员信息及消费的数据运用数据库进行管理实现超市高效率的运作
2、。1.1 课题的背景及意义21 世纪,超市的竞争也进入了一个全新的领域,竞争已不再是规模的竞争,而是技术的竞争管理的竞争人才的竞争,技术的提升和管理的升级是超市业竞争的核心。零售领域目前呈多元发展趋势。如何在竞争的激烈中扩大销售降低经营成本,扩大经营规模成为超市经营者努力追求的目标。因此我们有必要制定一套合理有效规范和实用的超市管理系统的一项分支超市收银管理系统,对超市的日常收银业务进行集中统一的管理。超市收银系统具有高效性时效性。该系统的三大益处有:(1)大大提高超市的运作效率; (2)通过全面的信息采集和处理,辅助提高超市的决策水平; (3)使用本系统,可以迅速提升超市的管理水平,为降低经
3、营成本,提高效益,增强超市扩张力, 提供有效的技术保障。 1.1.1 系统功能设计(1)系统主要分为用户管理和商品管理两个模块。(2)用户管理对超市人员进行信息管理,进行人员信息的增删查改。(3)用户登录是登录进入管理员或者是收银员身份。(4)商品管理是对超市商品进行信息统计包括商品名称,单价和现有数量。(5)商品详情是查看统计顾客所要购买的商品的信息。(6)付款界面是多当前顾客购买的商品信息进行总价统计所支付的钱。RFID 原理与应用课程设计2图 1 总体模块设计图1.1.2 系统设计超市收银系统采用 SQL Sever 语言进行数据库的连接利用数据库有效、完整、安全储存、便于管理等多项优点
4、对超市的会员信息及消费的数据运用数据库进行管理实现超市高效率的运作。本系统采用.net framework 框架结构,可以模块化的对人员信息和商品信息进行直观的了解并可以对信息进行快速的增删查改。通过数据库的多项信息安全高效的处理和.net framework 框架结构的模块化的相结合,实现了最优的管理系统。方便了超市管理者的管理。1.2 论文主要工作和结构安排该论文主要应用程序开发环境:Microsoft Visual Studio2010;后台数据库开发工具:Microsoft SQL Server 2005,工作是在.NET 操作系统下,利用 c#开发语言,实现的超市收银管理系统。其目标
5、在于实现超市对收银用户的信息记录和超市现有库存商品情况记录和罗列付费商品清单。前期工作:(1) 首先,根据所作的需求分析,完成基本的功能界面设计。(2) 根据(1)中界面设计,把每个功能通过代码来实现,以完成功能的定义。(3) 根据关系数据库模式中的数据库表的设计,并通过 SQL Server 2005 建立超市收银管理系统用户管理 商品管理用户登录人员信息管理商品详情付款RFID 原理与应用课程设计3数据库。(4) 把设计好的界面和数据库连接起来,使整个系统能够运行。 (5) 选取几个典型的例子对该系统进行测试,不断地发现问题和解决问题,最终使该系统能够正常的运行,完成相应的任务。(6) 编
6、写文档。论文结构安排上主要分为绪论、系统功能、相关技术及工具介绍、总结四个部分,每一个部分具体分工如下:1、绪论:该部分主要介绍当前设计的管理系统的背景及意义,市场的前景分析及系统自身的优点。以及论文主要工作及结构安排。运用 c#语言,通过数据库的多项信息安全高效的处理和.net framework 框架结构的模块化的相结合,实现了最优的管理系统。提高超市的便捷高效的管理。2、系统功能:该部分主要介绍该系统功能设计以及系统功能分析,从而能够展示整个系统的功能的规划。3、相关技术及工具介绍:该部分主要介绍系统所采用系统应用程序开发环境系统后台数据库开发工具,系统设计采用框架结构的相关知识。4、总
7、结:该部分主要介绍在设计超市收银管理系统实现过程中自己的收获。RFID 原理与应用课程设计42 系统功能该部分主要介绍该系统功能的整体设计和系统的模块化设计以及系统功能分析,系统的功能规划如下所示:2.1 系统功能设计根据系统的开发背景和意义以及需求分析确定该系统划分为以下几个管理功能:(1)系统用户管理功能该用户管理功能主要完成对超市收银人员信息的管理,首先管理员登录该功能的用例图如图 2-1 所示2-1 用户登录界面根据设置权管理员可对人员信息进行增删查改。信息录入主要有人员系统登录的账号密码,家庭住址、手机号、QQ 号和权限等操作。该功能的用实现界面如图 2-2 所示:RFID 原理与应
8、用课程设计52-2 人员信息注册界面利用数据库和程序连接进行信息管理。数据库人员信息存储界面如 2-3 所示2-3 数据库人员信息表(2)商品管理商品管理是由管理员权限才可以进行商品信息的增删查改。商品管理主要查看添加入库商品的信息以及库存商品的信息,并对库存商品的信息进行修改和查询。如图 2-4 界面所示:RFID 原理与应用课程设计62-4 商品管理界面在“添加商品”界面中按要求填入商品的名称、单价、数量,点击“确认”按钮即可。如 2-5 添加商品界面所示:2-5 添加商品界面在“商品管理”界面中,点击“查询删除”按钮即可看到所有商品的详细信息,若输入某商品名称仅查看到该商品的信息;点击到
9、商品信息的某一栏,更改数字,点击“删除”按钮则商品的这一信息就被删除成功。如图 2-6 商品查看界面所示:RFID 原理与应用课程设计72-6 商品查看界面顾客结账时物品消费清单罗列和系统计算应付,实收和应找零结账流程如图 2-7 物品消费清单界面,2-8 付费界面所示:2-7 物品消费清单界面 2-8 付费界面 RFID 原理与应用课程设计83 相关技术及工具介绍该部分主要介绍系统所采用的技术及开发工具,涉及该系统采用的开发工具及技术,以及该系统涉及的数据库相关知识。 相关技术及工具介绍本系统是在下列开发环境下完成的: (1)应用程序开发环境:Microsoft Visual Studio
10、2010(2)后台数据库开发工具:Microsoft SQL Server 2005(3)本系统采用.net framework 框架结构(4)文档开发环境:Microsoft Office WPS 文字3.1 应用程序开发环境使用 Visual Studio 2010 集成化开发环境Visual Studio 2010 是微软公司集成化开发环境的最新版本,微软一共发布了如下 4 个版本的 Visual Studio 2010。Visual Studio 2010 的用户界面与以前版本相比有了相当显著的改进。微软使用 WPF 技术进行 UI 开发,无论在响应还是外观来说都更加吸引人,大大增强了
11、用户的使用舒适性。与之前的版本相比较,Visual Studio 2010 在许多方面都得到了增强,比如WPF 设计器、智能提示、代码高亮、可视化类设计器等。其中一些独特的特性如下。可视化的 XML 编辑器及设计器;支持 Windows 移动开发;支持 Office 开发;为 Windows Workflow Foundation 项目提供了设计时的支持;整合支持的代码重构;可视化的类设计工具。3.2 后台数据库开发工具该系统后台数据库采用 Microsoft SQL Server 数据库开发工具,该数据库系统在安全性、准确性和运行速度方面有绝对的优势,并且处理数据量大、效率高。sql ser
12、ver 2005 是一个关系数据库管理系统。它最初是由 Microsoft Sybase RFID 原理与应用课程设计9和 Ashton-Tate 三家公司共同开发的,于 1988 年推出了第一个 OS/2 版本。在Windows NT 推出后,Microsoft 与 Sybase 在 SQL Server 的开发上就分道扬镳了,Microsoft 将 SQL Server 移植到 Windows NT 系统上,专注于开发推广 SQL Server 的 Windows NT 版本。Sybase 则较专注于 SQL Server 在 UNIX 操作系统上的应 SQL Server 安装界面用。s
13、ql server 2005 - 数据库管理 10 个最重要的特点数据库镜像、在线恢复在线检索操作、快速恢复、安全性能的提高、新的 SQL Server Management Studio、专门的管理员连接、快照隔离、数据分割、增强复制功能。sql server 2005 - 有关开发的 10 个最重要的特点.NET 框架主机、XML 技术、 ADO.NET 2.0 版本、增强的安全性、 Transact-SQL 、增强性能、SQL 服务中介、通告服务、Web 服务、报表服务、全文搜索功能的增强。3.3 系统设计采用框架结构.NET 技术是微软公司推出的一个全新概念,它代表了一个集合、一个环境
14、和一个可以作为平台支持下一代 Internet 的可编程结构。.NET 的目的就是将互联网作为新一代操作系统的基础,对互联网的设计思想进行扩展,使用户在任何地方、任何时间、利用任何设备都能访问所需要的信息、文件和程序。.NET 平台包括.NET 框架和.NET 开发工具等部分。.NET 框架(Framework)是整个开发平台的基础,包括公共语言运行库和.NET 类库。.NET 开发工具包括 Visual Studio.NET 集成开发环境和.NET 编程语言。.NET 编程语言包括 Visual Basic、Visual C+和新的 Visual C#等用来创建运行在公共语言运行库(Comm
15、on Language Run,CLR)上的应用程序。.NET 框架结构如图 1-1 所示。RFID 原理与应用课程设计10图 3-1 .NET 框架结构2公共语言运行库公共语言运行库是 .NET Framework 的基础。可以将运行库看成一个在执行时管理代码的代理,它提供核心服务(如内存管理、线程管理和远程处理),而且还强制实施严格的类型安全以及可确保安全性和可靠性的其他形式的代码准确性。事实上,代码管理的概念是运行库的基本原则。以运行库为目标的代码称为托管代码,而不以运行库为目标的代码称为非托管代码。公共语言运行库管理内存、线程执行、代码执行、代码安全验证、编译以及其他系统服务。这些功能
16、是在公共语言运行库上运行的托管代码所固有的。3.NET 框架类库.NET Framework 类库是一个与公共语言运行库紧密集成的可重用的类型集合,是对 Windows API 封装的全新设计,它为开发人员提供了一个统一的、面向对象的、分层的和可扩展的庞大类库。该类库是面向对象的,使 .NET Framework 类型易于使用,而且还减少了学习 .NET Framework 的新功能所需要的时间。此外,第三方组件可与 .NET Framework 中的类无缝集成。 例如,用.NET Framework 集合类实现一组可用于开发您自己的集合类的接口。您的集合类将与.NET Framework 中
17、的类无缝地混合。 .NET Framework 类型使您能够完成一系列常见编程任务(包括字符串管理、数据收集、数据库连接以及文件访问等任务)。除这些常见任务之外,类库还包括支持多种专用开发方案的类型。例如,可使用 .NET Framework 开发下列类型的应用程序和服务:控制台应用程序。Windows GUI 应用程序(Windows 窗体)。ASP.NET 应用程序。RFID 原理与应用课程设计11XML Web services。Windows 服务。本次设计的超市收银管理系统是由 .NET Framework 开发的 Windows GUI 应用程序(Windows 窗体)。4 设计总
18、结该部分主要介绍在设计超市收银管理系统实现过程中自己的收获。4.1 总结通过本次实训,感觉.NET是一个很好的开发工具,在使用时很方便,关于界面开发方面:具有很大的优势,都是一些插件性的。比较容易开发,但是经过最近的学习感觉对.NET开发界面的熟悉很重要。当然了,闲暇之时多看一些相关控件的属性和一些相关的教学视频自学一下课堂上老师的设计目标是怎样是的并对其有一定的了解。如果说,把C#开发界面,拿到软件工程开发的方法来看,逐步求精是最好的学习方法。因为所有的任务都可以在一个应用程序开发中得到体现,从而也是的该应用程序更加完美!主要培养了自己的规范研发能力,学习了企业项目开发的整个过程和团队项目开
19、发经验,并且加强了.NET新技术的学习,熟练掌握了常用的软件开发工具(如Visual Studio 2010) 的操作规程。以及与数据库后台开发工具的数据管理的高效性相结合的系统程序开发实现了此次超市收银管理系统的设计。经过这一段时间的实训也面临了很多的问题,问题在一步步的解决而我也深有感想并对自己这段时间所参悟的怎样学习C#有以下心得:1.看看写写改改 看一看,改一改别人写的代码,养成一个简单程序。看一看比一比就知道,谁RFID 原理与应用课程设计12的程序好谁的程序更成熟。 2.编一编敲一敲 看了其他人的代码代码,这是了解他们的代码,也必须了解代码的执行过程。特别是在编译的时候,你会发现的
20、你的进步和不足。在经历无数错误中你也取得的许许多多的经验,这是多少成功的必备之路。 在无数编程过程中,大家都会发现,你的很多英文都会输入错误。都用全叫的句号代替那半角点。这个神奇的点。3.从简单开始 大家都喜欢一部登天,那是不可能的事情。无数的错误在积累经验的同时也会把你的自信心会被削弱的。切记切记,不要把自己的自信心打击没有了。从最基本的学起、从简单开始。代码重复利用是快乐的,这样很节省代码的输入量,有信心后再去攻克、再去挑战。4.在交流中成长 都说当局者迷,可能是很简单的属性设置的问题,或者是那个全角半角的句号,也许是你想不到的边边角角的问题,你却怎么也检查不出来的问题,多和同学交流交流也
21、许很快就解决了。大家要知道,通过网络的搜索,很会找到很多,有关的话题的解决方法,很多你遇到的问题,很有可能,早就被人发现,发现的同时也被其他人解决。你会在寻找问题的答案中,获得进步。5.不断突破创新 编程和其他事情一样,最烦的就是套用老方式和老办法。你可以充分利用,现有的对象,进行细化和增加新的属性。创新是编程最大的灵感。 6.在总结中成熟 不断的总结中,你会发现,你的的进步,同时也存在很多的不足。所以,你要不断的改进你的学习方法,使之不断的进步。编程的本身是一项创造性的工作。灵感来自客户的需要,来自市场的需要,来自用户的便捷操作,来自您对自己的信心。让你在不断的总结中不断的成熟。参考文献1
22、张俊 崔海波 著 ADO.NET 数据库应用开发 2008 年 1 月 机械工业出版社 2 徐孝凯 贺佳英 著 数据库基础与 SQL Server 应用开发2008 年 4 月 清华大学出版社3 我要自学网.c#入门教程RFID 原理与应用课程设计13附 录核心代码:(1)超市管理(用户管理)系统using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using System.Drawing;using System.Linq;using System.Text;us
23、ing System.Windows.Forms;using System.Data.SqlClient;namespace 超市管理public partial class Form1 : Formpublic Form1()InitializeComponent();private void button1_Click(object sender, EventArgs e) /用户登录if (textBox1.Text = “)MessageBox.Show(“请输入用户名“);elseif (textBox2.Text = “)MessageBox.Show(“请输入密码“);elses
24、tring s1 = lianjie.Getcon();SqlConnection mycon = new SqlConnection();mycon.ConnectionString = s1;tryRFID 原理与应用课程设计14 /mycon.Open();string ss= “select yonghu,mima from yonghu whereyonghu=“+textBox1.Text+“and mima=“ + textBox2.Text + “;SqlCommand selectcmn = new SqlCommand(ss, mycon);SqlDataReader cu
25、stDR = selectcmn.ExecuteReader();if (custDR.HasRows)/判断是否查询到custDR.Close();string ss1 = “select yonghu,mima,quanxian from yonghu whereyonghu=“ + textBox1.Text + “and mima=“ + textBox2.Text + “and quanxian=管理员“;SqlCommand selectcmn1 = new SqlCommand(ss1, mycon);SqlDataReader custDR1 = selectcmn1.Exec
26、uteReader();if (custDR1.HasRows)/管理员窗口调用string zhanghu1 = this.textBox1.Text;Form4 f4 = new Form4(zhanghu1);f4.Show();else/收银员窗口调用string zhanghu = this.textBox1.Text;Form2 f2 = new Form2(zhanghu);f2.Show(); elseMessageBox.Show(“账号或密码错误“); mycon.Close();catch (Exception ex)MessageBox.Show(ex.Message)
27、;mycon.Close();private void button2_Click(object sender, EventArgs e)RFID 原理与应用课程设计15Application.Exit();private void Form1_Load(object sender, EventArgs e)(2)商品管理using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using System.Drawing;using System.Linq;using S
28、ystem.Text;using System.Windows.Forms;using System.Data.SqlClient;namespace 超市管理public partial class Form2 : Formpublic Form2(string zhanghu)InitializeComponent();this.Text = zhanghu;float sum1= 0;float zong = 0;public static string str = “;private void Form2_Load(object sender, EventArgs e)string s
29、1 = lianjie.Getcon();SqlConnection mycon = new SqlConnection();mycon.ConnectionString = s1;mycon.Open();string ss = “select shangping from wuping“;SqlCommand selectcmn = new SqlCommand(ss, mycon);SqlDataReader custDR = selectcmn.ExecuteReader();comboBox1.Items.Clear();while (custDR.Read()RFID 原理与应用课
30、程设计16comboBox1.Items.Add(custDR0);mycon.Close();private void comboBox1_SelectedIndexChanged(object sender, EventArgs e)str = comboBox1.SelectedItem.ToString();private void button1_Click(object sender, EventArgs e)if (str = “)MessageBox.Show(“请选择商品“);return;elseif (textBox1.Text = “)MessageBox.Show(“
31、请输入购买数量“);textBox1.Focus();return;elsetrystring s1 = lianjie.Getcon();SqlConnection mycon = new SqlConnection();mycon.ConnectionString = s1;mycon.Open();string ss = “select danjia,shuliang from wuping where shangping=“ + str + “;SqlCommand selectcmn = new SqlCommand(ss, mycon);SqlDataReader custDR =
32、 selectcmn.ExecuteReader();custDR.Read(); string ss1 = custDR.GetString(custDR.GetOrdinal(“danjia“);string ss2 = custDR.GetString(custDR.GetOrdinal(“shuliang“).ToString();mycon.Close();int num = int.Parse(textBox1.Text);if (num int.Parse(ss2)RFID 原理与应用课程设计17MessageBox.Show(“库存不足,该商品剩余“ + ss2);return
33、 ;elsefloat sum = float.Parse(ss1) * num;ListViewItem lv = new ListViewItem(str.ToString();lv.SubItems.Add(ss1.ToString();lv.SubItems.Add(textBox1.Text);lv.SubItems.Add(sum.ToString();listView1.Items.Add(lv);string sum2 = “;sum1 = sum1 + sum;sum2 = sum2 + sum1;textBox2.Text = sum2;mycon.Open();strin
34、g ss3=(int.Parse(ss2)-num).ToString();string sss = “update wuping set shuliang=“+ss3+“ where shangping=“+ str + “;SqlCommand selectcmn1 = new SqlCommand(sss, mycon);SqlDataReader custDR1 = selectcmn1.ExecuteReader();mycon.Close();catch (Exception ex)MessageBox.Show(ex.Message);private void button2_C
35、lick(object sender, EventArgs e)string str1 = this.textBox2.Text;Form8 f8 = new Form8(str1);f8.Show();zong = sum1+zong;sum1 = 0;textBox1.Clear();RFID 原理与应用课程设计18listView1.Items.Clear();textBox2.Clear();private void button3_Click(object sender, EventArgs e)private void Form2_FormClosing(object sender
36、, FormClosingEventArgs e)MessageBox.Show(zong.ToString();(3)用户信息管理using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using System.Drawing;using System.Linq;using System.Text;using System.Windows.Forms;using System.Data.SqlClient;namespace 超市管理public partial c
37、lass Form3 : Formpublic Form3()InitializeComponent();public int panduan()if (textBox1.Text = “)MessageBox.Show(“请输入账号“);textBox1.Focus();return 0;else if (textBox2.Text = “)MessageBox.Show(“请输入密码“);textBox2.Focus();RFID 原理与应用课程设计19return 0;else if (textBox3.Text = “)MessageBox.Show(“请输入再次输入密码“);text
38、Box3.Focus();return 0;else if (textBox4.Text = “ “)MessageBox.Show(“请输入家庭住址“);textBox4.Focus();return 0;else if (textBox5.Text = “)MessageBox.Show(“请输入家庭住址“);textBox5.Focus();return 0;else if (textBox6.Text = “)MessageBox.Show(“请输入 QQ“);textBox6.Focus();return 0;else if (textBox2.Text != textBox3.Te
39、xt)MessageBox.Show(“密码不匹配,请重新输入“);textBox2.Clear();textBox3.Clear();textBox2.Focus();return 0;else if (textBox5.Text.Length != 11)MessageBox.Show(“手机号格式不正确,请重新输入“);textBox5.Focus();return 0;return 1;private void button1_Click(object sender, EventArgs e)if (panduan() = 0)RFID 原理与应用课程设计20return;string
40、 s1 = lianjie.Getcon();SqlConnection mycon = new SqlConnection();mycon.ConnectionString = s1;try/判断是该账户是不是已经存在. /mycon.Open();string ss = “select yonghufrom yonghu whereyonghu=“ + textBox1.Text+“;SqlCommand selectcmn = new SqlCommand(ss, mycon);SqlDataReader custDR = selectcmn.ExecuteReader();if (cu
41、stDR.HasRows)/判断是否查询到MessageBox.Show(“该用户已存在,请重新输入用户名“);textBox1.Clear();textBox1.Focus();return;mycon.Close();catch (Exception ex)MessageBox.Show(ex.Message);mycon.Close();trymycon.Open();string ss1 = “insert into yonghu(yonghu,mima,zhuzhi,shoujihao,qq,quanxian) values(“+textBox1.Text+“,“+textBox2.
42、Text+“,“+textBox4.Text+“,“+textBox5.Text+“,“+textBox6.Text+“,“+comboBox1.Text+“)“;SqlCommand selectcmn1 = new SqlCommand(ss1, mycon);SqlDataReader custDR1 = selectcmn1.ExecuteReader();MessageBox.Show(“添加成功“);catch (Exception ex)MessageBox.Show(ex.Message);private void Form3_Load(object sender, Event
43、Args e)comboBox1.SelectedIndex = 1;RFID 原理与应用课程设计21private void textBox3leave(object sender, EventArgs e)private void button2_Click(object sender, EventArgs e)this.Close();private void comboBox1_SelectedIndexChanged(object sender, EventArgs e)(4)管理系统选择using System;using System.Collections.Generic;us
44、ing System.ComponentModel;using System.Data;using System.Drawing;using System.Linq;using System.Text;using System.Windows.Forms;namespace 超市管理public partial class Form4 : Formpublic Form4(string zhanghu1)InitializeComponent();this.Text = zhanghu1;private void button1_Click(object sender, EventArgs e
45、)Form3 f3 = new Form3();f3.Show();private void button2_Click(object sender, EventArgs e)RFID 原理与应用课程设计22Form5 f5 = new Form5();f5.Show();private void button3_Click(object sender, EventArgs e)Form6 f6 = new Form6();f6.Show();private void button4_Click(object sender, EventArgs e)Form7 f7 = new Form7()
46、;f7.Show();private void Form4_Load(object sender, EventArgs e)private void groupBox1_Enter(object sender, EventArgs e)(5)删除用户信息using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using System.Drawing;using System.Linq;using System.Text;using System.Windows.For
47、ms;using System.Data.SqlClient;namespace 超市管理public partial class Form5 : Formpublic static string str =“;public Form5()InitializeComponent();RFID 原理与应用课程设计23public void chongxingjiazai()string s1 = lianjie.Getcon();SqlConnection mycon = new SqlConnection();mycon.ConnectionString = s1;trymycon.Open(
48、);string ss = “select *from yonghu“;SqlCommand selectcmn = new SqlCommand(ss, mycon);SqlDataReader custDR = selectcmn.ExecuteReader();listView1.View = View.Details;listView1.FullRowSelect = true;int i = 1;while (custDR.Read()ListViewItem lv = new ListViewItem(i.ToString();lv.SubItems.Add(custDR0.ToString();lv.SubItems.Add(custDR1.ToString();lv.SubItems.Add(custDR4.ToString();lv.SubItems.Add(custDR3.ToString();lv.SubItems.Add(custDR5.ToString();lv.SubItems.Add(custDR2.ToString();listView1.Items.Add(lv);i+;mycon.Close();catch (Exception ex)M