首页 > 代码库 > 6.ado_dataset文档
6.ado_dataset文档
ExecuteNonQuery() 执行非查询语句,insert update delete 三种基本语句,返回的是数据库,受影响行数,
在insert中,如果有输出insered.id ,会返回一个结果集,这个结果集只包含一行一列,这一行一列,就是刚才新增的id
?
什么是结果集:sql语句被发送到数据库引擎,执行之后的一个结果的集合
?
ExecuteScalar() 取得结果集的首行,首列的值,因为,这一列的类型不确定,所以返回的是object类型,需要我们自己转换类型,因为我们写sql语句的时候,就能确定,将要返回的结果集的首行首列是什么类型的了,如果返回的结果集一行一列都木有,那么这个方法就返回null(C#)
?
ExecuteReader() 执行查询,返回一个读取器,这个读取器指向结果集,结果集是在服务器内存中的,
?
DataReader,内部的指针默认是指向结果集的第一行的前面的,只有我们调用了DataReader.Read() 这样,会到服务器去拿一行数据,才会向前移动一次指针,
DaTAReader.HasRows这个属性,是表示当前读取器指向的服务器结果集是否有任何一行数据,只要有数据,不管有多少行,都返回true,一行都木有的,才返回false
?
在Cmd.ExecutReader(),数据库查询完,就生成结果集,根据结果集返回读取器,这时候,读取器的HasRows属性就被赋值了
?
Read() 将指向数据库结果集的指针,向前进一个,并且返回这一行的数据,然后保存在dr中,这样我们就取到当前指向的这一行的数据
?
Try Catch 保证一个功能出错了,不会 影响另外的功能,
出错的代码在try中,只会影响后面的几行
?
注入漏洞:拼接出特殊的sql语句,造成数据库执行错误(和预期的执行结果不一致的结果)
使用参数化查询可以避免
神级字符串:‘or ‘1‘=‘1 ;
?
参数化查询:在交给Command对象的sql语句中,用一个@加上几个字符,组成的一个参数名字,如:@name
然后借助Parameter类,来创建参数对象,并且交给command对象,一起发送到数据库引擎执行
?
- 模糊查询不能在参数位置添加%....
- Parameter的构造函数,设置参数类型的时候,也要设置参数类型长度,有可能会截断
?
整个ADO包含两大部分:数据提供程序,和数据集
?
NonQuery :非查询,只要影响行数
Scalar :查询出来的数据,只要第一行第一列
Reader:查询出来的数据,全部都要(所有行,所有列),大数据量的
DataSet:查询出来的数据,全部都要(所有行,所有列),比较小数据量的
因为 DataSet是一次新吧所有查询出来的数据全部都搬回 本地内存中
案例
- 登陆案例总结:
- 省市联动案例总结:
DataSet
把数据库查询过后的 结果集 拿到本地来存储在本地内存中,就变成了 数据集
?
DataSet=ds; DaTable=dt;DataRow=dra;DataColumn =dc
?
DataSet包含多个DaTable,DaTable被包含在DataSet 的DaTableCollection中
DataSet. DaTableCollectio[0]àDataTable
DataTable包含多个DataColumn,DataColnumn被包含在DataTable的DataColumnCollection中
DataTable包含多个DataRow ,DataRow被包含在DataTable 的DataRowCollection中
?
SqlDataAdapter
相当于卡车的作用,自动的根据命令到数据库查询数据,并且拿回来,倒在临时的数据仓库(DataSet),
特点:
- 不用手动打开数据库连接,不用手动创建命令对象,不用手动关闭连接通道
- 可以一次执行多条查询语句,返回多张表。
- 内部:其实也是有一个SqlCommand 对象的,通过命令对象返回DataReader,然后再通过读取器读取数据,填充数据集
- 注意,比较返回的两个数值是否相等的时候,要转换成tostring()或者字段的数据类型,否则比较的就是object引用类型的引用地址,dr[]通过索引获取相应列的值,返回Object类型的值,跟dataRead一样的。
- 一般有Idisposable接口的都using 一下
- 实现了IListSource接口的对象都可以作为被绑定的数据源
- Reader,大数量结果集放在服务器内存,DataSet,小数据量直接存到内存
- ?
?
DataSet ds = new DataSet();//创建了一个 空 的数据集
DataTable dt = new DataTable();//创建一个空的数据表
ds.Tables.Add(dt);//将创建出来的表,添加到数据集的表集合中
?
DataColumn dc = new DataColumn();//创建一个列
dc.ColumnName = "id";//指定列名
dc.DataType = typeof(int);//指定列的类型
dc.AllowDBNull = false;//指定不能为null
dc.Unique = true; //不能重复
dc.AutoIncrement = true;//自动增长
dc.AutoIncrementSeed = 100;//增长种子
dc.AutoIncrementStep = 10;//增量
dt.Columns.Add(dc);//把列添加到表中
?
DataColumn dcName = new DataColumn();
dcName.ColumnName = "Name";
dcName.DataType = typeof(string);
dcName.AllowDBNull = false;
dt.Columns.Add(dcName);
?
//不能调用new,构造函数访问不到,被保护
//要询问数据表,你有什么列,告诉我,然后我就有什么列
DataRow dr = dt.NewRow();
?
dr[1] = "张三";//设置name
dt.Rows.Add(dr);//添加到行集合中
?
DataRow dr2 = dt.NewRow();
dr2[0] = 1;//手动设置id
dr2[1] = "李四";
dt.Rows.Add(dr2);
//如果手动赋值了id列,就是手动赋值的值,如果不手动赋值,那么就跟着种子和增量走
?
DataRow dr3 = dt.NewRow();
dr3[1] = "张三2";
dt.Rows.Add(dr3);
?
//打印数据集中有几张表
MessageBox.Show(ds.Tables.Count.ToString());
//打印第一张表有几个列
MessageBox.Show(ds.Tables[0].Columns.Count.ToString());
//打印第一张表有几行
MessageBox.Show(ds.Tables[0].Rows.Count.ToString());
//打印第一张表的第一行的第一列
MessageBox.Show(ds.Tables[0].Rows[0][0].ToString());
//打印第一张表的第二行的第一列
MessageBox.Show(ds.Tables[0].Rows[1][0].ToString());
//打印第一张表的第三行的第一列
MessageBox.Show(ds.Tables[0].Rows[2][0].ToString());
?
SqlParameter sp = new SqlParameter("@id", SqlDbType.Int);
sp.Value = http://www.mamicode.com/0;
在是用参数化查询的时候,如果使用构造函数传递参数的值,那么如果参数刚好就是数字的0的时候,系统会吧这个0当成是枚举的第一个值,所以,我们传的就没有值了
,为了避免这种情况,最好写成上述形式。
?
配置文件:
每个程序保存一些信息的文件,开发的时候,winfrom的名字叫app.config
WebForm的web.config,
在winform程序被编译之后,这个文件会变成"程序名.config"
?
在configuration节点里面添加一个connectionStrings节点,再里面添加一个add节点
?
联系筛选:不管我填哪一个筛选条件都要能筛选出来,如果一个都不选,就全部显示出来
如果随便选任何两个也是要可以的
?
SqlHelper"的类型初始值设定项引发异常。
这个错误是说明木有链接字符串滴,也就是配置文件里面没有添加connectionstring
?
补充:封装方法
?
#region ExecuteDataSet +1
/// <summary>
/// ExecuteDataSet
/// </summary>
/// <param name="sql">查询字符串</param>
/// <returns>DataTable</returns>
public static DataSet ExecuteDataSet(string sql, params SqlParameter[] paramenters)
{
return ExecuteDataSet(CommandType.Text, sql, paramenters);
}
/// <summary>
/// ExecuteDataSet
/// </summary>
/// <param name="sql">查询字符串</param>
/// <param name="paramenters">params SqlParameter[]</param>
/// <returns>DataSet</returns>
public static DataSet ExecuteDataSet(CommandType type, string sql, params SqlParameter[] paramenters)
{
using (DataSet dataset = new DataSet())
{
using (SqlDataAdapter adapter = new SqlDataAdapter(sql, connstr))
{
adapter.SelectCommand.CommandType = type;
adapter.SelectCommand.Parameters.AddRange(paramenters);
adapter.Fill(dataset);
return dataset;
}
}
}
#endregion
6.ado_dataset文档