一、重要对象(五大对象)
1.Connection:连接对象
负责配置、建立和管理连接,通过连接池优化性能,并确保资源安全释放。
2.Command:命令对象
在数据库中执行的SQL命令 或 存储过程
3.DataReader:数据读取器
用于从数据库中读取快速的且只是前向的、只读的数据流。意味着只能按照一定顺序从数据流中取出数据。如果要操作数据使用DataSet.
适用于执行查询操作,返回结果集。
4.DataAdapter:数据适配器
适配器用于填充DataSet对象,并解决数据源和数据集之间的差异。
可以执行查询、插入、更新和删除操作。
5. DataSet:数据集
数据在内存中的表示形式。它包括多个DataTable对象,而DataTable包含列和行,就像一个普通的数据库中的表。可以包含多个表、关系和约束。
用于离线操作和数据缓存。
--------------------------------------------------------------------
DataTable:
表示DataSet中的一个表。
可以独立于数据库存在,用于存储和管理数据。
SqlParameter:
表示 SqlCommand 的参数,或者其与 DataSet 列的映射。
sql拼接,有sql注入风险,正规做法:借助SqlParameter,可以解决sql注入风险
二、重要类的关键代码
a. SqlConnection建立和SQL Server 数据库的连接。
如:
// Server=服务器名称(本机:.,localhost,127.0.0.1,计算机名,IP 远程:IP)
//database=数据库名称;user=登录SQL的用户名;pwd=登录SQL的用户名的密码;
string connString = "server=.;database=xxx;uid=sa;pwd=xxx;";
using(SqlConnection conn = new SqlConnection(connString)){
conn.Open();
}
b. SqlCommand执行SQL Server命令或存储过程。
如:
SqlCommand command = new SqlCommand(sql, conn);
command.ExecuteXXX();
c. SqlDataReader用来读取SQL Server数据中的数据。SqlDataReader不能直接给DataGridView使用。
如:
SqlDataReader dataReader = new SqlReader(cmd);
DataTable dt = new DataTable();
dt.Load(dataReader);
d. SqlDataAdapter 用于在数据库和DataSet之间传输数据。
如:
SqlDataAdapter dataAdapter = new SqlDataAdapter(cmd)
DataSet ds = new DataSet()
dataAdapter.Fill(ds);
e. DataSet 数据的容器,可以包含多个数据表(DataTable)。
--------------------------------------------------------------------
SqlParameter表示SqlCommand的参数,或者其与DataSet列的映射。
// sql参数的命名约定:@开头
// SqlDbType是sql参数在数据库中的数据类型。
// Size是sql参数在数据库中的数据类型长度。
SqlParameter[] sqlParameters = new SqlParameter[]{
new SqlParameter("@StuName",SqlDbType.VarChar),
new SqlParameter("@AgeStart",SqlDbType.Int),
new SqlParameter("@AgeEnd",SqlDbType.Int),
new SqlParameter("@Sex",SqlDbType.Bit),
new SqlParameter("@BirthdayStart",SqlDbType.DateTime),
new SqlParameter("@BirthdayEnd",SqlDbType.DateTime),
};
数据库设计
// 给参数赋值
sqlParameters[0].Value = $"%{txtStuName.Text}%";
sqlParameters[1].Value = nudAgeStart.Value;
sqlParameters[2].Value = nudAgeEnd.Value;
sqlParameters[3].Value = cbbSex.SelectedValue;
sqlParameters[4].Value = dtpBirthdayStart.Value.ToString("yyyy-MM-dd") + " 00:00:00";
sqlParameters[5].Value = dtpBirthdayEnd.Value.ToString("yyyy-MM-dd") + " 23:59:59";
窗体设计
// 在sql中使用参数
string sql = $"select * from Student where 1=1";
if (!string.IsNullOrWhiteSpace(txtStuName.Text))
sql += " and StuName like @StuName";
if (nudAgeStart.Value > 0)
sql += " and Age>=@AgeStart";
if (nudAgeEnd.Value > 0)
sql += " and Age<=@AgeEnd";
if (cbbSex.SelectedValue.ToString() != "-1")
sql += " and Sex=@Sex";
if (!string.IsNullOrWhiteSpace(dtpBirthdayStart.Text))
sql += " and Birthday>=@BirthdayStart";
if (!string.IsNullOrWhiteSpace(dtpBirthdayEnd.Text))
sql += " and Birthday<=@BirthdayEnd";
// 必须把SqlParameter和SqlCommand建立联系,sql字符中的参数才能被sql参数的值替换。
// 创建一个命令实例。
SqlCommand command = new SqlCommand(sql, connection);
command.Parameters.Clear(); // 清空命令使用的参数
command.Parameters.AddRange(sqlParameters);
// Execute执行命令,两种情况:a.返回影响行数(Insert, Update, Delete语句返回的都是行数)。b.返回结果集(Select返回是结果集) c.返回第一行第一列(本质上也是结果集)
// 执行命令,把命令返回的结果集存储到
dataReader
SqlDataReader dataReader = command.ExecuteReader();
// 数据表,是一个存储数据的容器
// DataSet数据集,一个数据集中有多张数据表(DataTable)
DataTable dt = new DataTable();
// 让dt自动加载dataReader中的数据(把dataReader的数据转存到dt中)
dt.Load(dataReader);
// 绑定数据源,
dataGridView1.DataSource = dt;
// 3. 关闭数据库连接
connection.Close();