正文
第一章:WinForm基础
一、概述
1、Windows Form(简称WinForm)
是微软.NET平台下用于开发"图形界面"应用程序的组件。
2、C/S架构
客户机(Client)/服务器(Server),是软件系统体系结构。
通过它可以充分利用两端硬件环境的优势,将任务合理分配到Client端和Server端来实现,降低了系统的通讯开销。
二、在VS中新建窗体程序
1、认识窗体程序(第一个窗体程序)
1)窗体设计器:设置窗体界面(经常操作)
每个窗体都有对应的后台代码
shift + F7 / F7:查看源码
注:在窗体后台代码中,存在方法:InitializeComponent()
它的作用是:对当前窗体的控件进行初始化工作,此方法不能丢,否则窗体不能正常显示控件,如果要重载构造方法 ,在重载构造方法中也必须调用此方法。
F12查看方法的定义
2)工具箱:包含了程序所需的控件
操作:
2.1)选择控件,向窗体设计器拖动
2.2)双击控件
注:在WinForm中,所有的控件,包括窗体都是对象
3)解决方案资源管理器
3.1)项目
3.2)Properties:对当前项目的属性进行设置
3.3)引用
3.4)Resources:资源信息
3.5)窗体程序 --> Xxxx.cs
3.6)主程序(窗体程序的入口):Programe.cs,设置启动窗体:
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new 窗体名称());
}
4)属性面板
对控件进行相关的设置(经常操作)
选择不同的控件,属性面板的属性会不一样
左边是属性名,右边是属性值(需要用户设置)
5)事件:单击,双击,鼠标移动,离开,经过,键盘相关事件
表示触发程序执行的某件事发生的信号,如单击
控件包含:属性,方法,事件
2、开发窗体程序的步骤
1)新建窗体程序项目
2)打开窗体设备器,添加控件(工具箱)
3)选择控件,设置属性
注:在实际开发中,一般都会给控件取一个有意义的名字,便于调用
4)选择控件,添加相应事件(单击,双击,鼠标移动,离开,经过,键盘相关事件)
5)在事件方法中,编写代码实现业务功能
基于面向对象的思想来编写程序
控件是对象
对象名.属性 = 值 ;
对象名.方法() ;
控件名.属性 = 值 ;
控件名.方法() ;
6)根据需求重复以上工作
7)运行、测试
3、在后面章节,我们主要学习控件(对象)的三方面的内容
1)属性
2)方法
3)事件
三、窗体(Form)
1、常用属性
1)窗体名称:Name
注:在实例开发中,不要使用默认的名字,建议定义一个有意义的名称,方便调用
命名规范:frmXxxx
2)窗体标题 : Text
3)背景颜色 : BackColor
4)设置窗体背景图片:BackgroundImage
BackgroundImageLayout:设置背景图片布局
5)修改窗体的大小:Size(Width、Height)
6)设置按Enter键时所单击窗体上的按钮:AcceptButton
7)窗体的图标:Icon*.ico
8)窗体边框样式:FormBorderStyle
Fixed3D:固定的三维边框
FixedDialog:固定的对话框样式的粗边框
FixedSingle:固定的单行边框
FixedToolWindow:不可调整大小的工具窗口边框
None:无边框
Sizable:可调整大小的边框
SizableToolWindow:可调整大小的工具窗口边框
9)控件窗体的显示位置:StartPosition
CenterParent:窗体在其父窗体中居中
CenterScreen:窗体在屏幕中居中
Manual:由Location属性确定
WindowsDefaultBounds:Windows默认位置,其边界由Windows默认决定。
WindowsDefaultLocation:Windows默认位置,其尺寸在窗体大小中指定。
10)控件窗体的最大化和最小化
MaximizeBox
MinimizeBox
11)设置窗体启动时,默认是最大化还是最小化:WindowState
Normal:还原窗口
Minimized:最小化窗口
Maximized:最大化窗口
12)控件窗体总在最前:TopMost
13)设置窗体透明度:Opacity
2、窗体的方法(必须要实例化对象访问)
1)显示窗体
模式窗体:ShowDialog():只有关闭当前窗口才能访问另一个窗口
非模式窗体:Show()
2)Hide():隐藏窗体,不破坏窗体,也不释放资源
3)Close():关闭窗体,释放资源
3、事件
1)Activated:窗体激活
2)Load:窗体加载
3)FormClosing:窗体关闭
第二章(上):控件与窗体
一、文本编辑控件
1、标签:Label
1)作用:用于显示文字(标签、标题)
2)常用属性:
Text:设置显示的文本内容
ForeColor:设置前景颜色
AutoSize:是否自动调整大小
Font:设置字体
2、按钮:Button
1)作用:提供用户通过单击来执行各种各样的操作
2)常用属性:
BackgroundImage:背景图像
BackgroundImageLayout:设置背景图像的布局样式
FlatStyle:设置平面样式外观
Text:设置显示的文本内容
TextAlign:对齐方式
Enabled : 设置按钮是否可用
3)常用事件:
click
3、文本框:TextBox
1)作用
提供用户输入数据,或显示数据
默认单行
最多可以接收32767个字符
不包括制表符、图片
可以实现密码输入效果
2)常用属性
Text:设置/获取文本框中的内容
MaxLength:输入最大字符数
ReadOnly:是否只读(不可编辑)
PasswordChar:密码字符
MultiLine:是否为多行文本框
ScrollBars:为多行文本框时,设置滚动条
3)常用方法
Focus():获取焦点
Clear():清除文本框内容
4)常用事件
TextChanged:Text属性更改时发生
leave:当焦点离开控件时触发
4、富文本框:RichTextBox
1)作用
功能同上,比TextBox功能更强大
默认是多行
最多可以接收2147483647个字符
包括制表符、图片
无法实现密码输入效果
2)常用属性
3)常用方法
4)常用事件
Bitmap bmp = new Bitmap(@"D:\test\20140226082603.jpg");
Clipboard.SetDataObject(bmp);
DataFormats.Format dataFormat = DataFormats.GetFormat(DataFormats.Bitmap);//格式
if (richTextBox1.CanPaste(dataFormat))
richTextBox1.Paste(dataFormat);
二、图片框:PictureBox
1)作用
显示图片
支持bmp、jpeg、gif、png等格式
2)常用属性
Name : 控件名称,前缀pic
Image : 控件显示的图片
Image.FromFile("c:\1.jpg") ;
SizeMode:控制PictureBox将如何处理图片位置和控件大小
3)常用方法
4)常用事件
三、定时器:Timer
1)作用
控制每隔一段时间做某些操作
2)常用属性
Name : 控件名称
Enabled : 启用定时器
Interval : 设置时间间隔,单位是毫秒
1秒 = 1000毫秒
3)常用方法
4)常用事件
Tick : 每隔一段时间,所做的事情在此事件中实现
5)操作步骤:
第一:拖Timer控件到窗体中
第二:设置时间间隔--Interval
第三:添加Tick事件,实现每间隔一段时间所做事情(功能)
第四:启用定时器--Enabled=true ;
注:
1>各个控件必须指定Name属性值,便于调用
2>控件就是对象,因此,可以通过以下代码来设置属性:
设置属性:控件名.属性 = 值 ;
获取属性: 数据类型 变量名 = 控件名.属性 ;
3>控件都有以下三个特性:
属性
方法 -> [数据类型 变量名 = ]控件名.方法名([参数列表]) ;
事件
4>不规则窗体的移动
鼠标坐标位置:MousePosition
窗体坐标位置:Location
坐标对象:Point
鼠标按下事件:MouseDown
鼠标移动事件:MouseMove
第二章(下):继续控件
一、选择控件
1、单选框:RadioButton
1)作用:互斥选择一个内容
2)常用属性
Checked:是否已经选择
Text:显示内容
Appearance : 显示样式
3)常用事件
CheckedChaged:更改选择时发生
Click : 单击事件
注:在当前窗体默认只有一组单选框,可以结合GroupBox和Panel控件实现多组单选框。
2、多选框类:CheckBox
1)作用:选择多个内容
2)常用属性:
Checked:选择
Text:内容
Appearance : 显示样式
3)常用事件
Checkedchanged:更改选择时发生
二、列表控件
1、下拉列表(组合框):ComboBox
1)作用:用于下拉显示数据
2)常用属性:
Items:下拉列表的所有内容
Items.Count : 选项数量
MaxDroDownItems:设置下拉显示内容的数量
DropDownStyle:设置下拉列表框样式(不可编辑)
SelectedItem:当前选定的内容
SelectedIndex:设置/获取列表选中内容的下标索引(从0开始)
3)常用方法
ComboBox对象.FindString(内容) : 查找内容对应的下标位置(从0开始),如果找不到返回-1;
ComboBox对象.FindString(内容,下标位置) : 从指定下标位置开始查找内容对应的下标位置,如果找不到返回-1;
ComboBox对象.Items.Add(内容) : 添加内容;
ComboBox对象.Items.AddRange(new string[]{项1,项2,...,项n}) ;
ComboBox对象.Items.Insert(下标索引,内容) : 在指定索引位置添加内容;
ComboBox对象.Items.Remove(内容) : 删除内容;
ComboBox对象.Items.RemoveAt(下标索引) : 根据下标索引删除内容;
ComboBox对象.Items.Clear() : 清空内容;
4)常用事件
SelectedIndexChanged:改变下拉列表框时发生的事件
2、列表选择控件:ListBox
1)作用:把数据以列表的形式显示,用户可以选择其中的数据
2)常用的属性:
Items:列表框的所有内容,是ArrayList类对象,内容是字符串
Items.Count:所有选项的数量
SelectedItems:获取包含ListBox中当前选定项的集合
SelectedItems.Count : 选中选项的数量
SelectedIndex : 设置/获取列表选中内容的下标索引(从0开始)
SelectedItem :返回当前选定的某一项,如果没选中,则发生异常
Text : 返回当前选定的某一项,如果没选中,则返回空字符串
SelectionMode:设置可选的条目数
Sorted:是否以字母的顺序排序
3)常用的方法
同ComboBox控件
ListBox对象.SetSelected(下标索引,bool) : 选择或取消选择某项内容。
三、菜单栏和快捷菜单
1、菜单栏:MenuStrip
文件(&F):添加快捷提示 -> alt + F
-:菜单分隔符
ShortcutKeys:设置快捷键
2、快捷菜单:ContextMenu
第一:设置菜单 (同上)
第二:关联控件 -> ContextMenuStrip属性
四、多窗体的实现(重点、难点)
1、面向对象的复习
1)类和对象
类:类是对象的概括(类是对象的模板)->抽象的、模糊的、不具体的
对象:对象是类的实例->具体的,实际存在的
注:概括:有用的,本质的,共同的
学生是一个类
每个学生都是一个对象
面向对象的操作步骤:
第一:定义类(对象的概括)
[访问修饰符] class 类名
{
//1.字段 -> 类(对象)的具体数据(信息)
private 数据类型 字段名 ;
//2.属性 -> 是对字段的封装,对字段数据进行访问
public 数据类型 属性名
{
set {字段名=value;}
get {return 字段名;}
}
//3.方法 -> 是类(对象)实现的功能(业务)
[访问修饰符] 数据类型 方法名([数据类型 形参1,...,数据类型 形参N])
{
方法体 -> 具体功能的实现
[return 数据;]
}
注:在方法内,如果没有返回值,则数据类型声明为void
}
注:
类的访问修饰符:public 、 internal(默认)
类名、属性名、方法名使用帕斯卡名称规则
字段名使用驼峰名称规则
属性与字段息息相关(名称一般一样)
特殊方法:构造方法
方法名与类名相同
没有返回值
不能手动调用,在实例化对象时自动调用
在实例化对象的同时,初始化对象
在类中,如果用户没有定义构造方法,则默认存在一个构造方法
语法如下:
public 方法名类名
{
}
第二:实例化对象(创建对象)
类名 对象名 = new 类名() ;
第三:初始化对象 -> 给对象的字段赋值
对象名.属性 = 值 ;
第四:操作 -> 调用方法
[数据类型 变量名 = ]对象名.方法名([参数列表]) ;
2、建立多窗体程序
//第一:创建窗体对象
窗体类 窗体对象 = new 窗体类() ;
//第二:显示窗体
窗体对象.Show() ;
或
窗体对象.ShowDialog() ;
或
if(窗体对象==null || 窗体对象.IsDisposed)
{
窗体对象 = new 窗体类() ;
窗体对象.Show() ;
}
3、传参 -> 构造方法
第一:创建窗体对象,把数据放在构造方法中传递
窗体类 窗体对象 = new 窗体类(数据1,数据2,...,数据n) ;
注:
在窗体类中,默认只有一个缺省的构造方法(没有参数的构造方法)
在窗体类中,必须存在对应的构造方法,且InitializeComponent()不能丢
第二:在窗体类中,定义对应参数的构造方法
第三:在窗体类中,定义对应的全局变量,接收构造方法获取的参数数据
第四:使用传递过来的数据->调用全局变量
第五:调用方法,显示窗体
窗体对象.Show() ;
注意:
1)如果要传递多个数据,且这些数据都是相关的,我们一般把这些数据封装成相关的对象进行传递。
2)如果在第二个窗体中,要操作第一个窗体,怎么办呢?
在创建第二个窗体实例对象时,通过构造方法,把第一个窗体传递过去:
窗体类 窗体对象 = new 窗体类(this) ;
窗体类 窗体对象 = new 窗体类(this,数据1,...,数据N) ;
4、返回值
第三章:文件的读写
一、概述
1、流:相当于一个管道,C#程序通过流来读写文件
流,分为:
输入流 : 相当于程序而言,数据从文件写入到程序这个过程
输出流 : 相当于程序而方,数据从程序输出到文件中的过程
2、FileStream对象
FileStream对象表示在磁盘或网络路径上指向文件的流(指向要操作的文件);
在FileStream的基础上,使用StreamReader或StreamWriter实现文件的读写(字节方式)。
FileStream 对象 = new FileStream(String path,FileModel model[,FileAccess access,FileShare share])
参数说明:
path:指向要操作的文件(路径+文件名)
model:打开文件的方式
access:访问文件的方式
share:文件共享方式
二、文件的读取(StreamReader)
1、语法
StreamReader 对象 = new StreamReader(Stream stream[,Encoding.字符编码]) ;
StreamReader 对象 = new StreamReader(filename[,Encoding.字符编码]) ;
参数说明:
stream : 要读取的文件流(FileStrem是其中的Stream)
filename : 路径+文件名
Encoding : 字符编码
2、方法
ReadLine() : 一行一行地读取文件,读到文件的末尾时,返回null
ReadToEnd() : 从文件的开始到末尾,一次性读取
Close() : 关闭流
三、文件的写入(StreamWriter)
1、语法:
StreamWriter 对象 = new StreamWriter(Stream stream) ;
StreamWriter 对象 = new StreamWriter(Stream stream,bool append,Encoding encoding) ;
StreamWriter 对象 = new StreamWriter(string filename,bool append,Encoding encoding) ;
参数说明:
stream : 要写入文件的流
append : 是否追加
encoding : 字符编码
filename : 路径+文件名
2、方法
Write() : 写入数据
WriteLine() : 写入数据并换行
flush() : 清空缓冲区
Close() : 关闭流
四、快速文件操作
1、文件写入
1)File.AppendAllText(string path,string content,Encoding encoding)
path : 路径+文件
content : 向文件添加的内容
encoding : 编码
添加内容到文件,如果文件存在,追加内容到文件,最后关闭文件;
如果文件不存在,则创建文件并添加内容到文件,最后关闭文件
File.AppendAllText("e:\bb.txt","你好",Encoding.Default);
2)File.WriteAllBytes(string path,byte[] bytes)
File.WriteAllBytes("e:\bb.txt", Encoding.Default.GetBytes("你好"));
3)File.WriteAllLines(string path,string[] content,Encoding encoding) ;
string[] str = { "我", "好" };
File.WriteAllLines("e:\bb.txt", str, Encoding.Default);
4)File.WriteAllText(string path,string content,Encoding encoding) ;
File.WriteAllText("e:\bb.txt", "好好学习", Encoding.Default);
2、文件读取
1)File.ReadAllText(string path[,Encoding encoding]) ;
String str = File.ReadAllText("e:\bb.txt",Encoding.Default);
2)File.ReadAllBytes(string path) ;
byte[] str = File.ReadAllBytes("e:\bb.txt");
MessageBox.Show(System.Text.Encoding.Default.GetString(str));
3)File.ReadAllLines(string path[,Encoding encoding]) ;
string[] str = File.ReadAllLines("e:\bb.txt", Encoding.Default);
MessageBox.Show(string.Join(",",str));
3、文件操作
1)File.Encrypt(string path) : 加密文件
2)File.Decrypt(string path) : 解密文件
3)File.Exists(string path) : 判断文件是否存在
4)File.Delete(string path) : 删除文件
5)File.Copy(string sourceFile,String DestFile) : 复制文件
第四章:ADO.NET
一、ADO.NET概述
1、概述
(ActiveX Data Objects),数据库访问的方法和技术(组件)。
2、组成
1).NET框架数据提供程序(.NET Framework Data Provider)
2)数据集(DataSet)
注:
2.1)以上两个组成部分包含相关的数据库操作对象,如:
Connection:连接数据库
Command:执行SQL语句
DataReader:读取查询结果
DataAdapter:桥接数据库与数据集的联系,把数据库中的数据填充到DataSet中
DataSet: 数据在内存中缓存
...
2.2)SQL Server的数据提供程序中,其命名空间为:System.Data.SqlClient
SqlXxxxx
二、连接对象(SqlConnection)
连接SQL Server数据库
System.Data.SqlClient
三、配置文件
1、在项目中新建一个配置文件,命名为:App.config
右键项目 -> 添加 -> 新建项 -> 应用程序配置文件 -> 确定
注意:如果项目中已经存在App.config文件,则不需要添加
2、在App.config文件中,进行配置
方式一:
说明:
1)connectionStrings : 表示定义连接字符串
2)add : 添加具体的连接字符串
name : 字符串的名称
connectionString : 连接字符串的具体内容
3)相当于在App.config文件中定义:
string dbstr = "Server=.;uid=sa;pwd=;DataBase=abc" ;
方式二:
3.在程序中,读取App.config文件中的连接信息
string str1 = ConfigurationSettings.AppSettings["dbstr"];
string str2 = ConfigurationManager.AppSettings["dbstr"];
string str3 = ConfigurationManager.ConnectionStrings["dbstr"].ConnectionString;
注意:需要在项目中,添加引用System.Configuration,操作如下:
右键项目 -> 添加 -> 引用 -> 勾选System.Configuration -> 确定
四、异常处理
特殊的程序控制语句: 程序出错了,保证程序能正常的执行,而不会被终止
try
{
有可能发生错误的代码 ;
conn.Open() ;
....
conn.Close() ;
}
catch(Xxxxx x)
{
对错误进行相关的处理
}
[
finally
{
不管正确与否,都会被执行->一般用于释放资源
conn.Close() ;
}
]
注:Xxxxx表示的异常的种类
Exception : 能捕获所有的异常
第五章:知识巩固
一、Connection对象
1、使用SqlConnection对象连接数据库
第一步:字义连接数据库字符串
第二步:创建连接对象并,打开数据库连接,详细参数如下表所示:
第三步:做相关操作
参数 | 说明 |
---|---|
Provider | 这个属性用于设置或返回连接提供程序的名称,仅用于OleDBConnection对象 |
Connection Timeout | 在终止尝试并产生异常前,等连接到服务器的连接时间长度(以秒为单位),默认值是15秒 |
Initial Catalog或DataBase | 连接数据库的名称 |
Data Source或Server | 连接打开使用的SQL Server名称 |
Password或pwd | 连接数据的密码 |
User ID或uid | SQL SERVER 登录帐户 |
2.使用OleDbConnection对象连接数据库
第一步:定义连接数据库字符串
第二步:打开数据库连接,详细参数如下表所示:
第三步:相关操作
第六章:复习提升
一、Command对象(SqlCommand)
1、作用
设置和执行SQL语句的对象。
2、常用属性
CommandType:获取和设置Command对象要执行命令的类型
CommandText:获取和设置要对数据源执行的SQL语句或存储过程名或表名
CommandTimeOut:获取和设置在终止对执行命令的尝试并生成错误之前的待时间
Connection:获取或设置Command对象使用的Connection对象的名称
Parameters: 获取Command对象需要使用的参数集合
Transaction:获取或设置将在SqlCommand对象执行的SqlTransaction对象
3、常用方法
ExecuteNonQuery:用户执行非Select命令,返回受影响的数据行数
ExecuteScalar:用于执行Select命令,返回数据中第一行第一列的值
ExecuteReader:执行Select命令,并返回一个DataReader对象
4、使用
类名 对象名 = new 类名() ;
SqlCommand cmd = new SqlCommand() ;
SqlCommand cmd = new SqlCommand(string sql) ;
SqlCommand cmd = new SqlCommand(string sql,SqlConnection conn) ;
SqlCommand cmd = new SqlCommand(string sql,SqlConnection conn,SqlTransaction tran) ;
5、实现CRUD的操作
第一:创建连接对象 -> SqlConnection
1)定义连接字符串
string dbstr = "server=.;uid=sa;pwd=123;database=xsgl" ;
2)创建SqlConnection并设置连接字符串
SqlConnection conn = new SqlConnection(dbstr) ;
3)打开连接
conn.Open() ;
第二:创建语句对象 -> SqlCommand
1)创建语句对象
SqlCommand cmd = new SqlCommand() ;
2)设置属性
cmd.CommandText = "SQL语句" ;
cmd.Connection = 连接对象 ;
第三:执行SQL语句 -> 返回受影响的记录数/DataReader对象
命令对象.ExecuteNonQuery() ;
或
命令对象.ExecuteScalar() ;
或
命令对象.ExecuteReader() ;
第四:关闭对象
连接对象.Close() ;
二、MD5加密
1、引用命名空间
using System.Security.Cryptography ;
2、操作
//第一:创建Md5加密对象
MD5CryptoServiceProvider md5 = new MD5CryptoServiceProvider();
//第二:把加密的数据转换为字节数组
byte[] bytes = Encoding.UTF8.GetBytes("明文");
//第三:对字节数组进行加密
byte[] newBytes = md5.ComputeHash(bytes);
//第四:把字符数组转换字符串,输出结果
MessageBox.Show(BitConverter.ToString(bytes));
注:MD5加密后,得到一个32位的十六进制的字符串
三、Parameter对象(SqlParameter)
1、作用:给SQL语句设置参数
2、好处
1)操作方便
2)防止SQL注入,提高安全性
3)提高查询执行性能
3、使用-创建对象(构造方法)
SqlParameter param = new SqlParameter() ;
SqlParameter param = new SqlParameter(参数名称,数据类型) ;
SqlParameter param = new SqlParameter(参数名称,数据) ;
SqlParameter param = new SqlParameter(参数名称,数据类型,大小) ;
4、常用属性
Direction:获取或设置一个值,该值表示参数是只可输入、只可输出、双向还是存储过程返回值参数。
ParameterName:获取或设置参数的名称。
Size:获取或设置列中数据的最大大小。
SqlDbType:获取或设置参数的数据类型,语法:SqlDbType.Xxxx。
Value:获取或设置该参数的值。
5、常用方法
Command对象.Parameters.add(Parameter对象) ;
Command对象.Parameters.AddRange(Parameter对象数组) ;
6、操作
第一:定义参数化的SQL语句,参数的语法:@参数名称
string sql = "insert into student(name,age) values (@xm,@age)" ;
第二:创建SqlParameter对象或SqlParameter对象数组
SqlParameter param1 = new SqlParameter("@xm","张三") ;
SqlParameter param2 = new SqlParameter("@age",18) ;
或
SqlParameter[] ps =
{
new SqlParameter("@xm","张三"),
new SqlParameter("@age",18)
}
第三:添加参数
Command对象.Parameters.add(param1) ;
Command对象.Parameters.add(param2) ;
或
Command对象.Parameters.AddRange(ps) ;
四、DataReader对象(SqlDataReader)
1、作用:读取查询的数据
2、特点
只读(而DataSet可读可写)
以流的方式,单向读取
一次只能读取一条记录
3、使用
通过Command对象的ExecuteReader()方法返回(创建)DataReader对象
SqlDataReader reader = new SqlDataReader() ;
4、常用属性
FieldCount:返回列数(字段数量)
HasRows:是否存在数据(记录、行)
IsClosed:DataReader对象是否关闭
5、常用方法
Read():读取记录中的数据
Close():关闭DataReader对象
GetValue(字段的下标索引):获取指定字段的数据
GetValues():获取全部字段的数据
IsNull("userId"):判断指定字段的数据是否为Null值
6、操作
第一:执行查询的SQL语句,获取DataReader对象的实例
SqlDataReader reader = Command对象.ExecuteReader() ;
第二:循环的读到数据
while(reader.read()
{
//读取数据
}
注:读取数据的方式有:
方式一:通过下标读取(下标从0开始)
数据类型 变量 = (数据类型)SqlDataReader对象[下标] ;
方式二:通过字段名称读取
数据类型 变量 = (数据类型)SqlDataReader对象["字段名称"] ;
第三:关闭SqlDataReader对象
reader.Close() ;
第七章:记事本开发
https://www.cnblogs.com/xdzy/p/9458683.html