C#实训日志完整版.doc_第1页
C#实训日志完整版.doc_第2页
C#实训日志完整版.doc_第3页
C#实训日志完整版.doc_第4页
C#实训日志完整版.doc_第5页
已阅读5页,还剩4页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

12月23日(星期一):(一)在今天我们学习了如何创建Windows应用程序:单击“文件”选择“新建”选择“项目”选择“Windows应用程序”,在此界面中可以设置项目名称、存储位置等,然后单击“添加”,项目新建成功。创建Windows应用程序后会自动生成一个名为Form1的窗体,一般情况下我们将它删除,自行新建新窗体。(二)然后我们学习了如何在已经创建好的项目中创建窗体:右键单击项目单击“添加”选择“新建项”在此窗口中选择“Windows”窗体,添加的默认名字为Form2,Form3等,我们最好将名称改为“数据库表名+Form”方便记忆,然后单击“添加”,窗体新建成功。实践后我们了解到在一个项目中我们可以创建多个窗体,如果想运行哪个窗体,则需要总在该项目的“Program.cs”文件中,将“Application.Run(new MainForm();”中的“MainForm()”改成对应的窗体名称。(三)我们在了解了项目需求后实现了父窗体以及子窗体的设定: 由于我们需要建立的是一个有菜单,有多项功能,能打开多个窗体的项目,所以我们需要一个主窗体,以及多个下属功能窗体,也就是一个父窗体,以及多个子窗体。我们需要一个窗体作为容器成为基类或父窗体,另一个窗体作为模板,也叫子窗体。在父窗体中可以打开多个文档,每个文档都是由一个单独的子窗体显示,所有的子窗体都是类似的,可以使用窗体的模板来创建,从类的角度来看所有的子窗体都是一个类的不同实例。创建父窗体的方法非常简单,即为将想要设定的窗体的“IsMdiContainer”属性值设为“True”,此时窗体的背景变为灰色,该窗体就变为父窗体。然后就可以在此窗体中添加菜单从而实现调用其他窗体的功能。(四)我们在创建好窗体后熟悉了环境中的几项比较重要的工具窗口:在创建好窗体之后我们开始在子窗体中进行界面设计,首先是熟悉环境的属性界面,在软件右侧有两个工具栏,分别是“解决方案资源管理器”和“属性”窗口。这两项窗口都可以在视图中找到后调出。在“解决方案资源管理器”中我们可以查看当前打开的项目的文件,双击即可打开对应文件。在“属性”中我们可以查看选中的窗体或者选中的各个控件的各项属性值,同时可以对各项属性进行调整。我们可以在“属性”栏中将属性名按照字母顺序排序以方便查找,我们还可以查找对应事件并进行修改。而在界面左侧则有一个“工具箱”,在工具箱中我们可以找到几乎所有我们所需要的控件、容器、工具栏等。只要单击工具箱中需要的控件,再单击窗体就可以添加控件成功。我们也可以用容器中控件来规划窗体,如我们可以使用“SplitContainer”空间来将窗体分割成两部分,在两部分中分别添加其他空间,进行不同的内容的添加。(五)在今天下午的课程中我们学习了如何调整窗体的各项基本属性:首先我们学习了如何为窗体的标题栏修改文字内容,在属性窗口中,我们找到“Text”属性,然后输入想显示的内容,如我们首先设计了工作信息窗体,所以在“Text”属性右侧框中输入“工作信息管理”字样。然后我们了解了确定窗体的初赛可视状态属性,在属性栏中找到“WindowsState”属性,在此我们可以选择“Minimized”也就是打开时最小化显示,“Maximized”打开时最大化显示以及“Normal”标准话显示。12月24日(星期二): (一)今天上午我们对窗体属性继续进行了了解:如“MaximizeBox”属性用来确定窗体标题栏的右上角是否有最大化框;“MinimizeBox”属性用来确定窗体标题栏的右上角是否有最小化框;“Opacity”属性用来设置窗体的不透明度;“ShowInTaskbar”属性用来确定窗体是否出现在Windows任务栏中;“StartPosition”属性用来确定窗体第一次出现的位置;“TopMost”属性用来指示窗体是否始终显示在此属性未设置为“True”的所有其他窗体之上。(二)然后我们设计了“工作信息管理系统”的界面:使用“SplitContainer”控件将窗体分为两部分,左侧作为数据输入区,右侧为数据显示区。在右侧添加了“FataGridView”数据网格显示控件。并命名为“dgvJobs”,设置他的“Dock”属性为“Fill”,此属性是为了定义要绑定的容器的控件边框。单击控件右上角小箭头,“选择数据源”“添加项目数据源”在“选择数据源类型”中选择“数据库”并单击“下一步”连接“pubs”表填入用户名和密码,然后选择“Jobs”表连接。单击“编辑列”选定列,然后将列名修改为中文名。在左侧添加“Label”标签控件、“Text”文本框控件以及“Botton”按钮控件来实现数据录入以及单击实现功能的功能。在添加好后分别将各个控件改名以方便以后使用。设定每个控件的“Anchor”属性,该属性定义控件绑定到的容器的边缘,当控件锚定到某个边缘时,与指定边缘最接近的控件边缘与指定边缘之间的距离将保持不变。设定此属性后,在使用该窗体时,各个控件的位置将固定,方便、美观。在此,我们将“工作编号”栏的“ReadOnly”属性设置为“True”,以控制能否更改编辑控件中的文本。(三)实现“添加”按钮的功能:双击窗体中的一个按钮就可以生成一个事件,在“添加”事件中老师主要讲解使用“try-catch”对工作等级进行验证,如果输入的工作等级与要求不符,则执行“catch”中语句,在此老师教我们使用了“txtMinlvl.Focus();”语句和“txtMinlvl.SelectAll();”语句,“txtMinlvl.Focus();”这个语句用于将光标的焦点转到最小工作等级处,这个语句的使用可以方便用户找到出错位置,“txtMinlvl.SelectAll();”可以选中文本框中全部文字,方便用户的重新输入,可以加强用户体验,这种为用户方便着想的设计在以后的程序设计中是十分重要的,只要在编程时回忆自己使用某些软件的体验就可以了解用户需求,将程序设计的更加合理,更加人性化。同时,工作等级文本框有多种方法来限制用户输入,可以在语句中做判断,我们也可以使用“NumericUpDown”控件,这个控件限制了用户在框中只能输入数字,不能输入其他字符。这个控件还可以设定初始值。我们在“catch”中还使用了“MessageBox.Show();”语句,使用这个语句可以弹出一个窗口,显示想要显示的文本信息,在此我们用来提示用户添加失败的原因“最低等级是0-255之间的数字。”。(四)实现“取消”按钮的功能:在“btnCancel_Click”事件中,我们将文本框值全部赋值为空,以达到当单击“取消”按钮的时候,清空所有文本框中已经输入的文字的功能。如果使用了“NumericUpDown”控件,则需要将此处赋值为“0”。12月25日(星期三):(一)今天首先实现了“修改”按钮的功能:在实现“修改”功能之前,首先我们需要做的是将右侧的数据显示到左侧的文本框中,然后我们才能方便进行修改和删除。我们希望做到的效果是在双击右侧数据条头部时,可以将数据提取出来然后显示在左侧,所以我们创建了一个“dgvJobs_RowHeaderMouseDoubleClick”事件,提取了数据库中的数据。然后我们通过定义局部变量来判断想要修改成的工作编号格式是否符合要求,用“if”语句判断是否有此工作编号,然后实现了修改功能。(二)在测试中出现了一个问题:在我准备执行时出现了“sa登录失败”的错误,我在“JobsForm_Load”事件中添加了“TableAdapter.Connection.ConnectionString = server = . ; user = sa ;password = 123456;database = pubs;”语句后就解决了问题,其他同学也有遇到这个问题的,他们提供了另一种方法给我参考,就是重新绑定数据源,在登录数据库时使用“Windows验证”登录。(三)然后我们实现了“删除”功能:删除功能和修改功能类似,很多代码可以公用,只需要简单的复制粘贴,然后在修改一些值就可以直接使用,在此我也了解到有得时候编程序不需要一行一行的重复编写,有的时候只要你记住以前自己编写过的代码,并理解其中的道理就可以直接使用。在这里我们就用来同样的代码对工作编号的格式和是否存在该工作编号进行了判断,如果判断后没有异常则删除。(四)实现“保存”功能:在实现了基本的增删改功能之后,我们经过测试基本没有错误,但是此处的功能实现只是局限于左侧文本框与右侧数据显示区的交互,并没有真正的实现于数据库中,所以每次我们执行完操作以后,一旦关闭了窗体,再次运行窗体时,之前添加或修改的数据并没有显示出来。所以我们需要完成一个保存功能,来将修改的结果同步到数据库中。我们编写了“btnSave_Click”事件来实现保存功能。定义变量“count”来计数,实现更新数据库中数据。在这个地方老师又特殊强调了一个“pubsDataSet.RejectChanges();”,也就是回滚功能,这个语句在判断是否保存成功的语句中实现。我们进行的设计是,如果保存成功,显示“保存成功”,并显示受影响的记录的条数,条数的计数就是通过“count”来实现的。如果保存不成功,我们会将右侧数据还原到点击“添加”或“修改”按钮之前的状态,以方便用户重新操作。(五)实现“查找”和“取消查找”功能:查找功能我们使用“jobsBindingSource.Filter”语句实现,“Filter”用于获取或设置用于筛选查看哪些行的表达式。我们使用SQL语句进行模糊查询。取消查询的功能实现起来也很简单,只需要将查询文本框中的文本内容清空,然后将“jobsBindingSource.Filter”也清空即可12月26日(星期四):(一)对以前上课实训内容的总结:在此之前基本已经将最简单的“Jobs”表的增删改查功能实现,在以后的很多窗体的制作中都可以直接复制“JobsForm”中的内容。(二)“EmployeeForm”窗体的设计:雇员信息管理窗体的界面设计与工作信息管理窗体的基本设计步骤类似,在此增添了两个新的控件,“ComboBox”控件和“DateTimePicker”控件。“ComboBox”控件可以显示一个可编辑的文本框,其中包含一个允许值下拉列表。在这个控件中我们可以绑定数据源,对可选择项进行限制,只需要单击控件右上角小箭头,选中“使用数据绑定项”复选框,然后选择数据源,之后设定显示成员和值成员即可设定。“DateTimePicker”控件可以限制用户输入的格式必须是日期型。右侧的数据显示栏与“JobsForm”略有不同是我们可以编辑列,在设计栏中将“ColumnType”属性值设置成“DataGridViewComboBoxColumn”,然后我们就会发现“数据”栏中会出现多项属性,只要进行适当的设定,就可以使“job_id”等列显示“job_desc”而非“job_id”以方便用户查看相关信息。(三)“EmployeeForm”的代码编辑:为了使用户有舒适的体验,我们将“PubId”和“JobId”的文本框中的初始值设置为“-请选择-”。将查询入职日期的最小值文本框的初始值设置为“1753-1-1”,最大值文本框的初始值设置为“Now”,也就是使用程序当天日期。由于EmpId有检查约束,所以在添加功能代码中对输入的值进行了判断。在代码中我们还添加了一个全局变量“oldEmpId”,用来保存原主键“EmpId”的值,以方便在修改是可以对主键进行修改,防止在改变主键后无法找到对应的整条数据信息。(四)查找功能:在“EmployeeForm”窗体中我们实现了根据多种条件进行查找,老师教我们用“AND”连接多个查询条件,而在查询条件首句我们添加了一句“string str = 1 = 1 ;”代码,这句话的作用是当首个查询条件为空时,不使“AND”打头。(五)基本表已经完成,开始进行主窗体的设计:创建“MainForm”窗体,将窗体的“IsMdiContainer”属性值设为“True”,此窗体就变成了一个父窗体。添加“MenuStrip”控件,设计菜单栏,分为“用户功能”、“雇员信息管理”、“窗口”、“帮助”等菜单,两次单击同一块地方就可以为菜单改名,在名称后添加“(&U)”即可为此选项设置希望快捷键,同时还可以在属性栏中设置含有“Ctrl”,“Alt”等键的快捷键。我们还为此窗体添加了“NotifyIcon”控件,可以在运行期间在Windows任务栏右侧的通知栏区域显示图标,图标可以通过属性栏中的“Icon”属性进行设定和修改。老师还准备在以后的课程中添加其他的功能,以获得更好的用户体验。(六)我们还设计了当单击“X”按钮时提示是关闭还是最小化的功能:我们在代码中设计了“MainForm_FormClosing”事件,当用户准备关闭窗体时,会触发这个事件,弹出对话框,让用户选择是退出还是最小化,单击“否”,则返回“No”,隐藏窗体,将程序最小化到托盘。单击“取消”,则取消关闭操作,返回关闭前状态。单击“是”,则取消关闭操作,返回关闭前状态。12月27日(星期五):(一)我们在今天设计了小图标:我们为小图标设计了双击事件“niMain_DoubleClick”,即当程序隐藏成小图标在通知栏时只需双击图标即可显示主窗体,当主窗体已经显示时,则无反应。在很多软件中右键单击小图标可以显示出菜单,所以我们也做了这样的设计。老师教我们在主窗体中添加“ContextMenuStrip”控件,来添加右键菜单,在其中有“登录”、“注销”、“打开工作管理”等选项,在这些事件中,老师都是教我们调用原来的主窗体的菜单中的事件来实现的。这样可以节省很多编写时间,防止出现错误,也减少了代码量。做到了一举多得。(二)我们实现了菜单上的各项功能:我们分别设计事件来实现菜单中的功能,其中值得一提的是,老师教我们使用了一个判断方法,在“mnuEmployee_Click”事件中添加“if(Application.OpenFormsEmployeeForm = null)”语句,使当一个子窗体已经打开时,如果再次单击此菜单选项,则不会再次弹出一个同样的子窗体,只会激活这个子窗体,也就是使它显示在最前。我们将同样的方法使用在了各个子窗体显示中。(三)完善查询雇员功能:老师又带领我们为“工作信息管理”,“出版社信息管理”等子窗体添加了一个新的按钮,如果事先在“工作信息管理”子窗体中选中了一个工作,只要单击“从事该工作的雇员”按钮,就会激活“雇员信息管理”子窗体,并自动查找出从事该工作的雇员。同时也同样设计了一个“if-else”的判断,如果“Application.OpenFormsEmployeeForm”为空,则表示“雇员信息管理”子窗体之前没有打开,则打开这个子窗体,否则,表示“雇员信息管理”子窗体之前已经是打开状态,程序将不会再重新打开一个新的子窗体,而只是将“雇员信息管理”子窗体设置为激活状态。在此处涉及到了两个窗体之间的传参问题,XXX同学完美的解决了这个问题。如果是A窗体传给B窗体:则在B中给B增加一条属性,在此我们使用的是“short JobID”只写属性,接收数据,然后找到B,并给B赋值,并用Activate激活B窗体。(四)在完善查询雇员功能时,我们又发现了新的问题:当我们在“出版社信息管理”子窗体,并进行测试时,我们只能查到一部分出版社信息。后来我和XXX还有XXX找到了原因是,在查找条件中,我们设置查找条件时忽略了“NULL”这个问题,“NULL”表示一个未知的值,并不等于什么都没有,所以会影响查询,当我们在某些查找文本框中什么都不添加时,默认查找条件为没有,但是“NULL”并不符合查询条件,所以很多含有“NULL”的数据条被筛选了下去,所以当不填写某些查询条件时,查询出来的结果就会导致不是很完整。最后通过使用“if-else”语句判断查询文本框中的值来解决了这个问题。通过这次出现的问题我发现,有很多时候并不是看起来能运行就没有错误了,对自己编写的程序要进行多次的实验,反复的尝试多种可能,有的时候就会发现意想不到的问题,而有些时候只检查代码是很难发现问题所在的,就比如这个程序,只有通过观察数据库中的值,比较没有查询出来的数据与查询出来的数据的各种区别才能发现问题,然后根据问题做出适当的改进。12月30日(星期一):(一)今天我们首先制作了登录界面,并实现了登录功能:首先我们设计了登录的窗口,在窗体的“StartPosition”属性中,我们设置为“CenterParent”,也就是在容器内居中,这样使该程序更加的美观,这个属性还可以设置为“CenterScreen”也就是在屏幕居中。我们设置“Employee”表中“Lname”为登录名,“Fname”为登录密码。点击“登录”后,通过“if-else”语句判断密码是否正确,以及用户名是否存在,如果密码错误,我们用“txtPassword.Clear();”语句将密码文本框清空,用“txtPassword.Focus();”语句将焦点移到密码文本框。如果登录名不存在,则将密码清空,将焦点移到登录名文本框,并选中之前的登录名,以方便用户使用。由于我们没有设计“注册”数据库表,所以我们借用了“Employee”表进行测试。如果我们点击“取消”按钮,则关闭该登录窗口。在很多的软件设计中,用户如果没有登录的话很多功能是不能使用的,所以老师也教我们设计了同样的功能,在登录之前除了“登录”、“注册”以及“退出”的其他菜单选项都是呈灰色的,也就是不可选的。只有进行了登录操作,并且用户名和密码都正确的情况下才能实现操作其他功能。这样的功能设计有效的保证了用户和系统信息的安全性。具体的实现功能是将希望在登录前都不可用的菜单项的“Enable”属性都设置为“False”,在登录后执行“Login”,使各项菜单栏的“Enable”属性都设置为“True”。当然,在登录后,登录功能就不需要了,所以在登录后,菜单栏的登录选项就可以变成灰色了。同时,在点击了“注销”按钮后,我们不但要将所有的菜单栏变成初始状态,同时也要收回之前已经打开的各个子窗体。至此登录功能基本完成,我们也实现了“雇员信息管理系统”的大部分功能,我们还分工合作,根据“Authors”表设计了“作者信息管理”等功能,并整合到了主窗体下。(二)其他方面的整理:观察很多微软公司的软件后,我们发现几乎所有的菜单栏下拉菜单都有分割条来划分各个功能,比如“注册”、“登录”、“注销”为一组,“修改密码”、“修改个人信息”为一组,退出单独为一组。所以我们在菜单栏中添加了分割条。具体操作只需要在菜单栏下拉菜单中点击右上角的小箭头即可选择。同时经过老师的提醒,和联想以前的话我们想到老师曾经提到的“左键单击,右键单击,注意边角”的话后,我们发现只要在菜单栏单击右键,就可以在两个已经编辑的菜单框中间插入新的框,以方便在客户有新的功能需求时,及时添加菜单选项。(三)“窗口”功能的实现:在“MainForm”也就是主窗体中我们设计了“窗口”这一功能。基本功能就和“Office”系列软件中的“Excel”软件中的功能一致,也就是如果我们打开了多个子窗体,则我们可以将各个打开的子窗体通过“水平平铺”、“垂直排列”、“层叠排列”等方式排列。具体的实现方法就是在各个“单击菜单栏事件”中添加“this.LayoutMdi(MdiLayout.TileHorizontal);”语句。“TileHorizontal”表示水平平铺,“垂直排列”,“Cascade”表示层叠排列。(四)完成整体功能:在实现“窗口”功能后,我们基本就将主窗体以及各个子窗体的设计界面完成了,在讲解的过程中我们基本体会程序员在编写的过程中的复杂性。我们会继续设计其他系统。以体验更多设计方法。12月31日(星期二):(一)项目总结:在之前的项目设计中,我们发现,虽然可以实现各个功能,但是对于某些细微的要求想要实现就很困难,比如在输入密码时要区分大小写等等细节功能的实现反而非常复杂。所以在设计下一个系统的时候,老师准备教我们使用另一种设计方法设计下一个“学生信息管理系统”。(二)设计方式:在“学生信息管理系统”的设计中,我们采用C/S的设计方法设计,设计分为界面层和数据访问层,界面层提供给用户一个视觉上的界面,通过界面层,用户输入数据、获取数据,并传给数据访问层。数据层定义、维护数据的完整性、安全性,它响应逻辑层的请求,访问数据。这一层通常由大型的数据库服务器实现,如“Oracle”、“Sybase”、“MS SQl Server”等。C/S 结构,即大家熟知的客户机和服务器结构。它是软件系统体系结构,通过它可以充分利用两端硬件环境的优势,将任务合理分配到Client端和Server端来实现,降低了系统的通讯开销。目前大多数应用软件系统都是Client/Server形式的两层结构,由于现在的软件应用系统正在向分布式的Web应用发展,Web和Client/Server 应用都可以进行同样的业务处理,应用不同的模块共享逻辑组件;因此,内部的和外部的用户都可以访问新的和现有的应用系统,通过现有应用系统中的逻辑可以扩展出新的应用系统。这也就是目前应用系统的发展方向。Client/Server是建立在局域网的基础上的,Browser/Server是建立在广域网的基础上的。(三)主窗体界面设计:主窗体的总体设计与“雇员管理系统”的主窗体大概一致,只是将菜单名改变,同样有“快捷键”、“窗口”、等功能,也同样是将主窗体设置成为一个父窗体。(四)关于界面设计:值得一提的是,在帮助菜单下拉列表中我们添加了“关于”功能,这项功能可以实现显示此程序的版本号、设计人员名称、LOGO、设计日期等相关信息。具体的设计方法与普通窗体设计略有不同,在“Microsoft Visual Studio”软件中,系统为我们提供了已经设计好的“关于”窗体,只要右键单击项目名点击“添加”选择“新建项”选中“关于框”就可以自动生成“关于”界面。只需要适当的修改图标、文本框内容等属性即可。(五)“学生信息管理”界面设计:我们在设计完主窗体后,就开始对“学生信息管理”进行基本的设计,也就是界面层的设计。在这里我们基本使用的都是与之前的“工作信息管理”基本一致的界面,所以设计基本界面的时候十分的方便,只要打开之前的“工作信息管理”然后进行简单的改名等操作即可完成。在这里我们深深的发现有得时候如果懂得利用以前的资源,就可以节省很多时间,减少编写代码的量。在这个界面上与之前稍有不同的地方是添加了性别。性别录入使用了“RadioButton”控件。这个控件的具体使用方法是当与其他单选按钮成对出现时,允许用户从一组选项中选择单个选项,其中“一组”的意思是,所有在同一容器内的这个控件,都称为一组,也就是只能选择其中一项,因为人的性别只能是男性或女性其中一种,所以选择了“RadioButton”单选按钮控件。1月2日(星期四):(一)继续完成“学生信息管理”窗体的界面设计:由于我们在学生表中有密码项,为了符合大众软件的习惯,也为用户的信息安全性着想,所以我们将密码输入文本框的“PasswordCard”属性设置为“*”,设置此属性后,当用户在输入密码文本的时候,文本信息不会显示在密码文本框中,输入的值将以“*”的形式展现出来。(二)“学生信息管理”界面层其他方面设计:在设计中我们在加入新的学生信息的时候我们为输入的密码设计了密码验证功能if (txtStuPassword.Text.Equals(txtVPassword.Text) = true) stu.Password = txtStuPassword.Text; else MessageBox.Show(两次密码输入不一致,请确认!); return; 使用“Equals”判断,如果输入的密码与输入在验证密码中的字符一致,则将密码赋值给数据库,否则提示“两次密码输入不一致,请确认!”这项功能的判断是为了使用户如果偶然输入错误密码,系统可以自动判断识别,提示用户,进行重新输入。(三)“学生信息管理”“Entity”设计:因为是C/S结构设计,所以我们新建了两个类库,只需单击“文件”选择“新建”选中“项目”,然后在“模版”模块下选择“类库”,这里需要注意的是我们不再是“创建新解决方案”而是选择“添入解决方案”将新建的类库加入已经创建的“StudentsApp”项目中。我们新建了“Entity”实体层和“DAL”数据访问层,其中实体层负责承载数据。(四)“学生信息管理”“DAL”设计在此层中我们分别实现与数据库连接的的各项功能。如根据班级编号查询学生信息的方法中,首先我们需要实例化一个SQL数据库连接,然后实例化一个SQL命令,还需要实例化一个数据读取器。然后我们为各个对象赋值,以达到连接数据库,并对其下达命令的功能。在打开数据库连接后,我们读取一个数据库中的数据,并赋值给之前实例化的数据读取器。然后使用“while”循环语句判断数据库中的数据是否已经读取完毕,如果“dr.Read()”中没有数据,则结束此循环。最后用“return”语句将表单返回。其他功能与数据库的连接与查询的代码相似,存在区别是使用了“ExecuteNonQuery()”语句,通过返回受影响行数来判断是否添加或删除成功。在此,我们需要用“try-catch”判断数据是否提取成功。如果不成功,我们需要提示用户异常原因,我们需要将异常抛出,返回到界面层,由于操作层无法显示异常,所以我们要“new”一个异常,把异常原因放入此对象中,再将此对象抛出。为了防止有人恶意篡改代码,在输入的文本中添加恶意代码,防止注入攻击,我们使用SQL参数,以保证安全。在此我们着重实现了登录的功能,在“LoginByStudentIDAndPassword”方法中,我们使用“string sql = select StudentID,Password from Students where StudentID = StudentID and Password = Password ;”语句判断是否存在一条数据的登录名和登录密码与输入的登录名和登录密码一致。使用“ExecuteScalar()”语句,如

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论