星尘小组第六周学习笔记—如何在各类控件中输入/输出数据

一、思维导图

二、知识点描述

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"]);       //根据照片是否为数据库空值,分别将空值、转为字节数组的照片数据赋予事先声明的字节数组;

猜你喜欢

转载自www.cnblogs.com/hawking-520/p/10693934.html