首页 > 代码库 > 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对象,一起发送到数据库引擎执行

?

  1. 模糊查询不能在参数位置添加%....
  2. Parameter的构造函数,设置参数类型的时候,也要设置参数类型长度,有可能会截断

?

整个ADO包含两大部分:数据提供程序,和数据集

?

NonQuery :非查询,只要影响行数

Scalar :查询出来的数据,只要第一行第一列

Reader:查询出来的数据,全部都要(所有行,所有列),大数据量的

DataSet:查询出来的数据,全部都要(所有行,所有列),比较小数据量的

因为 DataSet是一次新吧所有查询出来的数据全部都搬回 本地内存中

案例

  1. 登陆案例总结:
  2. 省市联动案例总结:

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),

特点:

  1. 不用手动打开数据库连接,不用手动创建命令对象,不用手动关闭连接通道
  2. 可以一次执行多条查询语句,返回多张表。
  3. 内部:其实也是有一个SqlCommand 对象的,通过命令对象返回DataReader,然后再通过读取器读取数据,填充数据集
  4. 注意,比较返回的两个数值是否相等的时候,要转换成tostring()或者字段的数据类型,否则比较的就是object引用类型的引用地址,dr[]通过索引获取相应列的值,返回Object类型的值,跟dataRead一样的。
  5. 一般有Idisposable接口的都using 一下
  6. 实现了IListSource接口的对象都可以作为被绑定的数据源
  7. Reader,大数量结果集放在服务器内存,DataSet,小数据量直接存到内存
  8. ?

?

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文档