学习是一个日积月累的过程,加油,Kencery
- DataSet
(1) DataSet就相当于一个离线的数据库,他可以将你数据库中的数据全部读取到内存中
(2) 几乎数据库有什么,DataSet就有什么
(3) 手写一个DataSet
1 static void Main(string[] args) 2 3 { 4 5 //DataSet 相当于一个离线的数据库 6 7 DataSet ds = new DataSet("HYLDataSet"); //相当于数据库的名称 8 9 //创建一个DataTable 10 11 DataTable dt=new DataTable("HYL"); 12 13 //将数据表添加到数据库 14 15 ds.Tables.Add(dt); 16 17 //设计数据库表的时候需要设计什么?,与设计数据表一样,开始创建列,并且将列要加到Table中 18 19 DataColumn col1=new DataColumn("Id",typeof(int)); 20 21 //主键字段要自增 22 23 col1.AutoIncrement=true; 24 25 col1.AutoIncrementSeed=1; 26 27 col1.AutoIncrementStep=1; 28 29 //第二列 30 31 DataColumn col2=new DataColumn("Name",typeof(string)); 32 33 // 将字段加到数据表中 34 35 //dt.Columns.Add(col1); 36 37 //dt.Columns.Add(col2); 38 39 dt.Columns.AddRange(new DataColumn[] { col1, col2 }); 40 41 //添加数据,就是创建一行 42 43 for (int i = 0; i < 10; i++) 44 45 { 46 47 DataRow r1 = dt.NewRow(); 48 49 r1["name"] = "韩迎龙" + i; 50 51 dt.Rows.Add(r1); 52 53 } 54 55 //将表输出成XML 56 57 ds.WriteXml("xml.xml"); 58 59 }
- SqlDataAdapter适配器
(1)作用就是将数据库中的数据读取出来变成一个DataSet
1 static void Main(string[] args) 2 3 { 4 5 //先new一个DataSet和一个SqlDataAdapter 6 7 DataSet ds = new DataSet("itheima"); 8 9 string sql = "select * from Person0917"; 10 11 string connStr = @"server=HYL;database=itheima;uid=sa;pwd=saa"; 12 13 SqlDataAdapter sa = new SqlDataAdapter(sql, connStr); 14 15 //调用Fill方法读取数据 16 17 sa.Fill(ds); 18 19 ds.WriteXml("HYLXML.xml"); 20 21 }等同于 22 23 string sql = "select * from Person0917"; 24 25 string connStr = @"server=HYL;database=itheima;uid=sa;pwd=saa"; 26 27 using (SqlConnection conn = new SqlConnection(connStr)) 28 29 { 30 31 DataSet ds = new DataSet(); 32 33 SqlDataAdapter sa = new SqlDataAdapter(sql, conn); 34 35 sa.Fill(ds); 36 37 ds.WriteXml("HYL1.xml"); 38 39 }
(2)SqlDataAdapter对象的构造方法,可以提供SQL语句与连接字符串
(3)实际上SqlDataAdapter是对前面Connection,Command,DataReader等对象的一个封装,其内部还是有哪些对象实现的,
可以使用Reflect查看。
(4)SqlDataAdapter也是需要访问数据库的,它同样包含非托管资源
using (SqlDataAdapter sa = new SqlDataAdapter(sql, conn))
{
}
(5)SqlDataAdapter的构造函数提供一个SQL语句与一个连接字符串,就知道这个SqlDataAdapter能做什么?
SqlDataAdapter由SQL语句与连接字符串决定唯一决定的
1)SQL语句决定了SqlDataAdapter能做什么
2)连接字符串决定了SqlDataAdapter在什么地方去做
- 利用DataSet和SqlDataAdapter绑定数据
(1) 介绍SqlDataAdapter与DataSet的目的就是为了实现数据的绑定
(2)实现数据的绑定(Winform)
1)提供DataGridView控件
2)将数据放到DataSet中
3)使用DataSource属性
1 private void btnShow_Click(object sender, EventArgs e) 2 3 { 4 5 //得到DataSet 6 7 string sql = @" select stuId, stuName, stuSex, stuBirthdate, stuStudydate, stuAddress, stuEmail, stuPhone, stuIsDel, stuInputtime 8 9 from Student 10 11 where stuIsDel=0"; 12 13 String connStr = @"server=HYL;database=testDataBase; uid=sa;pwd=saa"; 14 15 DataSet ds = new DataSet(); 16 17 using (SqlDataAdapter sa = new SqlDataAdapter(sql, connStr)) 18 19 { 20 21 sa.Fill(ds); 22 23 } 24 25 dgvData.DataSource = ds.Tables[0]; 26 27 //固定前两列 28 29 dgvData.Columns[1].Frozen = true; 30 31 }
- 利用DataSet和SqlDataAdapter修改数据
1 public partial class Form1 : Form 2 3 { 4 5 public Form1() 6 7 { 8 9 InitializeComponent(); 10 11 } 12 13 string sql = @" select stuId, stuName, stuSex, stuBirthdate, stuStudydate, stuAddress, stuEmail, stuPhone, stuIsDel, stuInputtime 14 15 from Student 16 17 where stuIsDel=0"; 18 19 String connStr = @"server=HYL;database=testDataBase; uid=sa;pwd=saa"; 20 21 SqlDataAdapter sa; 22 23 private void btnShow_Click(object sender, EventArgs e) 24 25 { 26 27 //得到DataSet 28 29 DataSet ds = new DataSet(); 30 31 sa= new SqlDataAdapter(sql, connStr); 32 33 sa.Fill(ds); ; 34 35 dgvData.DataSource = ds.Tables[0]; 36 37 //固定前两列 38 39 dgvData.Columns[1].Frozen = true; 40 41 } 42 43 44 45 private void btnUpdate_Click(object sender, EventArgs e) 46 47 { 48 49 //怎么更新?只用调用Adapter的Update方法即可 50 51 //SqlDataAdapter对象需要释放资源,但是读取与更新是同一个SqlDataAdapter 52 53 //数据库知不知道你更新的是什么? 54 55 //使用SqlCommandBuilder 56 57 //这个对象可以根据你的SqlDataAdapter对象声称对应的增删改查 58 59 //删除数据的时候,如果数据有主外键约束,需要先删除外键表中的数据,才能删除主键表中的数据 60 61 if (sa != null) 62 63 { 64 65 //必须要添加 66 67 SqlCommandBuilder scb = new SqlCommandBuilder(sa); 68 69 sa.Update((DataTable)dgvData.DataSource); 70 71 } 72 73 MessageBox.Show("更新完成"); 74 75 } 76 77 }
(2)使用上面的方法将不会释放SqlDataAdapter对象在内存重的数据
private void btnUpdate_Click(object sender, EventArgs e)
{
//怎么更新?只用调用Adapter的Update方法即可
//SqlDataAdapter对象需要释放资源,但是读取与更新是同一个SqlDataAdapter
//数据库知不知道你更新的是什么?
//使用SqlCommandBuilder
//这个对象可以根据你的SqlDataAdapter对象声称对应的增删改查
//删除数据的时候,如果数据有主外键约束,需要先删除外键表中的数据,才能删除主键表中的数据
string sql = @" select stuId, stuName, stuSex, stuBirthdate, stuStudydate, stuAddress, stuEmail, stuPhone, stuIsDel, stuInputtime
from Student
where stuIsDel=0";
string connStr = @"server=HYL;database=testDataBase; uid=sa;pwd=saa";
using (SqlDataAdapter sa = new SqlDataAdapter(sql, connStr))
{
//必须要添加
SqlCommandBuilder scb = new SqlCommandBuilder(sa);
sa.Update((DataTable)dgvData.DataSource);
}
MessageBox.Show("更新完成");
}
- 利用DataSet和SqlDataAdapter多条件查询
(1) 按照姓名查询
1 private void btnSelect_Click(object sender, EventArgs e) 2 3 { 4 5 //先根据用户的输入得到查询的Sql语句 6 7 string name = txtName.Text.Trim(); 8 9 string sql = @" select stuId, stuName, stuSex, stuBirthdate, stuStudydate, stuAddress, stuEmail, stuPhone, stuIsDel, stuInputtime 10 11 from Student 12 13 where stuIsDel=0"; 14 15 //判断是否使用精确查找 16 17 if (ckbJingque.Checked) 18 19 { 20 21 //精确查找 22 23 sql += " and stuName=@stuName"; 24 25 } 26 27 else 28 29 { 30 31 sql += " and stuName like '%'+@StuName+'%'"; 32 33 } 34 35 string connStr = @"server=HYL;database=testDataBase; uid=sa;pwd=saa"; 36 37 //得到DataSet 38 39 DataTable dt = new DataTable(); 40 41 using (SqlDataAdapter sa = new SqlDataAdapter(sql, connStr)) 42 43 { 44 45 //需要添加参数 46 47 sa.SelectCommand.Parameters.AddWithValue("@stuName", name); 48 49 sa.Fill(dt); 50 51 dgvData.DataSource = dt; 52 53 } 54 55 }
(2)按照姓名,年龄,性别查询数据
1 //第一种方法: 2 3 private void btnSelected_Click(object sender, EventArgs e) 4 5 { 6 7 //准备基本的SQL语句和连接字符串 8 9 string sql = @" select stuId, stuName, stuSex, stuBirthdate, stuStudydate, stuAddress, stuEmail, stuPhone, stuIsDel, stuInputtime 10 11 from Student where 1=1"; 12 13 string connStr = @"server=HYL;database=testDataBase; uid=sa;pwd=saa"; 14 15 //定义参数,使用list集合 16 17 List<SqlParameter> list = new List<SqlParameter>(); 18 19 //准备装配参数 20 21 if (!string.IsNullOrEmpty(txtUserName.Text.Trim())) 22 23 { 24 25 sql += " and stuName like '%'+@stuName+'%'"; 26 27 list.Add(new SqlParameter("@stuName", txtUserName.Text.Trim())); 28 29 } 30 31 if (!string.IsNullOrEmpty(txtGender.Text.Trim())) 32 33 { 34 35 sql += " and stuSex=@stuSex"; 36 37 list.Add(new SqlParameter("@stuSex", txtGender.Text.Trim())); 38 39 } 40 41 if (!string.IsNullOrEmpty(txtAge.Text.Trim())) 42 43 { 44 45 sql += " and stuBirthdate=@stuBirthdate"; 46 47 list.Add(new SqlParameter("@stuBirthdate", txtAge.Text.Trim())); 48 49 } 50 51 DataTable dt = new DataTable(); 52 53 using (SqlDataAdapter sa = new SqlDataAdapter(sql, connStr)) 54 55 { 56 57 sa.SelectCommand.Parameters.AddRange(list.ToArray()); 58 59 sa.Fill(dt); 60 61 } 62 63 dgvData.DataSource = dt; 64 65 } 66 67 //第二种方法: 68 69 public Form1() 70 71 { 72 73 InitializeComponent(); 74 75 txtName2.Enabled = checkBox1.Checked; 76 77 txtSex.Enabled = checkBox2.Checked; 78 79 } 80 81 private void checkBox1_CheckedChanged(object sender, EventArgs e) 82 83 { 84 85 txtName2.Enabled = checkBox1.Checked; 86 87 } 88 89 private void checkBox2_CheckedChanged(object sender, EventArgs e) 90 91 { 92 93 txtSex.Enabled = checkBox2.Checked; 94 95 } 96 97 private void benSelectUserNameAndSex_Click(object sender, EventArgs e) 98 99 { 100 101 //准备基本的SQL语句和连接字符串 102 103 string sql = @" select stuId, stuName, stuSex, stuBirthdate, stuStudydate, stuAddress, stuEmail, stuPhone, stuIsDel, stuInputtime 104 105 from Student"; 106 107 String connStr = @"server=HYL;database=testDataBase; uid=sa;pwd=saa"; 108 109 List<string> paralist = new List<string>(); 110 111 List<SqlParameter> sqlList = new List<SqlParameter>(); 112 113 if (checkBox1.Checked) 114 115 { 116 117 paralist.Add("stuName=@stuName"); 118 119 sqlList.Add(new SqlParameter("@stuName", txtName2.Text.Trim())); 120 121 } 122 123 if (checkBox2.Checked) 124 125 { 126 127 paralist.Add("stuSex=@stuSex"); 128 129 sqlList.Add(new SqlParameter("@stuSex", txtSex.Text.Trim())); 130 131 } 132 133 if (paralist.Count > 0) 134 135 { 136 137 sql += " where " + string.Join(" and ", paralist.ToArray()); 138 139 } 140 141 DataTable dt = new DataTable(); 142 143 using (SqlDataAdapter sa = new SqlDataAdapter(sql, connStr)) 144 145 { 146 147 sa.SelectCommand.Parameters.AddRange(sqlList.ToArray()); 148 149 sa.Fill(dt); 150 151 } 152 153 dgvData.DataSource = dt; 154 155 }