在这种场景中,将从数据源中获取包含一组指定列的单行数据。例如,你得到一个客户ID,并希望查找与客户相关的细节;或得到一个产品ID,并希望得到产品信息。
方法比较
如果要对从数据源中得到的一行数据执行绑定操作,可以用SqlDataAdapter对象填充DataSet 或DataTable对象,其方式与在先前讨论过的获取多行数据及重复场景中描述的方式相同。然而,除非特别需要DataSet 或DataTable对象的功能,否则应当避免创建这些对象。
如果需要获取单行数据,那么请使用下面的一种方法:
- 使用存储过程输出参数.
- 使用SqlDataReader对象.
使用存储过程输出参数
如下情况中使用存储过程输出参数:
- 要从链接池化使能的多层Web应用程序中获得一行数据。
下列情况,需使用SqlDataReader对象:
- 除了数据值,还需要元数据时。可以利用数据阅读器的GetSchemaTable方法获取列元数据。
- 未使用链接池化时。在链接池化无效时,SqlDataReader对象在所有强度环境下都是好方式;性能测试表明,在200浏览器链接时,此方法比存储过程方法在性能上要高约20%。
- 如果知道查询结果只需返回一行,那么在调用SqlCommand对象的ExecuteReader 方法时,使用CommandBehavior.SingleRow枚举值。一些供应器,如OLE DB .NET数据供应器,用此技巧来优化性能。例如,供应器使用IRow接口(如果此接口存在)而不是代价更高的IRowset接口。这个参数对SQL Server .NET数据供应器没有影响。
- 在使用SqlDataReader对象时,总是应当通过SqlDataReader对象的类型化存取器方法,如GetString 和GetDecimal,获得输出参数。这样做就避免了不必要的类型转换。
在本场景中,要获取单项数据。例如,提供了产品ID后,希望查询单一的产品名;或,给出了客户名后,希望查询客户的信用等级。在这种场景中,为得到单项数据,通常不希望引发创建DataSet 对象或甚至是 DataTable对象的额外开销。
也许只希望检查数据库中是否存在特定的行。例如,当新用户在网站注册时,需要检查所选用户名是否已经存在。这是单项数据查询中很特殊的例子,但在此例子中,返回一个简单的布尔返回值就足够了。
方法比较
当从数据源获取单项数据时,考虑下面的方法:
- 同存储过程一起使用SqlCommand对象的ExecuteScalar方法。
- 使用存储过程输出或返回参数。
- 使用SqlDataReader对象。
从性能方面来说,应当使用存储过程输出或返回参数,因为测试结果表明,存储过程方法在从低强度到高强度环境中(从同时不到100浏览器链接到200浏览器链接)提供了一致的性能。
更多信息
- 如果通过ExecuteQuery方法所执行的查询返回多列和/或行,那么此方法只返回第一行的第一列。
需要经常配置互联网应用程序以使它能够通过防火墙链接到SQL Server。例如,许多Web应用程序及防火墙的主要结构组件是周边网络(也被称为DMZ或非军事化区),它们用于隔离高端Web服务器与内部网络。
通过防火墙链接到SQL Server时,需要对防火墙,客户和服务器进行明确配置。SQL Server提供了客户网络应用程序和服务器网络应用程序以帮助进行配置。
选择网络库
当通过防火墙建立链接时,使用SQL Server TCP/IP网络库来简化配置,这是SQL Server2000安装的默认选项。如果使用先前版本的SQL Server,那么分别利用客户端网络应用程序和服务器端网络应用程序检查TCP/IP是否在客户和服务器端已经被配置为默认的网络库。
除了配置优点,使用TCP/IP库还意味着:
- 受益于大宗数据的改进性能和增加的扩展性。
- 避免与指定管道相关的附加安全信息。
配置服务器
SQL Server的默认实例监听1433端口。然而,SQL Server 2000的指定实例在它们首次开启时,动态地分配端口号。网络管理员有希望在防火墙打开一定范围的端口;因此,当随防火墙使用SQL Server的指定实例时,利用服务网络应用程序对实例进行配置,使它监听特定的端口。然后管理员对防火墙进行配置,以使防火墙允许流量到达特定的IP地址及服务器实例所监听的端口。
注意,客户端网络库所使用的源端口号在1024-5000间动态分配。这是TCP/IP客户端应用程序的标准作法,但这意味着防火墙必须允许途经此范围的任何端口流量能够通过。关于SQL Server所使用的端口的更多信息,在微软产品支持服务网站上,参见INF: P 通过防火墙对SQL Server进行通讯所需的TCP端口。
更多内容请看PCdog.com--.NET框架架构专题
