ADO.NET – 3.书籍管理系统详解
内容提要:
4.搜索事件
5.1先修改为全行选中
5.2事件dgv_Books_CellClick(object sender, DataGridViewCellEventArgs e)
:选中一行,下面显示具体数据
6.新增
7.修改
8.删除
9.退出
效果图:
1.先写应用程序配置文件app.config# |

<?xml version="1.0" encoding="utf-8" ?> <configuration> <connectionStrings> <add name="conStr" connectionString="Server=.\SQLEXPRESS;database=tangsansan;uid=sa;pwd=sa" /> </connectionStrings> </configuration>
2.创建SQLHelper.cs# |

1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 using System.Configuration; 6 using System.Data; 7 using System.Data.SqlClient; 8 9 10 namespace BMS 11 { 12 public static class SQLHelper 13 { 14 private static string conStr = ConfigurationManager. 15 ConnectionStrings["conStr"].ConnectionString; 16 17 private static SqlConnection conn; 18 19 //连接通道 属性 20 #region 连接通道 属性 21 public static SqlConnection Conn 22 { 23 get 24 { 25 if (conn == null || conn.State == ConnectionState.Broken) 26 { 27 conn = new SqlConnection(conStr); 28 } 29 return conn; 30 } 31 } 32 #endregion 33 /// <summary> 34 /// 获取数据表 35 /// </summary> 36 /// <param name="sqlStr">查询语句</param> 37 /// <param name="paras">参数数组</param> 38 /// <returns>结果表</returns> 39 public static DataTable GetDataTable(string sqlStr, params SqlParameter[] paras) 40 { 41 SqlCommand cmd = new SqlCommand(sqlStr, Conn); 42 if (paras.Length > 0) 43 { 44 cmd.Parameters.AddRange(paras); 45 } 46 SqlDataAdapter adapter = new SqlDataAdapter(cmd); 47 DataTable dt = new DataTable(); 48 try 49 { 50 adapter.Fill(dt); 51 } 52 catch (Exception ex) 53 { 54 55 throw ex; 56 } 57 return dt; 58 } 59 /// <summary> 60 /// 执行SQL 61 /// </summary> 62 /// <param name="sql"></param> 63 /// <param name="parameters"></param> 64 /// <returns></returns> 65 public static int ExecNonQuery(string sql, SqlParameter[] parameters) 66 { 67 68 using (SqlCommand cmd = new SqlCommand(sql, conn)) 69 { 70 if (parameters.Length > 0 && parameters != null) 71 { 72 cmd.Parameters.AddRange(parameters); 73 } 74 conn.Open(); 75 int res = 0; 76 try 77 { 78 res = cmd.ExecuteNonQuery(); 79 } 80 catch (Exception e) 81 { 82 throw e; 83 } 84 finally 85 { 86 conn.Close(); 87 } 88 return res; 89 } 90 } 91 } 92 }
3.加载Form的load事件# |
-
//窗体加载事件
-
private void Form1_Load(object sender, EventArgs e)
-
{
-
LoadBooks();
-
LoadCategory();
-
}
/// <summary>
/// 加载dgv_Books:(dategridview列表)
/// </summary>
private void LoadBooks()
{
string sqlStr = "select b_Id,c_name,b_title,b_content,b_author,b_isdel,b_addtime,b_money,b_submoney " +
"from Book inner join Category on b_Cid = c_id where b_isdel = 0";
DataTable dt = SQLHelper.GetDataTable(sqlStr);
dgv_Books.DataSource = dt;
}
/// <summary>
/// 加载cb_Cate:(书籍类别)
/// </summary>
private void LoadCategory()
{
string sqlStr = "select * from Category where c_isdel=0";
DataTable dt = SQLHelper.GetDataTable(sqlStr);
foreach (DataRow dr in dt.Rows)
{
Category model = new Category();
if (dr["c_id"] != null)
{
model.Cid = Convert.ToInt32(dr["c_id"]);
}
model.CName = dr["c_Name"].ToString();
model.CRemark = dr["c_remark"].ToString();
model.CIsdel = bool.Parse(dr["c_isdel"].ToString());
model.CAddtime = Convert.ToDateTime(dr["c_addtime"].ToString());
model.CParentId = int.Parse(dr["c_parentId"].ToString());
cb_Cate.Items.Add(model);
}
cb_Cate.DisplayMember = "CName";
cb_Cate.ValueMember = "Cid";
cb_Cate.SelectedIndex = 0;
}
4.搜索事件# |
private void btn_Serch_Click(object sender, EventArgs e)
{
//获得关键字文本框的文本内容
string txtkey = this.txt_key.Text.Trim();
//获取下拉框选中项,转成Category,获取类别ID
int cate = ((Category)cb_Cate.SelectedItem).Cid;
string sqlStr = "select b_Id,c_name,b_title,b_content,b_author,b_isdel,b_addtime,b_money,b_submoney " +
"from Book inner join Category on b_Cid = c_id where b_cid=@cid";
//如果关键字不为空
if (!string.IsNullOrEmpty(txtkey))
{
sqlStr += string.Format(" and b_title like '%{0}%'", txtkey);
}
//得到@cid的值
SqlParameter sq =new SqlParameter("@cid",SqlDbType.Int,4);
sq.Value = cate;
//绑定dgv
DataTable dt = SQLHelper.GetDataTable(sqlStr,sq);
dgv_Books.DataSource = dt;
}
5.点击书籍列表显示具体数据# |
5.1先修改为全行选中#
5.2事件dgv_Books_CellClick(object sender, DataGridViewCellEventArgs e)#
:选中一行,下面显示具体数据
//书籍列表的单元格点击事件
private void dgv_Books_CellClick(object sender, DataGridViewCellEventArgs e)
{
int rowindex = e.RowIndex;
//ID
string bid = dgv_Books.Rows[rowindex].Cells[0].Value.ToString();
lab_ID.Text = bid;
//书名:txt_title
string title = dgv_Books.Rows[rowindex].Cells[2].Value.ToString();
txt_title.Text = title;
//内容:txt_Content
string content = dgv_Books.Rows[rowindex].Cells[3].Value.ToString();
txt_Content.Text = content;
//作者:txt_author
string author = dgv_Books.Rows[rowindex].Cells[4].Value.ToString();
txt_author.Text = author;
//SelectedItem选择的是Item添加cb_Cate.Items.Add的值
//如果绑定的datasource,SelectedValue选择的是cb_bookcate.ValueMember的值
//Cells[9]是c_id的值,一般选择隐藏
cb_bookcate.SelectedValue = dgv_Books.Rows[rowindex].Cells[9].Value.ToString();
}
效果图:
6.新增# |
#region 新增
private void btn_Add_Click(object sender, EventArgs e)
{
string title = this.txt_title.Text.Trim();
string author = this.txt_author.Text.Trim();
string bCid = this.cb_bookcate.SelectedValue.ToString();
string content = txt_Content.Text.Trim();
StringBuilder strSql = new StringBuilder();
strSql.Append("insert into book(");
strSql.Append("b_Cid,b_title,b_content,b_author)");
strSql.Append(" values (");
strSql.Append("@b_Cid,@b_title,@b_content,@b_author)");
strSql.Append(";select @@IDENTITY");
SqlParameter[] parameters =
{
new SqlParameter("@b_Cid", SqlDbType.Int, 4),
new SqlParameter("@b_title", SqlDbType.VarChar, 200),
new SqlParameter("@b_content", SqlDbType.VarChar, 200),
new SqlParameter("@b_author", SqlDbType.VarChar, 200)
};
parameters[0].Value = bCid;
parameters[1].Value = title;
parameters[2].Value = content;
parameters[3].Value = author;
int res = SQLHelper.ExecNonQuery(strSql.ToString(), parameters);
//执行成功则刷新列表
if (res > 0)
{
LoadBooks();
MessageBox.Show("新增成功!");
}
else
{
MessageBox.Show("新增失败!");
}
}
#endregion
7.修改# |
#region 修改
private void btn_Update_Click(object sender, EventArgs e)
{
string bId = this.lab_ID.Text;
string title = this.txt_title.Text.Trim();
string author = this.txt_author.Text.Trim();
string bCid = this.cb_bookcate.SelectedValue.ToString();
string content = txt_Content.Text.Trim();
string sqlStr = string.Format("update book set b_title=@title," +
"b_content=@content,b_author=@author,b_cid=@cid" +
" where b_id=@bid");
SqlParameter[] parameters =
{
new SqlParameter("@title", SqlDbType.VarChar, 200),
new SqlParameter("@content", SqlDbType.VarChar, 200),
new SqlParameter("@author", SqlDbType.VarChar, 200),
new SqlParameter("@cid", SqlDbType.Int, 4),
new SqlParameter("@bid", SqlDbType.Int, 4),
};
//为参数数组中的每个参数赋值
parameters[0].Value = title;
parameters[1].Value = content;
parameters[2].Value = author;
parameters[3].Value = bCid;
parameters[4].Value = bId;
int res = SQLHelper.ExecNonQuery(sqlStr, parameters);
//执行成功则刷新列表
if (res>0)
{
LoadBooks();
MessageBox.Show("修改成功!");
}
else
{
MessageBox.Show("修改不成功!");
}
}
#endregion
8.删除# |
private void btn_Del_Click(object sender, EventArgs e)
{
string bId = this.lab_ID.Text;
StringBuilder strSql = new StringBuilder();
strSql.Append("delete from book ");
strSql.Append(" where b_id=@cid");
SqlParameter[] parameters = {
new SqlParameter("@cid", SqlDbType.Int,4)
};
parameters[0].Value = bId;
int res = SQLHelper.ExecNonQuery(strSql.ToString(), parameters);
//执行成功则刷新列表
if (res > 0)
{
LoadBooks();
MessageBox.Show("删除成功!");
}
else
{
MessageBox.Show("删除失败!");
}
}
9.退出# |
//退出
private void btn_Out_Click(object sender, EventArgs e)
{
//this.Close();
//只是关闭了当前窗口,若不是主窗体的话,是无法退出整个程序的,
//另外若有托管线程(非主线程)如指针之类的,也无法干净地退出。
//Application.Exit();
//强制所有消息中止,退出所有的窗体,但是若有托管线程(非主线程),也无法干净地退出。
//Application.ExitThread();
//强制中止调用线程上的所有消息,无法控制多线程正确退出的问题;
//System.Environment.Exit(0);
//这是最彻底的退出方式,不管什么线程都被强制退出,把程序结束的很干净。
System.Environment.Exit(System.Environment.ExitCode);
//所以在程序中需要强制退出的地方加上System.Environment.Exit(System.Environment.ExitCode);
//还有一种方法: System.Threading.Thread.CurrentThread.Abort();
//或者 Process.GetCurrentProcess().Kill()
//或者 Application.ExitThread();
//或者 Application.ExitThread()
}
作者:【唐】三三
出处:https://www.cnblogs.com/tangge/archive/2012/10/25/2739068.html
版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具