什么是DataSet? 它是一个数据集,读取数据。使用中,有强类型数据集和弱类型数据集(标准说法应该是类型化的dataset和非类型化的dataset),前者是生产中常用的方式,因为强类型数据集使用时表名都是自动生成的,避免了字符串内容输入错误带来的调试问题(因为这类问题编译器不会报错),所以推荐使用强类似的dataset,它对数据库的操作是实时的!但是有一次写代码出现了一个情况:创建好adapter和datatable->更新->遍历表,但是数据却发现没有更新,但是结束后右键查看表然后右键重新执行SQL发现写进去了(注:刷新是没用的)这原因很简单,因为被遍历的datatable在更新之前就被取了出来,遍历的是被取出来放在内存中的表,如果把顺序改为:创建好adapter->更新->datatable->遍历表的话就能看到明显的效果。故datatable的遍历操作之前应该就是该表的建立,这样才是真正实时反馈(尽管数据库文件绝对是实时的)。 当然,它也有不足,如果这个数据库要是经常要变换字段的话,每一次变换都要重新生成。 了解DataSet,DataTable和DataRow的关系: dataset的本质其实就是一个一个的datatable,而datatable的本质其实就是一个一个的datarow。所以有 而且可以这样想,在建立类型化的dataset时,拖入数据集的是数据库中的某个表,也就是datatable。故对于一个数据集可以看出一个数据库,拖入多少个表里面就有多少个不同的datatable,然后不同的datatable又有各自对应的adapter(配置器)。联想到数据库文件的结构:数据库-数据库中的表-表中的行列,就很容易明白这种结构的建立方式了。 adapter.Fill(dataset)过程是什么意思: 就是将执行将某实例adapter后得到的数据填充到某实例dataset中去。因为adapter执行了sql操作,返回的是表,所以如果想结果放到一个dataset中,就执行这个操作 它的作用? 在用ExecuteDataReader时用到一个SqlDataReader对象设为reader的read()方法来读取数据时可能出现一种情况,就是当SqlConnection关闭的时候数据便无法获得了,这是因为用SqlDataReader读取出来的数据不是放在程序中的,而是放在数据库服务器中的,那么,一旦链接关闭,就没法读取了。 一般来说,如果是简单的程序结构是不会出现的,例如前面的例子,但是在具体的生产中,经常把这些查询方法都封装在一个类中,便于使用,比如说起名为SqlHelper类,然后按照常理来说ExecuteNonQuery()方法返回的是int;ExecuteScalar()返回的是一个object;都是可以的,那么ExecuteReader();就应该返回一个SqlDataReader对象了,但是就会出现上情况,在SqlHelper类中调用玩它就关闭了链接,在主方法中调用就会出错,故必须得使用别的方法来读取数据,即DataSet的作用就是解决了这个问题,它直接去出来放在数据库服务器内存中,链接关闭了也可以访问数据。 执行大批量操作时: 在利用强类型化dataset访问数据库时,vs会自动为用户生成各种操作方法,xxx.Insert(xxx),xxx.Delete(xxx),xxx.Update(xxx);而且,可以通过观察这些方法具体的方法内容,可以发现,都含有一段自动判断是否打开链接的判断,如果没有打开他们会自动打开,如果打开了则会判断语句是否完了,如果语句结束会自动关闭连接,所以我们也没有必要自己去添加adapter.connection.Open和adapter.connection.Close语句(尽管加了也不会出错)。 但是,如果是一次性批量的添加大量的数据时,比如是对某数据库添加10000个数据,如果没一个都在添加时自动去判断是否打开链接的话,势必会对耗费大量的时间。 因此,如果是大的批量操作,一般来说自己写链接的开与关: adapter.connection.Open(); ..... 操作语句 ..... adapter.connection.Close(); 这样耗时要少,因为在判断中第一个if语句就直接判断了情况。 DataSet的缺点: 因为DataSet要把数据放在数据库服务器中,势必会占用数据库服务器内存,而SqlDataReader不会。故使用原则是:对于查询数据结果量小的尽量使用DataSet,而对于数据查询结果庞大的还是SqlDataReader为佳(由于刚刚入门,可能还有别的更好的方法)。 2、下面图示是强类型一般的使用方法流程:
在数据库直接模式中xxxxAdapter.update(是对应需要更新的内容作为参数);如:productsAdapter.Update("Chai",
1, 1, "10 boxes x 20 bags",18.0m, 39, 15, 10, false,
1);这样就和一个update的SQL语句一样。 |
|