- 总结本课程所有学到的知识
(1)C#数据库编程技术
①ADO.NET访问数据库
- 使用using添加System.Data及其相关子命名空间的引用(如System.Data.SqlClient)
- 使用Connection对象连接数据源
- 使用Command对象、DataReader对象或DataAdpter对象、DataSet操作数据库
- 将操作结果返回到应用程序中,进行进一步处理
注意:学会利用try…catch…finally语句块
在try…catch…finally语句块中,使用try语句打开数据源的连接,使用catch语句捕获异常,使用finally语句确保关闭数据源的连接。
②LINQ to SQL访问数据库
- 添加LINQ to SQL组件
- 创建对象模型
- 应用对象模型:先创建DataContext类的实例,再创建并执行LINQ查询,实现具体的
数据的查询、增加、更新和删除。
(2)文件读写
注意:处理文件输入/输出时,最重要的类型为FileStream类。
FileStream类的常用构造方法有两个,语法格式如下:
FileStream(string path,FileMode mode)
FileStream(string path,FileMode mode,FileAccess access)
①文本文件读写
StreamReader类:
方法:
public override void Close()
//关闭 StreamReader 对象和基础流,并释放任何与读者相关的系统资源
public override int Peek()
//返回下一个可用的字符,但不使用它
public override int Read()
//从输入流中读取下一个字符,并把字符位置往前移一个字符
文件的读取操作步骤:
1.导入命名空间 using System.IO;
2.获取文件流 FileStream fs = new File(path,FileMode.Open);
3.获取读对象 StreamReader sr = new StreamReader(fs);
4.执行读操作 string s = sr.ReadToEnd();
5.关闭读对象 sr.Close();
6.关闭文件流 fs.Close();
StreamWriter类:
方法:
public override void Close()
//关闭当前的 StreamWriter 对象和基础流
public override void Flush()
//清理当前编写器的所有缓冲区,使得所有缓冲数据写入基础流
public virtual void Write()
//把文本写入到文本字符串或流
public override void Write( )
//把字符写入到流
public virtual void WriteLine()
//把行结束符写入到文本字符串或流
文件的写入操作步骤:
1.导入命名空间 using System.IO;
2.获取文件流 FileStream fs = new FileStream(path, FileMode.Create);
3.或者写入的类 StreamWriter sw = new StreamWriter(fs);
4.执行写入的方法 sw.WriteLine(“sdasds”);
5.关闭写入的类 sw.Close();
6.关闭文件流 fs.Close();
②二进制文件读写
BinaryWriter类:以二进制形式将基元类型写入流,并支持用特定的编码写入字符串。
常用方法:
Close();//关闭当前的BinaryWriter和基础流
Seek(); //设置当前流中的位置
Write();//将值写入当前流
调用:
FileStream fs = new FileStream(@"d:\data\bookinfo.dat", FileMode.Append, FileAccess.Write);
BinaryWriter bw = new BinaryWriter(fs);//创建二进制文件流写文件
BinartReader类:用特定的编码将基元数据类型读作二进制值
常用方法:
Close();//关闭当前阅读器及基础流
Read(); //从基础流中读取字符,并提升流的当前位置
ReadBytes();//从当前流将count个字节读入字节数组,使当前位置提升count个字节
ReadInt32();//从当前流中读取4个字节有符号整数,并使流的当前位置提升4个字节
ReadString();//读取一个字符串。字符串有长度前缀,一次7位地被编码为整数
调用:
FileStream fs = new FileStream(@"d:\data\bookinfo.dat", FileMode.Open, FileAccess.Read);
BinaryReader br = new BinaryReader(fs);//创建二进制文件流读文件
- 序列化和反序列化
相关对象和步骤:
使用Binary(命名空间System.Runtime.Serialization.Formatters.Binary)来序列化和反序列化对象。 对象序列化编程的基本步骤为:首先用Serialzable属性把包含数据的类标记为可序列化的类,如果期中某个成员不需要序列化,则使用NonSerialized来标识。然后调用BinaryFomatter或Soapformatter的Serialize方法实现对象的序列化,反序列化时,则调用Deserialize方法。
- 遇到的问题及解决方法
- 在窗体的运行过程中,多出出现无法将obj下的.exe文件复制到bin下的.exe文件下:
经查询资料,分析是因为login窗体没有关闭是,造成线程冲突;
解决方法:
先在任务管理器中将ManagerForm.exe进程结束,重启vs项目后,在ManagerForm的closing事件中添加上如下代码:
- 在对文件进行读写操作时,要引入一下命名空间:
- 当对信息表进行修改操作时,出现错误“不能在对象dbo.book中插入重复键”;
为了避免这个错误,将book_id设置如下:
防止修改或删除操作再次出现错误。
- 对用户输入的合法性检验:采用try catch方法:
3.收获和感受
本学期主要运用C#语言,结合.NET开发平台在WinForm窗体上实现操作功能。或许页面布局都是图形化操作,只需要简单的拖动和设置属性来完成,所以整体上相较于上学期的web技术开发更加好上手。也是基于C#语言的自身特点,面向对象的、面向组件的、结构化语言。
目前正在将这部分知识继续开发,现在只是一个信息管理模块,但是基于软工的学习部分,我了解到窗体程序可以使用B/S架构继续搭建系统。程序代码会更加规范、清晰化;内容也更加简洁干练。在进行模块开发时,总结自己注意到的一些问题。包括:成员变量的初始化尽可能放在构造函数中,不要在声明的时候初始化。当主窗口的名字设置为Mainform.cs时,子窗口的名字最好设置为F+名字.cs。注意做好文本框的参数检查。成员变量(包括控件变量)一律加this,局部变量不加。如果考虑到要对程序进行移植便利性问题,就尽量不要在属性页做编辑,而是用代码实现。但是还有些问题就是,WinForm窗体的界面美化比较难实现,如果在属性页里进行操作,图片显示的分辨率低,系统也时常闪退。道阻且长,继续努力。