一、应用基础
(1)配置SQL连接
声明并实例化SQL连接与SQL命令,并将SQL命令的连接属性指向SQL连接;
SqlConnection sqlConnection = new SqlConnection();
SqlCommand sqlCommand = new SqlCommand();
sqlConnection.ConnectionString = "Server=(local);Database=EduBaseDemo;Integrated Security=sspi"; //在字符串变量中,描述连接字符串所需的服务器地址、数据库名称、集成安全性(即是否使用Windows验证);
sqlCommand1.Connection = sqlConnection;
sqlCommand2.Connection = sqlConnection;
指定SQL命令的输出命令文本;
sqlCommand1.CommandText = "SELECT * FROM tb_Class;";
指定SQL命令的输入命令文本;
sqlCommand2.CommandText ="UPDATE tb_Student SET Name=@Name,Gender=@Gender,BirthDate=@BirthDate,ClassNo=@ClassNo,Speciality=@Speciality WHERE No=@No;";
(2)打开SQL连接
sqlConnection.Open();
sqlDataAdapter.Fill(classTable);//SQL数据适配器读取数据,并填充设定的数据表;
二、输出数据
1、下拉框(Combobox)
(1)构建存储数据的数据表(DataTable)
DataTable dataTable = new DataTable(); //声明并实例化数据表,用于保存数据,以用作下拉框数据源;
(2)构造数据适配器(SqlDataAdapter)
① 声明并实例化SQL数据适配器,同时借助构造函数,将其SelectCommand属性设为先前创建的SQL命令
②将SQL数据适配器的查询命令属性指向SQL命令
SqlDataAdapter sqlDataAdapter = new SqlDataAdapter();
sqlDataAdapter.SelectCommand = sqlCommand;
sqlDataAdapter.Fill(dataTable);//SQL数据适配器读取数据,并填充班级数据表;
(3)设置Combobox数据源及基本配置
①DisplayMember:配置Combobox的显示成员
②ValueMember:配置Combobox的值成员
this.Combobox1.DataSource = dataTable;//将下拉框Combobox1的数据源设为班级数据表;
this.Combobox1.DisplayMember = "Name";//将下拉框的显示成员设为数据表的名称列;
this.Combobox1.ValueMember = "No"; //将下拉框的值成员设为班级数据表的编号列;
2、文本框(TextBox)
(1)构建存储数据的数据表
调用SQL命令的方法ExecuteReader来执行命令,并获取数据阅读器;
SqlDataReader sqlDataReader = sqlCommand.ExecuteReader();
(2)读取数据记录
在数据阅读器的索引器中指定列名,从而访问当前记录的指定列的值,并赋予TextBox;
【注意】将读取的数据类型转化为string类型
if (sqlDataReader.Read())//若数据阅读器成功读取到下一条记录(首次查询则表示第一条记录)
{
this.Text1.Text = sqlDataReader["No"].ToString();
}
3、单选按钮(RadioButton)
同理于文本框类型
【注意】将读取的数据转化为布尔类型
if (sqlDataReader.Read())
{
this.RadioButton1.Checked = (bool)sqlDataReader["Gender"];
}
4、日期控件(DateTimePicker)
同理于文本框类型
【注意】将读取的数据转化为日期类型
if (sqlDataReader.Read())
{
this.DateTimePicker1.Value = (DateTime)sqlDataReader["BirthDate"];
}
5、图像框(PictureBox)
①声明字节数组,用于保存照片数据;但先赋予空值
byte[] photoBytes = null;
②根据照片是否为数据库空值,分别将空值、转为字节数组的照片数据赋予事先声明的字节数组
photoBytes =(sqlDataReader["Photo"] == DBNull.Value ? null : (byte[])sqlDataReader["Photo"]);
if (photoBytes != null){
MemoryStream memoryStream = new MemoryStream(photoBytes);//声明并实例化内存流,用于读取照片的字节数据;
this.PictureBox1.Image = Image.FromStream(memoryStream);//调用图像的静态方法FromStream从内存流中读取图像,并赋予图像框;
}
6、网格视图(DataGridView)
同理于下拉框类型
sqlDataAdapter2.Fill(studentTable); this.DataGridView1.Columns.Clear();//数据网格视图的列集合清空;
this.DataGridView1.DataSource = studentTable;//将数据网格视图的数据源设为学生数据表;
this.DataGridView1.Columns["No"].HeaderText = "学号";//将数据网格视图的指定列的表头文本设为中文;
this.DataGridView1.Columns["Name"].HeaderText = "姓名";
this.DataGridView1.Columns["Gender"].HeaderText = "性别";
三、输入数据
1、文本框、单选按钮、日期控件等
向SQL命令的参数集合添加参数的名称、值;
sqlCommand.Parameters.AddWithValue("@Name", this.TextBox1.Text.Trim()); //输入文本框数据
sqlCommand.Parameters.AddWithValue("@Gender", this.RadioButton1.Checked);//输入单选按钮的值
sqlCommand.Parameters.AddWithValue("@BirthDate", this.DateTimePicker1.Value);//输入日期控件中的数据
调用SQL命令的方法ExecuteNonQuery来执行命令,向数据库写入数据,并返回受影响行数;
int rowAffected = sqlCommand.ExecuteNonQuery();
sqlConnection.Close();
2、图像框(PictureBox)
将图像保存至内存流;将内存流读入用于保存图像数据的数组中,再将更新后的数组数据存入数据库中
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);
3、网格视图(DataGridView)
①向SQL命令的参数集合添加参数的名称、SQL Server数据类型、长度(仅用于定长类型)、所绑定的数据表中的列名;
sqlCommand.Parameters.Add("@Name",SqlDbType.VarChar,0,"Name");
sqlCommand.Parameters.Add("@Gender", SqlDbType.Bit, 0, "Gender");
②将SQL数据适配器的更新命令属性指向SQL输入命令;
sqlDataAdapter.UpdateCommand = sqlCommand2;
DataTable dataTable = (DataTable)this.DataGridView1.DataSource;//声明数据表,并指向数据网格视图的数据源;数据源默认类型为object,还需强制转换类型;
sqlConnection.Open();//打开SQL连接;
int rowAffected = sqlDataAdapter.Update(dataTable);//SQL数据适配器根据学生数据表提交更新,并返回受影响行数;