一、思维导图
二、知识点描述
1、相关控件
①下拉框(ComboBox)
显示一个可编辑的文本框,其中包含一个允许值下拉列表。
②日历框(DateTimePick)
允许用户选择日期和时间,并以指定的格式显示该日期和时间。
③文本框(TextBox)
允许用户输入文本,并提供多行编辑和密码字符掩码功能。
④图片框(PictureBox)
指定支持事务处理初始化,允许用户加载图片。
⑤单选框(RadioButton)
当与其他单选按钮成对出现时,允许用户从一组选项中选择单个选项。
⑥标签(Label)
为控件提供运行时信息或说明性文字。
1.读取数据
(1)使用命令按钮button和文本框textbox直接输出数据
首先在窗体上添加文本框控件以显示输出的数据,然后添加一个命令按钮控件,在命名按钮下编写下列代码:
private void btn_Load_Click(object sender, EventArgs e) { SqlConnection sqlConnection = new SqlConnection(); //声明并实例化SQL连接; sqlConnection.ConnectionString = "Server=(local);Database=EduBase48;Integrated Security=sspi"; //在字符串变量中,描述连接字符串所需的服务器地址、数据库名称、集成安全性(即是否使用Windows验证); SqlCommand sqlCommand = new SqlCommand(); //声明并实例化SQL命令; sqlCommand.Connection = sqlConnection; //将SQL命令的连接属性指向SQL连接; sqlCommand.CommandText = "SELECT * FROM tb_Student WHERE No=@No;"; //指定SQL命令的命令文本; sqlCommand.Parameters.AddWithValue("@No", "3160707048"); //向SQL命令的参数集合添加参数的名称、值; sqlConnection.Open(); //打开SQL连接; SqlDataReader sqlDataReader = sqlCommand.ExecuteReader(); //调用SQL命令的方法ExecuteReader来执行命令,并获取数据阅读器; if (sqlDataReader.Read()) //若数据阅读器成功读取到下一条记录(首次查询则表示第一条记录); { this.txb_No.Text = sqlDataReader["No"].ToString(); //在数据阅读器的索引器中指定列名,从而访问当前记录的指定列的值,并赋予相应控件; this.txb_Name.Text = sqlDataReader["Name"].ToString(); this.txb_Gender.Text = sqlDataReader["Gender"].ToString(); this.txb_BirthDate.Text = ((DateTime)sqlDataReader["BirthDate"]).ToShortDateString(); //生日首先转换为日期时间类型,再调用ToShortDateString方法获取日期部分; this.txb_Class.Text = sqlDataReader["Class"].ToString(); this.txb_Speciality.Text = sqlDataReader["Speciality"].ToString(); } sqlDataReader.Close(); //关闭数据阅读器(同时关闭连接); }
(2)单选框radiobutton输出数据
使用单选框输出性别
首先将数据库中的性别改为bit类型,然后在窗体中加入单选框,在读取数据库的代码中编写以下两行代码:
this.rdb_Male.Checked = (bool)sqlDataReader["Gender"]; this.rdb_Female.Checked = !(bool)sqlDataReader["Gender"];
(3)日期控件DataTimePicker输出数据
直接在窗体中加入日期控件,并在读取数据库的代码中编写以下代码:
this.dtp_BirthDate.Value = (DateTime)sqlDataReader["BirthDate"];
(4)下拉框combobox输出数据
首先将学生表中的班级改成班级表中所对应的编码,然后编写以下代码,将班级表中的班级名显示在下拉框的选项中
sqlDataAdapter.Fill(classTable); //SQL数据适配器读取数据,并填充班级数据表; this.cmb_Class.DataSource = classTable; //将班级下拉框的数据源设为班级数据表; this.cmb_Class.DisplayMember = "Name"; //将班级下拉框的显示成员设为班级数据表的名称列; this.cmb_Class.ValueMember = "No"; //将班级下拉框的值成员设为班级数据表的编号列;
然后在读取数据库的代码中编写以下代码:
this.cmb_Class.SelectedValue = (int)sqlDataReader["ClassNo"];
使用单选框radiobutton、日期控件DataTimePicker和下拉框combobox输出数据的完整代码如下:
private void btn_Load_Click(object sender, EventArgs e) { SqlConnection sqlConnection = new SqlConnection(); //声明并实例化SQL连接; sqlConnection.ConnectionString = "Server=(local);Database=EduBase48;Integrated Security=sspi"; //在字符串变量中,描述连接字符串所需的服务器地址、数据库名称、集成安全性(即是否使用Windows验证); SqlCommand sqlCommand = new SqlCommand(); //声明并实例化SQL命令; SqlCommand sqlCommand2 = new SqlCommand(); //声明并实例化SQL命令; sqlCommand.Connection = sqlConnection; //将SQL命令的连接属性指向SQL连接; sqlCommand2.Connection = sqlConnection; //将SQL命令的连接属性指向SQL连接; sqlCommand.CommandText = "SELECT * FROM tb_Class;"; //指定SQL命令的命令文本;该命令查询所有班级,以用作下拉框数据源; sqlCommand2.CommandText = "SELECT * FROM tb_Student WHERE No=@No;"; //指定SQL命令的命令文本;该命令查询指定学生; sqlCommand2.Parameters.AddWithValue("@No", "3160707048"); //向SQL命令的参数集合添加参数的名称、值; SqlDataAdapter sqlDataAdapter = new SqlDataAdapter(); //声明并实例化SQL数据适配器,同时借助构造函数,将其SelectCommand属性设为先前创建的SQL命令; sqlDataAdapter.SelectCommand = sqlCommand; //将SQL数据适配器的查询命令属性指向SQL命令; DataTable classTable = new DataTable(); //声明并实例化数据表,用于保存所有班级,以用作下拉框数据源; sqlConnection.Open(); //打开SQL连接; sqlDataAdapter.Fill(classTable); //SQL数据适配器读取数据,并填充班级数据表; this.cmb_Class.DataSource = classTable; //将班级下拉框的数据源设为班级数据表; this.cmb_Class.DisplayMember = "Name"; //将班级下拉框的显示成员设为班级数据表的名称列; this.cmb_Class.ValueMember = "No"; //将班级下拉框的值成员设为班级数据表的编号列; SqlDataReader sqlDataReader = sqlCommand2.ExecuteReader(); //调用SQL命令的方法ExecuteReader来执行命令,并获取数据阅读器; if (sqlDataReader.Read()) //若数据阅读器成功读取到下一条记录(首次查询则表示第一条记录); { this.txb_No.Text = sqlDataReader["No"].ToString(); //在数据阅读器的索引器中指定列名,从而访问当前记录的指定列的值,并赋予相应控件; this.txb_Name.Text = sqlDataReader["Name"].ToString(); this.rdb_Male.Checked = (bool)sqlDataReader["Gender"]; this.rdb_Female.Checked = !(bool)sqlDataReader["Gender"]; this.dtp_BirthDate.Value = (DateTime)sqlDataReader["BirthDate"]; this.cmb_Class.SelectedValue = (int)sqlDataReader["ClassNo"]; this.txb_Speciality.Text = sqlDataReader["Speciality"].ToString(); } sqlDataReader.Close(); //关闭数据阅读器(同时关闭连接); }
2.更新数据
更新数据需用到SQL语句如下:
sqlCommand.CommandText = //指定SQL命令的命令文本; "UPDATE tb_Student" + " SET Name=@Name,Gender=@Gender,BirthDate=@BirthDate,ClassNo=@ClassNo,Speciality=@Speciality" + " WHERE No=@No;";
由于每个数据都有可能会被修改,所以需要将所有列(除了No)都写出来,因为此处使用学生信息为例,一般学号不会有修改,所以学号没有更新代码,更新数据的完整代码如下:
private void btn_Update_Click(object sender, EventArgs e) { SqlConnection sqlConnection = new SqlConnection(); //声明并实例化SQL连接; sqlConnection.ConnectionString = ConfigurationManager.ConnectionStrings["Sql"].ConnectionString; //配置管理器从配置文件读取连接字符串,并将之赋予SQL连接的连接字符串属性; SqlCommand sqlCommand = new SqlCommand(); //声明并实例化SQL命令; sqlCommand.Connection = sqlConnection; //将SQL命令的连接属性指向SQL连接; sqlCommand.CommandText = //指定SQL命令的命令文本; "UPDATE tb_Student" + " SET Name=@Name,Gender=@Gender,BirthDate=@BirthDate,ClassNo=@ClassNo,Speciality=@Speciality" + " WHERE No=@No;"; sqlCommand.Parameters.AddWithValue("@Name", this.txb_Name.Text.Trim()); //向SQL命令的参数集合添加参数的名称、值; sqlCommand.Parameters.AddWithValue("@Gender", this.rdb_Male.Checked); sqlCommand.Parameters.AddWithValue("@BirthDate", this.dtp_BirthDate.Value); sqlCommand.Parameters.AddWithValue("@ClassNo", (int)this.cmb_Class.SelectedValue); sqlCommand.Parameters.AddWithValue("@Speciality", this.txb_Speciality.Text.Trim()); sqlCommand.Parameters.AddWithValue("@No", "3160707048"); sqlConnection.Open(); //打开SQL连接; int rowAffected = sqlCommand.ExecuteNonQuery(); //调用SQL命令的方法ExecuteNonQuery来执行命令,向数据库写入数据,并返回受影响行数; sqlConnection.Close(); //关闭SQL连接; MessageBox.Show("更新" + rowAffected.ToString() + "行。"); //在消息框显示受影响行数; }
3.上传图片、输出图片与更新图片
(1)上传图片
首先数据库的表中须有一列图片列,接着在窗体里添加一个图片框和一个命令按钮以上传图片,以上传位图图片为例,编写以下代码:
private void btn_OpenPhoto_Click(object sender, EventArgs e) { OpenFileDialog openPhotoDialog = new OpenFileDialog() //声明并实例化打开文件对话框; { //在初始化器中,设置打开文件对话框的各属性; Title = "打开照片文件(位图格式)" //对话框标题; , Filter = "BMP Files (*.bmp)|*.bmp" //文件格式过滤器; , InitialDirectory = @"C:\" //初始目录; }; if (openPhotoDialog.ShowDialog() == DialogResult.OK) //显示打开文件对话框,若打开文件对话框的对话结果为点击OK键; { this.PhotoFileName = openPhotoDialog.FileName; //将对话框获得的文件名,存入本窗体的私有字段中; this.ptb_Photo.Image = Image.FromFile(this.PhotoFileName); //调用图像的静态方法FromFile从指定文件中读取图像,并赋予图像框; } }
上传图片后点击更新后可将图片保存至数据库中
因为图片在数据库中只能储存为二进制数据,所以需要进行转换,代码如下:
MemoryStream memoryStream = new MemoryStream(); //声明并实例化内存流,用于读取照片的字节数据; this.ptb_Photo.Image.Save(memoryStream, ImageFormat.Bmp); //调用图像框的图像的静态方法Save,将图像保存至内存流; byte[] photoBytes = new byte[memoryStream.Length]; //声明并实例化字节数组,用于保存照片数据;数组长度对应内存流长度; memoryStream.Seek(0, SeekOrigin.Begin); //保存后的内存流的偏移位置在末尾,需通过查找来将偏移位置设为起始; memoryStream.Read(photoBytes, 0, photoBytes.Length); //将内存流读入字节数组;
在更新语句中编写下面一句代码:
sqlCommand.Parameters.AddWithValue("@Photo", photoBytes);
因为在数据库中图片被保存为二进制数据,所以在重新将存入数据库的图片输出时,需将二进制数据重新转化为图片形式,于是在读取数据代码中编写如下代码
photoBytes = (sqlDataReader["Photo"] == DBNull.Value ? null : (byte[])sqlDataReader["Photo"]); //根据照片是否为数据库空值,分别将空值、转为字节数组的照片数据赋予事先声明的字节数组;