~~~~~~~~~~~~~~~~~~~~ 成语字典查询系统
实验目的:
(1)掌握小型数据库管理系统的设计开发方法;
(2)灵活使用数据库控件。
实验要求:
(1)SQL Server管理系统中创建数据库和数据表;
(2)使用SQLCommand、SqlDataAdapter与DataSet等对象完成对数据库的查询与维护操作
数据库设计
1. 需求分析
- 用户需求:确定用户需要查询成语的哪些方面。
- 系统功能:系统应支持基本的查询功能。
2. 数据收集
- 成语数据:收集成语的基本信息。
- 附加信息:收集成语的出处、例句等。
3. 概念设计
- 实体定义:定义系统中的主要实体。
- 关系定义:确定实体之间的关系。
4. 逻辑设计
- 表结构设计:设计具体的表结构。
- 表之间的关系:定义表之间的关联。
5. 数据模型
- ER图:创建ER图来表示实体、属性和关系。
- 规范化:应用规范化理论。
6. 完整性约束
- 主键:定义主键以确保数据的唯一性。
- 外键:定义外键以维护表之间的关系。
- 约束条件:设置必要的约束条件。
7. 索引设计
- 查询优化:为常用查询字段创建索引。
8. 物理设计
- 数据库选择:选择合适的数据库系统。
- 存储优化:根据数据访问模式优化存储结构。
功能模块设计
(1)精确查询
// 定义一个私有成员函数,用于处理精确查询的点击事件
private: System::Void 精确查询ToolStripMenuItem_Click(System::Object^ sender, System::EventArgs^ e) {
// 检查文本框textBox3中是否有输入内容
if(textBox3->Text == "") {
// 如果文本框为空,则弹出一个消息框提示用户,并返回
MessageBox::Show("查询对象的内容不能为空");
return;
}
// 声明一个OleDbDataReader类型的指针rd,用于读取数据库查询结果
OleDbDataReader^ rd;
try {
// 尝试打开数据库连接
con->Open();
// 检查数据库连接是否成功打开
if(con->State == ConnectionState::Open) {
// 构造SQL查询语句,用于从成语字典表中查询成语
String^ sql = "select * from 成语字典 where 成语='" + textBox3->Text + "'";
// 显示构造的SQL语句(可能用于调试)
MessageBox::Show(sql);
// 创建一个OleDbCommand对象cmd,用于执行SQL查询
OleDbCommand^ cmd = gcnew OleDbCommand(sql, con);
// 使用cmd对象执行查询,并获取数据读取器rd
rd = cmd->ExecuteReader();
// 如果rd.Read()返回true,表示查询结果中有数据
if(rd->Read()) {
// 将查询结果赋值给对应的文本框和富文本框
textBox3->Text = rd["成语"]->ToString();
richTextBox2->Text = rd["解释"]->ToString();
textBox9->Text = rd["成语简码"]->ToString();
textBox4->Text = rd["成语拼音"]->ToString();
}
}
}
// 捕获并处理SQL异常
catch(SqlException^ ex) {
// 弹出消息框显示异常信息
MessageBox::Show("数据的异常信息是:" + ex->Message, "提示信息");
}
// 无论是否发生异常,都会执行的代码块
finally {
// 关闭数据读取器
rd->Close();
// 检查数据库连接是否处于打开状态,如果是,则关闭连接
if(con->State == ConnectionState::Open) {
con->Close();
}
}
}
查询前:
查询后:
(2)模糊查询
// 定义一个私有成员函数,用于处理模糊查询的点击事件
private: System::Void 模糊查询ToolStripMenuItem_Click(System::Object^ sender, System::EventArgs^ e) {
// 构造SQL查询语句,用于从成语字典表中进行模糊查询
// 使用LIKE操作符和通配符'%'来匹配textBox6文本框中输入内容之后的任意字符
String^ sql = "select * from 成语字典 where 成语 like '" + textBox6->Text + "%'";
// 显示构造的SQL语句(可能用于调试)
MessageBox::Show(sql);
// 创建DataTable对象,用于存储查询结果
DataTable^ ourtable = gcnew DataTable();
// 创建OleDbDataAdapter对象ourda,用于填充DataTable
OleDbDataAdapter^ ourda = gcnew OleDbDataAdapter(sql, con);
try {
// 使用ourda对象执行Fill方法,将查询结果填充到ourtable对象中
ourda->Fill(ourtable);
// 将dataGridView1的数据源设置为ourtable,以便在界面上显示查询结果
this->dataGridView1->DataSource = ourtable;
}
// 捕获并处理SQL异常
catch(System::Data::SqlClient::SqlException^ ex) {
// 弹出消息框显示异常信息
MessageBox::Show("数据异常");
}
}
(3) 添加
// 定义一个私有成员函数,用于处理添加操作的点击事件
private: System::Void 添加ToolStripMenuItem_Click(System::Object^ sender, System::EventArgs^ e) {
try {
// 尝试打开数据库连接
con->Open();
// 检查数据库连接是否成功打开
if(con->State == ConnectionState::Open) {
// 构造SQL插入语句,用于向成语字典表中添加新的成语记录
String^ mysql = "insert into 成语字典 (成语,解释,成语简码,成语拼音) "
+ "values ('" + textBox1->Text + "', '"
+ richTextBox1->Text + "', '"
+ textBox7->Text + "', '"
+ textBox8->Text + "')";
// 显示构造的SQL语句(可能用于调试)
MessageBox::Show(mysql);
// 创建一个OleDbCommand对象mycmd,用于执行SQL插入
OleDbCommand^ mycmd = gcnew OleDbCommand(mysql, con);
// 执行非查询命令(如插入、更新、删除等)
mycmd->ExecuteNonQuery();
// 弹出消息框提示用户添加成语成功
MessageBox::Show("添加成语成功");
}
}
// 捕获并处理SQL异常
catch (SqlException^ ex) {
// 弹出消息框显示异常信息
MessageBox::Show("数据的异常信息是:" + ex->Message, "提示信息");
}
// 无论是否发生异常,都会执行的代码块
finally {
// 检查数据库连接是否处于打开状态,如果是,则关闭连接
if(con->State == ConnectionState::Open) {
con->Close();
}
}
}
(4) 删除
// 定义一个私有成员函数,用于处理删除操作的点击事件
private: System::Void 删除ToolStripMenuItem_Click(System::Object^ sender, System::EventArgs^ e) {
// 检查要删除的文本框textBox2是否为空
if(textBox2->Text == "") {
// 如果为空,则弹出消息框提示用户,并返回
MessageBox::Show("删除对象的内容不能为空");
return;
}
// 弹出确认对话框询问用户是否确定要删除记录
if(Windows::Forms::DialogResult::OK != MessageBox::Show("确定要删除记录吗?", "删除", MessageBoxButtons::OKCancel)) {
// 如果用户选择取消,则返回
return;
}
try {
// 尝试打开数据库连接
con->Open();
// 检查数据库连接是否成功打开
if(con->State == ConnectionState::Open) {
// 构造SQL删除语句,用于删除成语字典表中的指定记录
String^ mysql = "delete from 成语字典 where 成语='" + textBox2->Text + "'";
// 显示构造的SQL语句(可能用于调试)
MessageBox::Show(mysql);
// 创建一个OleDbCommand对象mycmd,用于执行SQL删除
OleDbCommand^ mycmd = gcnew OleDbCommand(mysql, con);
// 执行非查询命令(如更新、插入、删除等)
mycmd->ExecuteNonQuery();
// 弹出消息框提示用户删除成功,并显示被删除的成语
MessageBox::Show("您已经成功删除" + textBox2->Text + "的记录");
}
}
// 捕获并处理SQL异常
catch (SqlException^ ex) {
// 弹出消息框显示异常信息
MessageBox::Show("数据的异常信息是:" + ex->Message, "提示信息");
}
// 无论是否发生异常,都会执行的代码块
finally {
// 检查数据库连接是否处于打开状态,如果是,则关闭连接
if(con->State == ConnectionState::Open) {
con->Close();
}
}
}
(5) 修改
// 定义一个私有成员函数,用于处理修改操作的点击事件
private: System::Void 修改ToolStripMenuItem_Click(System::Object^ sender, System::EventArgs^ e) {
// 检查要修改的文本框textBox5是否为空
if(textBox5->Text == "") {
// 如果为空,则弹出消息框提示用户,并返回
MessageBox::Show("修改对象的内容不能为空");
return;
}
// 弹出确认对话框询问用户是否确定要修改记录
if(Windows::Forms::DialogResult::OK != MessageBox::Show("确定要修改记录吗?", "修改", MessageBoxButtons::OKCancel)) {
// 如果用户选择取消,则返回
return;
}
try {
// 尝试打开数据库连接
con->Open();
// 检查数据库连接是否成功打开
if(con->State == ConnectionState::Open) {
// 构造SQL更新语句,用于更新成语字典表中的记录
String^ sql = "update 成语字典 set 成语='" + textBox5->Text + "', "
+ "解释='" + richTextBox3->Text + "', "
+ "成语简码='" + textBox11->Text + "', "
+ "成语拼音='" + textBox10->Text + "' "
+ "where 成语='" + textBox3->Text + "'";
// 显示构造的SQL语句(可能用于调试)
MessageBox::Show(sql);
// 创建一个OleDbCommand对象cmd,用于执行SQL更新
OleDbCommand^ cmd = gcnew OleDbCommand(sql, con);
// 执行非查询命令(如更新、插入、删除等)
cmd->ExecuteNonQuery();
// 弹出消息框提示用户修改成功,并显示被修改的成语
MessageBox::Show("您已经成功修改" + "成语=" + textBox5->Text + "的记录");
}
}
// 捕获并处理SQL异常
catch(SqlException^ ex) {
// 弹出消息框显示异常信息
MessageBox::Show("数据的异常信息是:" + ex->Message, "提示信息");
}
// 无论是否发生异常,都会执行的代码块
finally {
// 检查数据库连接是否处于打开状态,如果是,则关闭连接
if(con->State == ConnectionState::Open) {
con->Close();
}
}
}