1.1. DataSet
DataSet (数据集)是 ADO.NET 结构的主要组件,它是从数据源中检索到的数据在内存中的缓存。
DataSet的使用方法,请自行查找,本文仅讨论Typed DataSet。
1.2. Typed DataSet文件结构
Typed DataSet,在Visual Studio中,以.xsd作为主文件,此文件用于记录表格结构,数据类型,查询字符串等信息。在编译时,此文件会先被转为自动转为.cs文件之后进行编译。
在项目中,还会存在.xsc文件和.xss文件。前者似乎可以用来设置Table UI,但是我没有查到相关信息,也从用过;后者是用来存储在VisualStudio中的视图,不会影响实际执行。
Web Site项目中,只包含上述三个文件,在Web Application项目中,还会包含.cs和.Designer.cs两个文件。前者供开发人员写自己的方法和属性,后者由系统自动生成,建议不要改动(同其他的.Designer.cs一样)。
1.3. 优点
一:在使用DataSet时,需要多行代码才能执行查询,包括设置Connection,QueryString,Command等等,查询开始之前和结束之后,还要手动执行Connection的Open()和Close(),如果不慎忘记执行,将会导致运行错误。在TypedDataSet中,只需要使用2行代码就可以执行一次查询(不计逐项取出数据)。
类似于:
MyDataSetTableAdapters.MyTableAdaptertaMyTable = new MyDataSetTableAdapters.MyTableAdapter();
MyDataSet.MyTable dtMyTable =taMyTable.GetData();
确实,通过封装,自己写DataSet代码也可以达到同样功能,但是不要忘记,VS是会自动生成代码的,只需要拖动几次就可以了。
二:“半”自动化生成代码。如前面所说,只需要一次拖动,就可以生成一个Table的基本功能,包括Select, Update,Delete和Insert函数。
三:类型检查。如果开发者尝试将一个字符串放入数据库中应当为整型的列,在使用TypedDataSet时,会产生一个编译错误;而普通DataSet只会在运行时才产生错误。
四:逐键提示(键入提示)。在使用时,Typed DataSet可以充分利用VS的逐键提示功能。例如,取出myDataSet中的MyLongLongNameTable中的第1行MyVeryVeryVeryVeryLongNameColumn列中的数据,普通的DataSet要写作:
myDataSet.Tables["MyLongLongNameTable"].Rows[0]["MyVeryVeryVeryVeryLongNameColumn"];
而在Typed DataSet中,写作:
myDataSet.MyLongLongNameTable.Rows[0]. MyVeryVeryVeryVeryLongNameColumn;
在第一个和第三个点输入之后,VS都会弹出提示框,让开发者可以减少键入数量,同时避免键入错误。另外,使用普通的DataSet,通常要加上强制类型转换的代码,但是TypedDataSet 不用。
五:绑定
其实这个不能算作Typed DataSet的优点,因为在后台,这部分代码,和普通的DataSet用起来没什么区别。
在asp.net中,Typed DataSet可以在aspx中作为ObjectDataSource绑定给GridView或者DropDownList之类的控件,而普通的DataSet只能在后台绑定。
哦,这里 需要提一下SqlDataSource。这个控件可以同样简便地将数据库数据绑定到控件上。相较而言,这个使用起来更灵活,但是如果重复使用的话,不便于代码的集中控制,也没有重用性。
1.4. 缺点
Typed DataSet同样有缺点,这些缺点主要体现在开发上。
一:VS视图没有自动排列功能,且难以查找。当一个TypedDataSet中包含较多个表的时候,会占用很大的空间,以至于必须拖动滚动条才能看到其他的表。表之间可能重叠,必须手动将它们拖开。如果开发者修改了某个表的结构,或者添加了QueryString,那么很可能需要拖动数个表,才能重新保证视图美观。
另外,如果在VS中使用“查找”功能,只能查到XML格式的代码(.xsd文件中),却无法在视图页面找到需要的表或者列。只能用肉眼一个一个地寻找。
二:愚蠢的默认设置。数据库中,某列可以是NULL,那么当尝试取出这个NULL时,会怎样呢?默认设置是抛出异常。其实,我们需要它直接返回NULL会常见,另外在字符串时,也经常需要它返回空字符串,而不是抛出异常。开发者可以对此项进行设定,但是每次修改表的结构,它都会变回默认值,需要重新设定。
另外一个例子,我写了一个查询:
SELECT ID, Type_Code FROM Type WHERE Type_Code =@Type_Code OR @Type_Code=’ALL’
也就是说,我输入一个Type_Code,我希望查到所有这个Type_Code的行;假设说我输入“ALL”我希望获得所有行。
问题在于,假设说Type_Code列是varchar(2),那么@Type_Code也会被默认设定为长度是2,“ALL”就会被截断(无法设置,无错误提示)以至于无法获得需要的结果。此项同样可以设置,同样地,它也会在改变表格结构之后,自动变回默认值。