前端界面操作数据表,主要是是指对SQL数据表进行增删改查操作。
操作平台:C#2008+SQL
一、思维导图:
二、知识点介绍
1.利用前端界面对数据库进行操作,最关键的一点就是实现前端界面与数据库的连接。
数据库的连接可以通过设置,也可以直接用代码连接。我们建议用代码连接。代码连接的话,是指连接字符串。如下为连接字符串的示例代码:(以windows登录为例子)
SqlConnection sqlConnection = new SqlConnection(); //声明并实例化SQL连接;
sqlConnection.ConnectionString =
"Server=(Local);Database=数据库名称;Integrated Security=sspi"; //在字符串变量中,描述连接字符串所需的服务器地址、数据库名称、集成安全性(即是否使用Windows验证);
sqlConnection.Open(); //打开SQL连接;
MessageBox.Show //在消息框中显示;
("连接状态:" + sqlConnection.State.ToString() //消息框消息内容;
+ "\n工作站标识:" + sqlConnection.WorkstationId
+ "\n服务器地址:" + sqlConnection.DataSource
+ "\n服务器版本:" + sqlConnection.ServerVersion
+ "\n数据库名称:" + sqlConnection.Database
+ "\n\n(单击【确定】后将关闭SQL连接)");
sqlConnection.Close(); //关闭SQL连接;
MessageBox.Show //在消息框中显示;
("连接状态:" + sqlConnection.State.ToString());
2.完成了最开始的数据库连接后接下来就是对数据库进行操作了。
操作的话我们分为四个部分,分别是增加,删除,修改和查找,他们有一个共同点就是都可以用DataGirdView进行直接操作。实现增删改查的过程中,要利用控件进行辅助,并结合相关数据库语句。
c#是通过@加变量名传值,通过AddWithValue方法赋值。
增加
- 数据表
- 使用DataGridView控件
- 命令按钮
- 写入
- 调用SQL命令的方法ExecuteNonQuery来执行命令,向数据库写入数据,并返回受影响行数;
- 异常
- 调用SQL命令的方法ExecuteNonQuery来执行命令,向数据库写入数据,并返回受影响行数;捕捉SQL异常;若SQL异常编号为2627,则违反主键/唯一约束,即插入重复值;
- 存储过程
- 调用SQL连接的方法CreateCommand来创建SQL命令;该命令将绑定SQL连接;指定SQL命令的命令文本;命令文本为存储过程名称;SQL命令的类型设为存储过程
- 删除
- DateGridView控件
- 更新
- 记录
- 调用SQL命令的方法ExecuteReader来执行命令,并获取数据阅读器;调用数据阅读器的方法GetOrdinal获取各列相应的索引值;
- 使用DataGridView控件
- 查找
- 记录
- 调用SQL命令的方法ExecuteReader来执行命令,并获取数据阅读器;调用数据阅读器的方法GetOrdinal获取各列相应的索引值;
- 数据表
- 借助DataGridView
- 命令按钮
- 查询标量
- 调用SQL命令的方法ExecuteScalar来执行命令,并接受单个结果
- 参数
- 直接调用方法AddWithValue向SQL命令的参数集合添加参数的名称、值;通过参数名称访问SQL参数
- 参数方向
- 保存与所输用户号相应的行计数,并从相应的输出参数值中获得行计数
三、代码示例&运行截图
增加&查询:示例(注册向管理员表中增加,登录则为从表中查询)
登录(查询)
SqlConnection sqlConnection = new SqlConnection(); //声明并实例化SQL连接;
sqlConnection.ConnectionString =
"Server=(local);Database=ZXYY;Integrated Security=sspi"; //在字符串变量中,描述连接字符串所需的服务器地址、数据库名称、集成安全性(即是否使用Windows验证);
SqlCommand sqlCommand = sqlConnection.CreateCommand();
SqlParameter sqlParameter = new SqlParameter(); //调用SQL连接的方法CreateCommand来创建SQL命令;该命令将绑定SQL连接;
if (radobtn_amdin.Checked == true)
{
sqlCommand.CommandText =
"SELECT COUNT(1) FROM 管理员 WHERE 帐号=@帐号 AND 密码=HASHBYTES('MD5',@密码);"; //指定SQL命令的命令文本;命令文本包含参数;
#region SQL参数用法1
//声明并实例化SQL参数;
sqlParameter.ParameterName = "@帐号"; //设置SQL参数的名称;
sqlParameter.Value = this.textbxid.Text.Trim(); //设置SQL参数的长度;
sqlParameter.SqlDbType = SqlDbType.Char; //设置SQL参数对应的SQL Server数据类型;
sqlParameter.Size = 10; //设置SQL参数的长度;
sqlCommand.Parameters.Add(sqlParameter); //向SQL命令的参数集合添加SQL参数;
#endregion
#region SQL参数用法2
sqlCommand.Parameters.AddWithValue("@密码", this.textbxpsw.Text.Trim()); //直接调用方法AddWithValue向SQL命令的参数集合添加参数的名称、值;
sqlCommand.Parameters["@密码"].SqlDbType = SqlDbType.VarChar; //通过参数名称访问SQL参数,并将密码参数的类型设为变长字符串;
//SQL参数能自动识别类型;若参数值为字符串,则类型自动设为NVARCHAR,且可在执行时自动转换;但对于相同密码,VARCHAR/NVARCHAR类型所获得的散列值不同,故需手动将SQL参数类型统一设为VARCHAR;
#endregion
}
if (radobon_doctor.Checked == true)
{
sqlCommand.CommandText =
"SELECT COUNT(1) FROM 医生 WHERE 工号=@工号 AND 密码=HASHBYTES('MD5',@密码);"; //指定SQL命令的命令文本;命令文本包含参数;
#region SQL参数用法1
//声明并实例化SQL参数;
sqlParameter.ParameterName = "@工号"; //设置SQL参数的名称;
sqlParameter.Value = this.textbxid.Text.Trim(); //设置SQL参数的长度;
sqlParameter.SqlDbType = SqlDbType.Char; //设置SQL参数对应的SQL Server数据类型;
sqlParameter.Size = 10; //设置SQL参数的长度;
sqlCommand.Parameters.Add(sqlParameter); //向SQL命令的参数集合添加SQL参数;
#endregion
#region SQL参数用法2
sqlCommand.Parameters.AddWithValue("@密码", this.textbxpsw.Text.Trim()); //直接调用方法AddWithValue向SQL命令的参数集合添加参数的名称、值;
sqlCommand.Parameters["@密码"].SqlDbType = SqlDbType.VarChar; //通过参数名称访问SQL参数,并将密码参数的类型设为变长字符串;
//SQL参数能自动识别类型;若参数值为字符串,则类型自动设为NVARCHAR,且可在执行时自动转换;但对于相同密码,VARCHAR/NVARCHAR类型所获得的散列值不同,故需手动将SQL参数类型统一设为VARCHAR;
#endregion
}
sqlConnection.Open(); //打开SQL连接;
int rowCount = (int)sqlCommand.ExecuteScalar(); //调用SQL命令的方法ExecuteScalar来执行命令,并接受单个结果(即标量);
sqlConnection.Close(); //关闭SQL连接;
if (rowCount == 1) //若查得所输用户号相应的1行记录;
{
MessageBox.Show("登录成功。");
this.textbxid.Text = "";
this.textbxpsw.Text = "";//显示正确提示;
frm_kslist a=new frm_kslist();
a.Show ();
}
else //否则;
{
MessageBox.Show("用户号/密码有误,请重新输入!"); //显示错误提示;
this.textbxpsw.Focus(); //密码文本框获得焦点;
this.textbxpsw.SelectAll(); //密码文本框内所有文本被选中;
}
增加(注册)
if (this.textbxid.Text.Trim() == "") //若用户号文本框为空;
{
MessageBox.Show("用户号不能为空!"); //给出错误提示;
this.textbxid.Focus(); //用户号文本框获得焦点;
return; //返回;
}
if (this.textbxpsw.Text.Trim() == "") //若密码文本框为空;
{
MessageBox.Show("密码不能为空!"); //给出错误提示;
this.textbxpsw.Focus(); //密码文本框获得焦点;
return; //返回;
}
SqlConnection sqlConnection = new SqlConnection(); //声明并实例化SQL连接;
sqlConnection.ConnectionString =
"Server=(local);Database=ZXYY;Integrated Security=sspi"; //在字符串变量中,描述连接字符串所需的服务器地址、数据库名称、集成安全性(即是否使用Windows验证);
SqlCommand sqlCommand = sqlConnection.CreateCommand();
if (radobtn_amdin.Checked == true)
{//调用SQL连接的方法CreateCommand来创建SQL命令;该命令将绑定SQL连接;
sqlCommand.CommandText =
"INSERT 管理员 (帐号,密码) VALUES(@帐号,HASHBYTES('MD5',@密码));"; //指定SQL命令的命令文本;命令文本包含参数;
sqlCommand.Parameters.AddWithValue("帐号", this.textbxid.Text.Trim()); //向SQL命令的参数集合添加参数的名称、值;
sqlCommand.Parameters.AddWithValue("密码", this.textbxpsw.Text.Trim());
sqlCommand.Parameters["密码"].SqlDbType = SqlDbType.VarChar;
}
if (radobon_doctor.Checked ==true )
{//调用SQL连接的方法CreateCommand来创建SQL命令;该命令将绑定SQL连接;
sqlCommand.CommandText =
"INSERT 医生 (工号,密码) VALUES(@工号,HASHBYTES('MD5',@密码));"; //指定SQL命令的命令文本;命令文本包含参数;
sqlCommand.Parameters.AddWithValue("工号", this.textbxid.Text.Trim()); //向SQL命令的参数集合添加参数的名称、值;
sqlCommand.Parameters.AddWithValue("密码", this.textbxpsw.Text.Trim());
sqlCommand.Parameters["密码"].SqlDbType = SqlDbType.VarChar;
} //将密码参数的类型设为变长字符串;
//SQL参数自动识别类型;若参数值为字符串,则类型自动设为NVARCHAR,且可在执行时自动转换;但对于相同密码,VARCHAR/NVARCHAR类型所获得的散列值不同,故需手动将SQL参数类型统一设为VARCHAR;
int rowAffected = 0; //声明整型变量,用于保存受影响行数;
string message = ""; //声明字符串变量,用于保存消息;
try //尝试;
{
sqlConnection.Open(); //打开SQL连接;
rowAffected = sqlCommand.ExecuteNonQuery(); //调用SQL命令的方法ExecuteNonQuery来执行命令,向数据库写入数据,并返回受影响行数;
}
catch (SqlException sqlEx) //捕捉SQL异常;
{
if (sqlEx.Number == 2627) //若SQL异常编号为2627,则违反主键/唯一约束,即插入重复值;
{
message = "您注册的用户号已存在,请重新输入!";
this.textbxid.Text = "";
this.textbxpsw.Text = "";//给出合适的错误提示;
}
else //否则;
{
message = "注册失败!"; //给出一般错误提示;
}
}
finally //结束;
{
sqlConnection.Close(); //关闭SQL连接;
}
if (rowAffected == 1) //若成功写入1行记录;
{
message = "注册成功。";
this.textbxid.Text = "";
this.textbxpsw.Text = "";//给出正确提示;
}
MessageBox.Show(message);
//显示提示;
运行结果
更改:
SqlConnection sqlConnection = new SqlConnection(); //声明并实例化SQL连接;
sqlConnection.ConnectionString =
"Server=(local);Database=EduBaseDemo;Integrated Security=sspi"; //在字符串变量中,描述连接字符串所需的服务器地址、数据库名称、集成安全性(即是否使用Windows验证);
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", "3120707001");
sqlConnection.Open(); //打开SQL连接;
int rowAffected = sqlCommand.ExecuteNonQuery(); //调用SQL命令的方法ExecuteNonQuery来执行命令,向数据库写入数据,并返回受影响行数;
sqlConnection.Close(); //关闭SQL连接;
MessageBox.Show("更新" + rowAffected.ToString() + "行。");
接下来对DataGrideView的增删改查内容进行介绍:
点击提交,实现增删改查的功能:
SqlConnection sqlConnection = new SqlConnection(); //声明并实例化SQL连接;
sqlConnection.ConnectionString =
"Server=(local);Database=EduBaseDemo;Integrated Security=sspi"; //在字符串变量中,描述连接字符串所需的服务器地址、数据库名称、集成安全性(即是否使用Windows验证);
SqlCommand insertCommand = new SqlCommand(); //声明并实例化SQL命令;该命令用于插入记录;
insertCommand.Connection = sqlConnection; //将SQL命令的连接属性指向SQL连接;
insertCommand.CommandText = //指定SQL命令的命令文本;
"INSERT tb_Student"
+ "(No,Name,Gender,BirthDate,Class,Speciality)"
+ " VALUES(@No,@Name,@Gender,@BirthDate,@Class,@Speciality);";
insertCommand.Parameters.Add("@No", SqlDbType.Char, 10, "No"); //向SQL命令的参数集合添加参数的名称、SQL Server数据类型、长度(仅用于定长类型)、所绑定的数据表中的列名;
insertCommand.Parameters.Add("@Name", SqlDbType.VarChar, 0, "Name");
insertCommand.Parameters.Add("@Gender", SqlDbType.VarChar, 0, "Gender");
insertCommand.Parameters.Add("@BirthDate", SqlDbType.VarChar, 0, "BirthDate");
insertCommand.Parameters.Add("@Class", SqlDbType.VarChar, 0, "Class");
insertCommand.Parameters.Add("@Speciality", SqlDbType.VarChar, 0, "Speciality");
SqlCommand updateCommand = new SqlCommand(); //声明并实例化SQL命令;该命令用于更新记录;
updateCommand.Connection = sqlConnection; //将SQL命令的连接属性指向SQL连接;
updateCommand.CommandText = //指定SQL命令的命令文本;
"UPDATE tb_Student"
+ " SET No=@NewNo,Name=@Name,Gender=@Gender,BirthDate=@BirthDate,Class=@Class,Speciality=@Speciality"
+ " WHERE No=@OldNo;";
updateCommand.Parameters.Add("@NewNo", SqlDbType.Char, 10, "No"); //向SQL命令的参数集合添加参数的名称、SQL Server数据类型、长度(仅用于定长类型)、所绑定的数据表中的列名;
updateCommand.Parameters.Add("@Name",SqlDbType.VarChar,0,"Name");
updateCommand.Parameters.Add("@Gender", SqlDbType.VarChar, 0, "Gender");
updateCommand.Parameters.Add("@BirthDate", SqlDbType.VarChar, 0, "BirthDate");
updateCommand.Parameters.Add("@Class", SqlDbType.VarChar, 0, "Class");
updateCommand.Parameters.Add("@Speciality", SqlDbType.VarChar, 0, "Speciality");
updateCommand.Parameters.Add("@OldNo", SqlDbType.Char, 10, "No"); //若学号发生更改,则还需提供旧学号,以便查询要更改的行;
updateCommand.Parameters["@OldNo"].SourceVersion = DataRowVersion.Original; //旧学号的来源版本,为数据行版本中的原始值;
SqlCommand deleteCommand = new SqlCommand(); //声明并实例化SQL命令;该命令用于删除;
deleteCommand.Connection = sqlConnection; //将SQL命令的连接属性指向SQL连接;
deleteCommand.CommandText = //指定SQL命令的命令文本;
"DELETE tb_Student"
+ " WHERE No=@No;";
deleteCommand.Parameters.Add("@No", SqlDbType.Char, 10, "No");
SqlDataAdapter sqlDataAdapter = new SqlDataAdapter(); //声明并实例化SQL数据适配器;
sqlDataAdapter.InsertCommand = insertCommand; //将SQL数据适配器的属性InsertCommand指向用于插入记录的SQL命令;
sqlDataAdapter.UpdateCommand = updateCommand; //将SQL数据适配器的属性UpdateCommand指向用于更新记录的SQL命令;
sqlDataAdapter.DeleteCommand = deleteCommand; //将SQL数据适配器的属性DeleteCommand指向用于删除记录的SQL命令;
DataTable studentTable1 = (DataTable)this.dgv_Score.DataSource; //声明数据表,并指向数据网格视图的数据源;数据源默认类型为object,还需强制转换类型;
sqlConnection.Open(); //打开SQL连接;
int rowAffected = sqlDataAdapter.Update(studentTable1); //SQL数据适配器根据学生数据表提交所有更新,并返回受影响行数;
sqlConnection.Close(); //关闭SQL连接;
MessageBox.Show("更新" + rowAffected.ToString() + "行。"); //在消息框显示受影响行数;