DataTable类型的数据源属于断开连接式的数据源,在数据库应用程序开发中经常用到,它存储在内存中,所以读取效率比较高。本实例创建一个控制台应用程序,用于从指定的数据表中获取DataTable类型的数据源,并输出数据源中的相关数据。
例4.21 获取DataTable类型数据源产生的陷阱(光盘位置:光盘\MR\Instance\4\21\ UseDataTable),该实例的实现过程如下。
在本实例的默认类Program中添加一个自定义方法GetDataTable,该方法通过传入一个表示查询功能字符串来获取DataTable类型的数据源,该方法的代码如下:
在Program类的Main方法中调用GetDataTable方法获取DataTable类型的数据源,并输出数据源中的相关数据,具体代码如下:
上面的代码判断若返回的DataTable实例的Rows属性值不为空,则输出第一行第一列的值;若DataTable实例的Rows属性值为空,则输出显示“无数据行”。
在上面的代码中,在数据表sysusers中根本不存在Uid等于-1的数据记录。
编译后运行上面的代码,在运行时出现如图4.41所示的异常提示,异常信息提示“在位置0处没有任何行”。
根据上面的异常信息提示,初步判断数据源中没有行。于是添加对dt.Rows属性的快速监视,结果如图4.42所示。
图4.41 异常提示
图4.42 快速监视
从上图中可以看到,数据行数为0,但Rows属性值不为空,而我们的程序中恰恰通过判断Rows属性值是否为空来确定数据源中是否存在数据行,这就是问题所在。进一步分析发现,在GetDataTable方法中,当创建了DataTable实例,其Rows属性就已经被初始化,并且不为空,并且Rows.Count属性值等于0,其快速监视结果与图4.42相同。
通过上面的分析可知,使用Rows属性值进行直接判断是行不通的,所以建议使用Rows的Count属性值来判断数据源中是否存在数据行,修改后的代码如下: