.NET 数据访问架构指南 11
点击次数:17 次 发布日期:2008-11-26 10:38:29 作者:源代码网
|
源代码网推荐 源代码网推荐 如果改变了SQL Server所监听的默认端口,那么就要对客户端进行配置,以使它链接到此端口。更多细节,见本文中的配置客户端一节。 源代码网推荐 源代码网推荐 如果改变了SQL Server 2000默认实例的端口号,那么不修改客户端将导致链接错误。如果存在多个SQL Server 实例,最新版本的MDAC数据访问堆栈(2.6)将进行动态查找,并利用用户数据报协议(UDP)协商(通过UDP端口1434)对指定实例进行定位。尽管这种方法在开发环境下也许有效,但在现在环境中却不大可能正常工作,因为典型发问下防火墙阻止UDP协商流量的通过。 源代码网推荐 源代码网推荐 为了避开这种情况,总是将客户端配置为链接到已配置好的目的端口号。 源代码网推荐 源代码网推荐 配置客户端 源代码网推荐 源代码网推荐 应当对客户端进行配置以利用TCP/IP网络库链接到SQL Server,并且也应当确保客户端库使用了正确的目的端口号。 源代码网推荐 源代码网推荐 使用TCP/IP 网络库 源代码网推荐 源代码网推荐 利用SQL Server客户端网络库,可以对客户端进行配置。在某些安装版本中,可能没有将这个应用程序安装到客户端(如Web服务器)。在这种情况下,可以按如下方式之一解决: 源代码网推荐 利用通过链接字符串提供的“Network Library=dbmssocn”名称-值对指定网络库。字符串dbmssocn用于标识TCP/IP(套接字)库。 源代码网推荐 注意 在使用SQL Server .net数据供应器时,网络库的默认设置是使用“dbmssocn”。 源代码网推荐 在客户端机器上修改注册表,把TCP/IP设置为默认库。 源代码网推荐 指定端口 源代码网推荐 源代码网推荐 如果SQL Server的实例被配置为监听默认的1433以外的其它端口,那么通过以下操作,就能指定链接到的端口号: 源代码网推荐 使用客户端网络应用程序 源代码网推荐 源代码网推荐 源代码网推荐 利用提供给链接字符串的“Server”或“Data Source”名称-值对来指定端口号。要按下面的格式使用字符串: 源代码网推荐 源代码网推荐 源代码网推荐 "Data Source=ServerName,PortNumber" 源代码网推荐 注意 ServerName可以是IP地址,或域名系统(DNS)名,为了优化性能,可以使用IP 地址以避免DNS 查询。 源代码网推荐 源代码网推荐 分布式事务处理 源代码网推荐 源代码网推荐 如果开发了使用COM+分布式事务处理和微软分布式事务处理协调器(DTC)服务的服务组件,那么就需要对防火墙进行配置,以允许DTC流在不同DTC实例间及DTC与资源管理器(例如SQL Server)间流动。 源代码网推荐 源代码网推荐 处理BLOBs 源代码网推荐 源代码网推荐 目前,很多应用程序除了处理许多传统的字符串和数字型数据外,还要处理象图形或声音--甚至复杂的数据格式,如视频格式的数据。图形、声音与视频的数据格式类型不一。然而从存储角度来说,它们都可被视为二进制数据块,通常将其称为BLOBs(二进制大对象)。 源代码网推荐 源代码网推荐 SQL Server提供了binary, varbinary, 和image数据格式来存储BLOBs。不考虑名称,BLOB数据也可被称为基于文件的数据。例如,你可能要存储与特定行相关的二进制长注释字段。SQL Server为此目的提供了ntext 和text数据类型。 源代码网推荐 源代码网推荐 通常,对于小于8KB的二进制数据,使用varbinary数据类型。对于超过此大小的二进制数据,使用image 。表2 汇集了每个数据类型的主要特性。 源代码网推荐 源代码网推荐 表2 数据类型特性 源代码网推荐 源代码网推荐 数据类型 大小 描述 源代码网推荐 binary 范围从1-8KB。存储大小是指定大小加4字节。 固定长度的二进制数据 源代码网推荐 varbinary 范围从1-8KB。存储大小是所提供数据的实际大小加4字节。 可变长度的二进制数据 源代码网推荐 image 从0-2GB大小的可变长度二进制数据 大容量可变长度二进制数据 源代码网推荐 text 从0-2GB大小的可变长度数据 字符型数据 源代码网推荐 ntext 从0-2GB大小的可变长度数据 宽字节字符数据 源代码网推荐 源代码网推荐 何处存储BLOB数据 源代码网推荐 源代码网推荐 SQL Server 7.0及其以后版本已经提高了存储在数据库中的BLOB数据的使用性能。这种情况的一个原因是数据库页面大小已经增加到了8KB。结果,小于8KB的文本或图象数据不必再存储在页面单独的二进制树结构中,而是能被存储在单行中。这意味着读取和写入text, ntext, 或 image数据能象读取或写入字符或二进制字符串那样快。超出8KB后,将在行中建立一个指针,数据本身存储在独立数据页面的二进制树结构中,这不可避免会对性能产生冲击。 源代码网推荐 源代码网推荐 关于迫使text, ntext, 和 image数据存储在单行中的更多信息,见SQL Server在线图书中的使用text和image数据主题。 源代码网推荐 源代码网推荐 一个经常使用的处理BLOB数据的可选方法是,将BLOB数据存储在文件系统中,并在数据库列中存储一个指针(通常是一个统一资源定位器--URL链接)以引用正确的文件。对于SQL Server 7.0以前的版本,将BLOB数据存储在数据库外的文件系统中,可以提高性能。 源代码网推荐 源代码网推荐 然而,SQL Server 2000改进了BLOB支持,以及ADO.NET对读取和写入BLOB数据的支持,使在数据库中存储BLOB数据成为一种可行的方法。 源代码网推荐 源代码网推荐 在数据库中存储BLOB 数据的优点 源代码网推荐 源代码网推荐 将BLOB数据存储在数据库中,带来了很多优点: 源代码网推荐 易于保持BLOB数据与行中其它项数据的同步。 源代码网推荐 源代码网推荐 源代码网推荐 BLOB数据由数据库所支持,拥有单一的存储流,易于管理。 源代码网推荐 源代码网推荐 源代码网推荐 通过SQL Server 2000所支持的XML可以访问BLOB数据,这将在XML流中返回64位编码描述的数据。 源代码网推荐 源代码网推荐 源代码网推荐 对包含了固定或可变长度的字符(包括宽字符)数据的列可以执行SQL Server全文本搜索(FTS)操作。也可以对包含在image字段中的已格式化的基于文本的数据--Word 或 Excel文档--执行FTS操作。 源代码网推荐 将BLOB数据写入到数据库中 源代码网推荐 源代码网推荐 下面的代码演示了如何利用ADO.NET将从某个文件获得的二进制数据写入SQL Server image字段中。 源代码网推荐 源代码网推荐 public void StorePicture( string filename ) 源代码网推荐 { 源代码网推荐 // Read the file into a byte array 源代码网推荐 FileStream fs = new FileStream( filename, FileMode.Open, FileAccess.Read ); 源代码网推荐 byte[] imageData = new Byte[fs.Length]; 源代码网推荐 fs.Read( imageData, 0, (int)fs.Length ); 源代码网推荐 fs.Close(); 源代码网推荐 SqlConnection conn = new SqlConnection(""); 源代码网推荐 SqlCommand cmd = new SqlCommand("StorePicture", conn); 源代码网推荐 cmd.CommandType = CommandType.StoredProcedure; 源代码网推荐 cmd.Parameters.Add("@filename", filename ); 源代码网推荐 cmd.Parameters["@filename"].Direction = ParameterDirection.Input; 源代码网推荐 cmd.Parameters.Add("@blobdata", SqlDbType.Image); 源代码网推荐 cmd.Parameters["@blobdata"].Direction = ParameterDirection.Input; 源代码网推荐 // Store the byte array within the image field 源代码网推荐 cmd.Parameters["@blobdata"].Value = imageData; 源代码网推荐 try 源代码网推荐 { 源代码网推荐 conn.Open(); 源代码网推荐 cmd.ExecuteNonQuery(); 源代码网推荐 } 源代码网推荐 catch 源代码网推荐 { 源代码网推荐 throw; 源代码网推荐 } 源代码网推荐 finally 源代码网推荐 { 源代码网推荐 conn.Close(); 源代码网推荐 } 源代码网推荐 } 源代码网推荐 源代码网推荐 源代码网推荐 源代码网推荐 从数据库中读取BLOB数据 源代码网推荐 源代码网推荐 在通过ExecuteReader方法创建SqlDataReader对象以读取包含BLOB数据的行时,需使用CommandBehavior.SequentialAccess枚举值。如果没有此枚举值,阅读器一次只从服务器中向客户端发送一行数据。如果行包含了BOLB数据,这预示着要占用大量内存。通过利用枚举值,就获得了更好的控制权,因为BLOB数据只在被引用时才被发出(例如,利用GetBytes方法,可以控制读取的字节数)。这在下面的代码片段中进行了演示。 源代码网推荐 源代码网推荐 // Assume previously established command and connection 源代码网推荐 // The command SELECTs the IMAGE column from the table 源代码网推荐 conn.Open(); 源代码网推荐 SqlDataReader reader = cmd.ExecuteReader(CommandBehavior.SequentialAccess); 源代码网推荐 reader.Read(); 源代码网推荐 // Get size of image data - pass null as the byte array parameter 源代码网推荐 long bytesize = reader.GetBytes(0, 0, null, 0, 0); 源代码网推荐 // Allocate byte array to hold image data 源代码网推荐 byte[] imageData = new byte[bytesize]; 源代码网推荐 long bytesread = 0; 源代码网推荐 int curpos = 0; 源代码网推荐 while (bytesread < bytesize) 源代码网推荐 { 源代码网推荐 // chunkSize is an arbitrary application defined value 源代码网推荐 bytesread += reader.GetBytes(0, curpos, imageData, curpos, chunkSize); 源代码网推荐 curpos += chunkSize; 源代码网推荐 } 源代码网推荐 // byte array "imageData" now contains BLOB from database 源代码网推荐 源代码网推荐 注意使用CommandBehavior.SequentialAccess需要以严格的顺序访问列数据。例如,如果BLOB数据存在于第3列,并且还需要从第1,2列中读取数据,那么在读取第3列前必须先读取第1,2列。 做人要厚道,请注明转自酷网动力(www.ASPCOOL.COM)。 源代码网推荐 源代码网供稿. |
