询问ADO.NET中的SqlDataReader和SqlConnection的关闭问题

ghost9698 2008-09-28 04:51:36
询问各位个问题:
我知道,如果SqlDataReader不关闭的话,会导致关联的SqlConnection不可进行其他操作;
但是,我在很多代码上都看到很多SqlDataReader没有被显示关闭的情况,所以,我想了解下SqlDataReader什么条件下会自动关闭呢?
我在一书上看到这样的话:“当SqlCommand调用ExecuteReader(CommandBehavior.CloseConection)后,当从SqlDataReader对象中读取了所有的数据记录后,连接将会自动关闭”,这句话的意思是否反映了这一个事实:SqlDataReader将在SqlDataReader.Read()==false后,由.NET自动关闭呢?而不需要我们手动调用SqlDataReader.Close()方法了?但这与我以前的了解有矛盾!
还有,我看过这样一段代码:
public List<Movie1> GetAll()
{
List<Movie1> results = new List<Movie1>();
SqlConnection con = new SqlConnection(_connectionString);
SqlCommand cmd = new SqlCommand("SELECT Title,Director FROM Movies", con);
using (con)
{
con.Open();
SqlDataReader reader = cmd.ExecuteReader();
while (reader.Read())
{
Movie1 newMovie = new Movie1();
newMovie.Title = (string)reader["Title"];
newMovie.Director = (string)reader["Director"];
results.Add(newMovie);
}
}
return results;
}
该段代码对关联的SqlConnection对象使用了using语句,以保证SqlConnection在异常或语句块结束后自动Dispose(),但是,如果SqlDataReader始终需要手动调用SqlDataReader.Close()关闭的话,未关闭SqlDataReader之前,SqlConnetion可以被Dispose()么?难道是SqlConnection的系统构造的Dispose()方法内包含了相关SqlDataReader的SqlDataReader.close()方法的调用,然后再在该方法内调用SqlConnection.Close()?


归根到底,我想知道的就是:
1.SqlDataReader可不可以自动关闭,而不需要手动显式调用Close()?如果可以,什么时候会自动关闭?
2.针对using语句中声明的SqlConnection,该对象在系统自动调用其Dispose()方法时,是否也会自动调用相关SqlDataReader.Close()后,再进行SqlConnection.Close();


请知道详细技术细节的朋友们不吝赐教,鄙人感激不尽!谢谢!
...全文
432 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
konglingkang 2008-11-21
  • 打赏
  • 举报
回复
多谢!!!
EriclLee 2008-10-22
  • 打赏
  • 举报
回复
用Using 会自动关闭
浪漫幕末 2008-10-22
  • 打赏
  • 举报
回复
我说的有点问题,SqlDataReader 不关闭的话,connection连接池会满。至于没有显式关闭,那是 SqlDataReader 在和GridView等复杂控件邦定后,会自动关闭,请看这篇文章:
http://blog.csdn.net/levin9/archive/2006/02/14/599115.aspx
浪漫幕末 2008-10-22
  • 打赏
  • 举报
回复
如果你不愿意关闭,那么可以这样:
using(SqlDataReader reader = cmd.ExecuteReader(CommandBehavior.CloseConnection); )
浪漫幕末 2008-10-22
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 wartim 的回复:]
最好是
connection open
read
connection close
否则如果不close
马上在同一个connection上new一个新reader执行别的语句 会出错说有未关闭的的reader
[/Quote]
MSDN上说是,不关闭datareader是不能对它调用的connection 做其它操作的。所以你说的错误是必然的。如果
SqlDataReader reader = cmd.ExecuteReader(CommandBehavior.CloseConnection);关闭SqlDataReader 的时候会自动关闭连接的。
SqlDataReader 需要手动关闭,但不是必要,它是托管的,C#垃圾回收器会自动进行回收的;但是我们能自己关闭的时候还是自己关闭,高效利用系统资源。
wartim 2008-09-28
  • 打赏
  • 举报
回复
最好是
connection open
read
connection close
否则如果不close
马上在同一个connection上new一个新reader执行别的语句 会出错说有未关闭的的reader
amandag 2008-09-28
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 ericzhangbo1982111 的回复:]
SqlDataReader reader = cmd.ExecuteReader(CommandBehavior.CloseConnection);
[/Quote]

当你关闭连接的时候自动关闭DataReader对象,所以方法的内部不用关闭连接,在调用方法出关闭连接即可
ASPNETDB 2008-09-28
  • 打赏
  • 举报
回复
应该是先CLOSE()然后DISPOSE()
ghost9698 2008-09-28
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 xlyhj219 的回复:]
1.SqlDataReader可以自动关闭,不需要手动显式调用Close()
2.针对using语句中声明的SqlConnection,该对象在系统自动调用其Dispose()方法。需手动关闭连接池有数目限制
[/Quote]

谢谢你的回复!
但我还是有些不明白:
1.SqlDataReader到底什么时候才会自动关闭呢?
xlyhj219 2008-09-28
  • 打赏
  • 举报
回复
1.SqlDataReader可以自动关闭,不需要手动显式调用Close()
2.针对using语句中声明的SqlConnection,该对象在系统自动调用其Dispose()方法。需手动关闭连接池有数目限制
ghost9698 2008-09-28
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 ericzhangbo1982111 的回复:]
SqlDataReader reader = cmd.ExecuteReader(CommandBehavior.CloseConnection);
[/Quote]

麻烦看清我问的问题再回答,谢谢!
ericzhangbo1982111 2008-09-28
  • 打赏
  • 举报
回复
SqlDataReader reader = cmd.ExecuteReader(CommandBehavior.CloseConnection);
ADO.NET 2.0技术内幕(高清 文 带书签 全) 编辑推荐 核心主题全面涵盖,深入剖析个人精髓;示例丰富,同时提供Visual Basic和Visual C#两种版本;独特的常见问题解析方式可使难题迎刃而解。 引导开发人员创建分布式、以数据为心的应用程序的权威指南。 本书可以使您的专业知识不再停留在基础阶段,它会引领您深入研究ADO.NET 2.0的重要编程主题。本书作为全面的技术内幕参考书,提供了专家指南、实用指令及用Visual c#和Visual Basic编写的代码示例,帮助您深入掌握如何开发Micrsoft Windows和Web数据库应用程序。 本书重要主题:在Microsoft Visual Studio 2005使用设计时数据访问特性;使用Microsoft .NET Framework 2.0数据提供程序连接数据库;构建连接字符串,启用连接池;执行查询,包括参数化查询和非同步查询,并获取结果;创建DataSet对象以处理脱机数据,并研究常用场景;使用Microsoft SQL Server 2005新的公共语言运行时特性和XML数据类型;为简单和复杂的更新生成逻辑和使用存储过程;使用ASP.NET 2.0的新数据访问性设计Web应用程序——包括无代码数据绑定功能。 内容简介 本书介绍了如何用ADO.NET 2.0对独立应用、企业级应用和Web应用程序的数据进行访问、排序和操作。作者针对如何利用Visual Studio 2005的新工具和向导,编写、测试并调试数据库应用程序代码,用丰富的示例代码、教程式的风格及特色段落介绍了最佳实践。本书描述了ADO.NET对象模型及其用于Web扩展的XML特性,还涉及Microsoft SQL Server 2000和SQL Server 2005以及其他一些核心主题。 本书学习ADO.NET的理想参考书,也是造就专业编程高手的指南,适用于所有在.NET应用程序编写数据访问代码的人员。 作者简介 斯赛帕,David Sceppa,SQL Server开发团队的项目经理,也是ADO.NET专家。作为Microsoft Developer Support团队的前技术邻导人,他曾经帮助客户使用Visual Basic和Microsoft Visual FoxPro来构建数据库应用程序。David拥有微软.NET MCSD认证,并有丰富的教学经验。 目录 第Ⅰ部分 Microsoft ADO.NET 2.0入门 第1章 ADO.NET概述 1.1 没有新的对象模型 1.2 ADO.NET对象模型 1.3 常见问题 第2章 用Microsoft Visual Studio 2005生成第一个ADO.NET应用程序 2.1 演示 2.2 不编写代码而生成数据访问窗体 2.3 常见问题 第Ⅱ部分 获取连接:使用.NET数据提供程序 第3章 连接数据库 3.1 生成SqlConnection对象 3.2 打开SqlConnection对象 3.3 关闭SqlConnection对象 3.4 自行清除连接 3.5 连接字符串 3.6 连接池 3.7 将SqlConnection用作起始点 3.8 Visual Studio设计时特性 3.9 SqlConnection对象参考 3.10 常见问题 第4章 数据库查询 4.1 在代码使用SqlCommand对象 4.2 使用SqlDataReader 4.3 使用参数化查询 4.4 Microsoft Visual Studio设计时特性 4.5 SqlCommand,SqlDataReader和SqlParameter的对象参考 4.6 常见问题 第5章 用SqlDataAdapfer对象获取数据 5.1 何为SqlDataAdapter对象 5.2 创建并使用SqlDataAdapter对象 5.3 Visual Studio 2005设计时特性 5.4 SqlDataAdapter参考 5.5 常见问题 第Ⅲ部分 处理脱机数据——ADO.NET DataSet 第6章 处理DataSet对象 6.1 DataSet类的特性 6.2 使用DataSet对象 6.3 在Visual Studio处理DataSet对象 6.4 DataSet,DataTable,DataColumn,DataRow,UniqueConstraint和ForeignKeyConstraint类参考 6.5 常见问题 第7章 处理关系数据 7.1 关系数据访问概述 7.2 在代码使用DataRelation对象 7.3 在Microsoft Visual Studio创建DataRelation对象 7.4 DataRelation对象参考 7.5 常见问题 第8章 排序、搜索和筛选 8.1 使用DataTable类的搜索和筛选功能 8.2 何为DataView对象 8.3 在代码使用DataView对象 8.4 在Visual Studio创建DataView对象 8.5 DataView对象参考 8.6 常见问题 第9章 使用强类型DataSet对象和TableAdapter 9.1 强类型DataSet 9.2 创建强类型DataSet对象 9.3 使用强类型DataSet对象 9.4 何时使用强类型DataSet对象 9.5 TableAdapter简介 9.6 选择自己的方法 9.7 常见问题 第10章 向数据库提交更新 10.1 使用参数化SqlCommand提交更新 10.2 使用SqlDataAdapter提交更新 10.3 使用SqlDataAdapter对象提交更新 10.4 手动配置SqlDataAdapter对象 10.5 使用SqlCommandBuilder对象生成更新逻辑 10.6 使用Visual Studio【TableAdaptet 配置向导】生成更新逻辑 10.7 返回DataAdapter 10.8 在SqlTransaction提交更新 10.9 SqlCommandBuildet对象参考 10.10 常见问题 第11章 复杂更新 11.1 在提交更新后刷新一行 11.2 获取新生成的自动增量值 11.3 提交分层更改 11.4 分离和重新集成更改 11.5 处理失败的更新尝试 11.6 使用分布式事务 11.7 批量查询 11.8 SQL批量复制 11.9 DataSet对象与事务 11.10 在处理复杂更新方案时,使用AD0.NET 11.11 常见问题 第12章 使用XML数据 12.1 架起XML和数据访问之间的桥梁 12.2 读写XML数据 12.3 DataSet+XmlDocument=XmlDataDocument 12.4 使用SQL Server 2005的XML特性 12.5 通过SElECT...FOR XML从SQL Server 2000获取XML数据 12.6 SQL XML.NET数据提供程序 12.7 简单的AD0.NET和XML示例 12.8 常见问题 第Ⅳ部分 用ADO.NET 2.O构造高效的应用程序 第13章 生成基于WindOWS的高效应用程序 13.1 用数据绑定快速生成用户界面 13.2 应用程序设计的考虑事项 第14章 生成高效的Web应用程序 14.1 Web应用程序简介 14.2 连接到数据库 14.3 在ASP.NET 1.0与数据库进行交互时存在的问题 14.4 数据源控件简介 14.5 缓存往返的数据 14.6 分页 14.7 常见问题 第15章 SQL Server2005公共语言运行时集成 15.1 扩展SQL Server的旧方法——扩展存储过程 15.2 扩展SQL Server的新方法——CLR集成 15.3 使用Microsoft Visual Studio 2005简化SQL CLR代码的生成过程 15.4 SQL CLR方案 15.5 创建SQL CLR用户定义类型 15.6 小结 15.7 常见问题 第Ⅴ部分 附录 附录A 使用其他.NET数据提供程序 附录B 示例和工具
.net数据访问类 SQL Helper 介绍 摘要:Data Access Application Block 是一个 .NET 组件,包含优化的数据访问代码,可以帮助用户调用存储过程以及向 SQL Server 数据库发出 SQL 文本命令。它返回 SqlDataReader、DataSet 和 XmlReader 对象。您可以在自己的 .NET 应用程序将其作为构造块来使用,以减少需要创建、测试和维护的自定义代码的数量。您可以下载完整的 C# 和 Visual Basic .NET 源代码以及综合文档。 简介 您是否正在从事 .NET 应用程序数据访问代码的设计和开发?您是否觉得自己总是在反复编写相同的数据访问代码?您是否曾经将数据访问代码包装在 Helper 函数,以便能够在一行调用存储过程?如果是,那么 Microsoft? Data Access Application Block for .NET 正是为您设计的。 Data Access Application Block 将访问 Microsoft SQL Server? 数据库的性能和资源管理方面的最佳经验封装在一起。您可以很方便地在自己的 .NET 应用程序将其作为构造块使用,从页减少了需要创建、测试和维护的自定义代码的数量。 尤其是,Data Access Application Block 可以帮助您: 调用存储过程或 SQL 文本命令。 指定参数详细信息。 返回 SqlDataReader、DataSet 或 XmlReader 对象。 例如,在引用了 Data Access Application Block 的应用程序,您可以简单地在一行代码调用存储过程并生成 DataSet,如下所示: [C#] DataSet ds = SqlHelper.ExecuteDataset( connectionString, CommandType.StoredProcedure, "getProductsByCategory", new SqlParameter("@CategoryID", categoryID)); 注意: Application Block for .NET(用于 .NET 的应用程序块)是基于对成功的 .NET 应用程序进行详细研究而设计的。它以源代码的形式提供,您可以原样使用,也可以针对自己的应用程序进行自定义。该应用程序块并不代表未来 Microsoft ADO.NET 程序库的发展方向。Microsoft ADO.NET 程序库是为在各种使用情况下实现对数据访问行为的精确控制而建立的。将来的 ADO.NET 版本可能会使用不同的模型来实现这个方案 SqlHelper 类提供了一组静态方法,可以用来向 SQL Server 数据库发出许多各种不同类型的命令。 SqlHelperParameterCache 类提供命令参数缓存功能,可以用来提高性能。该类由许多 Execute 方法(尤其是那些只运行存储过程的重写方法)在内部使用。数据访问客户端也可以直接使用它来缓存特定命令的特定参数集。 使用 SqlHelper 类执行命令 SqlHelper 类提供了五种 Shared (Visual Basic) 或 static (C#) 方法,它们是:ExecuteNonQuery、ExecuteDataset、ExecuteReader、ExecuteScalar 和 ExecuteXmlReader。实现的每种方法都提供一组一致的重载。这提供了一种很好的使用 SqlHelper 类来执行命令的模式,同时为开发人员选择访问数据的方式提供了必要的灵活性。每种方法的重载都支持不同的方法参数,因此开发人员可以确定传递连接、事务和参数信息的方式。类实现的所有方法都支持以下重载: [C#] Execute* (SqlConnection connection, CommandType commandType, string commandText) Execute* (SqlConnection connection, CommandType commandType, string commandText, params SqlParameter[] commandParameters) Execute* (SqlConnection connection, string spName, params object[] parameterValues) Execute* (SqlConnection connection, CommandType commandType, string commandText) Execute* (SqlConnection connection, CommandType commandType, string commandText, params SqlParameter[] commandParameters) Execute* (SqlConnection connection, string spName, params object[] parameterValues) 除这些重载以外,除 ExecuteXmlReader 之外的其他方法还提供了另一种重载:允许将连接信息作为连接字符串而不是连接对象来传递,如下面的方法签名所示: [Visual Basic] Execute* (ByVal connectionString As String, _ ByVal commandType As CommandType, _ ByVal commandText As String) Execute* (ByVal connectionString As String, _ ByVal commandType As CommandType, _ ByVal commandText As String, _ ByVal ParamArray commandParameters() As SqlParameter) Execute* (ByVal connectionString As String, _ ByVal spName As String, _ ByVal ParamArray parameterValues() As Object) [C#] Execute* (string connectionString, CommandType commandType, string commandText) Execute* (string connectionString, CommandType commandType, string commandText, params SqlParameter[] commandParameters) Execute* (string connectionString, string spName, params object[] parameterValues) 注意: ExecuteXmlReader 不支持连接字符串,因为:与 SqlDataReader 对象不同,XmlReader 对象在 XmlReader 关闭时没有提供自动关闭连接的方法。如果客户端传递了连接字符串,那么当客户端完成对 XmlReader 的操作后,将无法关闭与 XmlReader 相关联的连接对象。 通过参考 Data Access Application Block 程序集并导入 Microsoft.ApplicationBlocks.Data 命名空间,您可以轻松编写使用任何一种 SqlHelper 类方法的代码,如下面的代码示例所示: [Visual Basic] Imports Microsoft.ApplicationBlocks.Data [C#] using Microsoft.ApplicationBlocks.Data; 导入命名空间后,您可以调用任何 Execute* 方法,如下面的代码示例所示: [Visual Basic] Dim ds As DataSet = SqlHelper.ExecuteDataset( _ "SERVER=(local);DATABASE=Northwind;INTEGRATED SECURITY=True;", _ CommandType.Text, "SELECT * FROM Products") [C#] DataSet ds = SqlHelper.ExecuteDataset( "SERVER=DataServer;DATABASE=Northwind;INTEGRATED SECURITY=sspi;", _ CommandType.Text, "SELECT * FROM Products"); 使用 SqlHelperParameterCache 类管理参数 SqlHelperParameterCache 类提供了三种可以用来管理参数的公共共享方法。它们是: CacheParameterSet。用于将 SqlParameters 数组存储到缓存。 GetCachedParameterSet。用于检索缓存的参数数组的副本。 GetSpParameterSet。一种重载方法,用于检索指定存储过程的相应参数(首先查询一次数据库,然后缓存结果以便将来查询)。 缓存和检索参数 通过使用 CacheParameterSet 方法,可以缓存 SqlParameter 对象数组。此方法通过将连接字符串和命令文本连接起来创建一个键,然后将参数数组存储在 Hashtable 。 要从缓存检索参数,请使用 GetCachedParameterSet 方法。此方法将返回一个 SqlParameter 对象数组,这些对象已使用缓存(与传递给该方法的连接字符串和命令文本相对应)的参数的名称、值、方向和数据类型等进行了初始化。 注意: 用作参数集的键的连接字符串通过简单的字符串比较进行匹配。用于从 GetCachedParameterSet 检索参数的连接字符串必须与用来通过 CacheParameterSet 来存储这些参数的连接字符串完全相同。语法不同的连接字符串即使语义相同,也不会被认为是匹配的。 以下代码显示了如何使用 SqlHelperParameterCache 类来缓存和检索 Transact-SQL 语句的参数。 [Visual Basic] 初始化连接字符串和命令文本 它们将构成用来存储和检索参数的键 Const CONN_STRING As String = _ "SERVER=(local); DATABASE=Northwind; INTEGRATED SECURITY=True;" Dim sql As String = _ "SELECT ProductName FROM Products " + _ "WHERE Category=@Cat AND SupplierID = @Sup" 缓存参数 Dim paramsToStore(1) As SqlParameter paramsToStore(0) = New SqlParameter("@Cat", SqlDbType.Int) paramsToStore(1) = New SqlParameter("@Sup", SqlDbType.Int) SqlHelperParameterCache.CacheParameterSet(CONN_STRING, _ sql, _ paramsToStore) 从缓存检索参数 Dim storedParams(1) As SqlParameter storedParams = SqlHelperParameterCache.GetCachedParameterSet( _ CONN_STRING, sql) storedParams(0).Value = 2 storedParams(1).Value = 3 在命令使用参数 Dim ds As DataSet ds = SqlHelper.ExecuteDataset(CONN_STRING, _ CommandType.Text, _ sql, storedParams) [C#] // 初始化连接字符串和命令文本 // 它们将构成用来存储和检索参数的键 const string CONN_STRING = "SERVER=(local); DATABASE=Northwind; INTEGRATED SECURITY=True;"; string spName = "SELECT ProductName FROM Products " + "WHERE Category=@Cat AND SupplierID = @Sup"; // 缓存参数 SqlParameter[] paramsToStore = new SqlParameter[2]; paramsToStore[0] = New SqlParameter("@Cat", SqlDbType.Int); paramsToStore[1] = New SqlParameter("@Sup", SqlDbType.Int); SqlHelperParameterCache.CacheParameterSet(CONN_STRING, sql, paramsToStore); // 从缓存检索参数 SqlParameter storedParams = new SqlParameter[2]; storedParams = SqlHelperParameterCache.GetCachedParameterSet( CONN_STRING, sql); storedParams(0).Value = 2; storedParams(1).Value = 3; // 在命令使用参数 DataSet ds; ds = SqlHelper.ExecuteDataset(CONN_STRING, CommandType.StoredProcedure, sql, storedParams); 检索存储过程参数 SqlHelperParameterCache 还提供了针对特定存储过程检索参数数组的方法。一种名为 GetSpParameterSet 的重载方法提供了此功能,它包含两种实现。该方法尝试从缓存检索特定存储过程的参数。如果这些参数尚未被缓存,则使用 .NET 的 SqlCommandBuilder 类从内部检索,并将它们添加到缓存,以便用于后续的检索请求。然后,为每个参数指定相应的参数设置,最后将这些参数以数组形式返回给客户端。以下代码显示了如何检索 Northwind 数据库 SalesByCategory 存储过程的参数。 [Visual Basic] 初始化连接字符串和命令文本 它们将构成用来存储和检索参数的键 Const CONN_STRING As String = _ "SERVER=(local); DATABASE=Northwind; INTEGRATED SECURITY=True;" Dim spName As String = "SalesByCategory" 检索参数 Dim storedParams(1) As SqlParameter storedParams = SqlHelperParameterCache.GetSpParameterSet( _ CONN_STRING, spName) storedParams(0).Value = "Beverages" storedParams(1).Value = "1997" 在命令使用参数 Dim ds As DataSet ds = SqlHelper.ExecuteDataset(CONN_STRING, _ CommandType.StoredProcedure, _ spName, storedParams) [C#] // 初始化连接字符串和命令文本 // 它们将构成用来存储和检索参数的键 const string CONN_STRING = "SERVER=(local); DATABASE=Northwind; INTEGRATED SECURITY=True;"; string spName = "SalesByCategory"; // 检索参数 SqlParameter storedParams = new SqlParameter[2]; storedParams = SqlHelperParameterCache.GetSpParameterSet( CONN_STRING, spName); storedParams[0].Value = "Beverages"; storedParams[1].Value = "1997"; // 在命令使用参数 DataSet ds; ds = SqlHelper.ExecuteDataset(CONN_STRING, CommandType.StoredProcedure, spName, storedParams); 内部设计 Data Access Application Block 包含了完整的源代码和有关其设计的综合指南。本节介绍有关主要实现的详细信息。 SqlHelper 类实现详细信息 SqlHelper 类用于通过一组静态方法来封装数据访问功能。该类不能被继承或实例化,因此将其声明为包含专用构造函数的不可继承类。 在 SqlHelper 类实现的每种方法都提供了一组一致的重载。这提供了一种很好的使用 SqlHelper 类来执行命令的模式,同时为开发人员选择访问数据的方式提供了必要的灵活性。每种方法的重载都支持不同的方法参数,因此开发人员可以确定传递连接、事务和参数信息的方式。在 SqlHelper 类实现的方法包括: ExecuteNonQuery。此方法用于执行不返回任何行或值的命令。这些命令通常用于执行数据库更新,但也可用于返回存储过程的输出参数。 ExecuteReader。此方法用于返回 SqlDataReader 对象,该对象包含由某一命令返回的结果集。 ExecuteDataset。此方法返回 DataSet 对象,该对象包含由某一命令返回的结果集。 ExecuteScalar。此方法返回一个值。该值始终是该命令返回的第一行的第一列。 ExecuteXmlReader。此方法返回 FOR XML 查询的 XML 片段。 除了这些公共方法外,SqlHelper 类还包含一些专用函数,用于管理参数和准备要执行的命令。不管客户端调用什么样的方法实现,所有命令都通过 SqlCommand 对象来执行。在 SqlCommand 对象能够被执行之前,所有参数都必须添加到 Parameters 集合,并且必须正确设置 Connection、CommandType、CommandText 和 Transaction 属性。SqlHelper 类的专用函数主要用于提供一种一致的方式,以便向 SQL Server 数据库发出命令,而不考虑客户端应用程序调用的重载方法实现。SqlHelper 类的专用实用程序函数包括: AttachParameters:该函数用于将所有必要的 SqlParameter 对象连接到正在运行的 SqlCommand。 AssignParameterValues:该函数用于为 SqlParameter 对象赋值。 PrepareCommand:该函数用于对命令的属性(如连接、事务环境等)进行初始化。 ExecuteReader:此专用 ExecuteReader 实现用于通过适当的 CommandBehavior 打开 SqlDataReader 对象,以便最有效地管理与阅读器关联的连接的有效期。 SqlHelperParameterCache 类实现详细信息 参数数组缓存在专用 Hashtable 。从缓存检索的参数进行内部复制,这样客户端应用程序能够更改参数值以及进行其他操作,而不会影响缓存的参数数组。专用共享函数 CloneParameters 可以实现此目的。 常见问题 此版本包含哪些新增功能? 与 Data Access Application Block Beta 2.0 版本相比,该 RTM 版本包含以下新增功能和变化: SqlHelper 类方法的事务型重载不再需要 SqlConnection 参数。在此版本,连接信息从 SqlTransaction 对象派生,因此不必在方法签名包含 SqlConnection 对象参数。 现在,GetSpParameterSet 方法使用 ADO.NET CommandBuilder 类的 DeriveParameters 方法来确定存储过程所需要的参数。这比 Beta 2.0 版本直接通过查询数据库来检索信息的效率更高。 可以使用 XCOPY 部署方法来部署 Data Access Application Block 程序集吗? 可以。Microsoft.ApplicationBlocks.Data.dll 程序集在编译后可以使用 XCOPY 进行部署。 什么时候应该使用 ExecuteDataset 方法,什么时候应该使用 ExecuteReader 方法? 这个问题实际上是什么时候应该返回 DataSet 对象的多个数据行,什么时候应该使用 DataReader。答案取决于您的应用程序的特定需要,以及您在灵活性和原始性能之间的取舍。DataSet 为您提供数据的灵活的且断开连接的关系视图,而 DataReader 为您提供性能卓越的、只读的、仅向前光标。有关 DataSet 和 DataReader 的全面比较,请参阅 asp">Data Access Architecture Guide(英文)。 如何使用 ExecuteDataset 返回包含多个表的数据集? 通过创建一个可以返回多个行集的存储过程(通过执行多个 SELECT 语句或者对其他存储过程进行嵌套调用),并使用 ExecuteDataset 方法执行该过程,您可以检索包含多个表的数据集。 例如,假设您的数据库包含以下存储过程。 CREATE PROCEDURE GetCategories AS SELECT * FROM Categories GO CREATE PROCEDURE GetProducts AS SELECT * FROM Products 您可以创建一个主存储过程来对这些过程进行嵌套调用,如下面的代码示例所示。 CREATE PROCEDURE GetCategoriesAndProducts AS BEGIN EXEC GetCategories EXEC GetProducts END 使用 ExecuteDataset 方法执行此主存储过程将返回一个 DateSet,其包含两个表:一个表包含分类数据,另一个表包含产品数据。 注意: ExecuteDataset 方法不提供为返回的表指定自定义名称的方法。第一个表的编号始终为 0,名称为 Table,第二个表的编号为 1,名称为 Table1,依此类推。
蓝焰设计站图文管理系统 论文 ASP.NET的网站新闻管理系统设计与实现 【摘要】利用ASP.NET和ADO.NET技术开发的网站新闻管理系统,实现了网站新闻的动态管理,使得对信息的管理更加及时、高效,提高了工作效率。同时对系统的开发原理、系统的功能特点和设计方案进行了介绍。 【关键词】ASP.NET ADO.NET 新闻 管理 数据库 随着Internet的普及,越来越多的企业建立了自己的WWW网站,企业通过网站可以展示产品,发布最新动态,与用户进行交流和沟通,与合作伙伴建立联系,以及开展电子商务等。其新闻管理系统是构成企业网站的一个重要组成部分,它担负着双层作用,一方面可以用来动态发布有关新产品或新开发项目,另一方面又可以及时向顾客公告企业经营业绩、技术与研发进展、特别推荐或优惠的工程项目、产品和服务,从而吸引顾客,扩大顾客群。 传统的网站新闻管理方式有两种,一是静态HTML页面,更新信息时需要重新制作页面然后上传页面并修改相应链接,这种方式因为效率太低已不多用。二是基于ASP和脚本语言,将动态网页和数据库结合,通过应用程序来处理新闻,这是目前较为流行的做法。但是由于ASP本身的局限性使得系统有一些不可克服的缺陷,而采取了ASP.NET技术的系统性能上有了很大的改善,其主要表现在以下几方面: 1.由于ASP页面每次打开都必须经过先编译后解释的过程,所以页面在反复打开时速度没有任何提升,而ASP.NET页面只需要一次编译后不需要重新编译,直到该页面被修改或Web应用程序重新启动。这使得在多次访问时速度有了极大的提升。 2.由于ASP没有提供任何输出数据为内容的元件,所以在使用ASP撰写数据库页面时只能借助ADO的RecordSet对象逐笔读取记录,而ASP.NET通过ADO.NET提供的DataGrid等数据库元件可以直接和数据库联系。 3.ASP.NET支持应用程序的实时更新。管理员不必关掉网络服务器或者甚至不用停止应用程序的运行就可以更新应用文件。应用程序文件永远不会被加锁,因此甚至在程序运行时文件就可以被覆盖。当文件更新后,系统会温和地转换到新的版本。 4.ASP.NET采取"code-behind"方式编写代码使得代码更易于编写,结构更清晰,降低了系统的开发与维护的复杂度和费用。 1系统的开发原理 1.1 基于ASP.NET技术的系统结构模型 ASP.NET结构是一个三层系统:UI层、业务逻辑层和数据层,如图1所示。 图1 ASP.NET的系统结构模型 UI层负责与用户交互,接收用户的输入并将服务器端传来的数据呈现给客户。 业务逻辑层负责接收浏览器传来的请求并将请求传给数据层,同时将请求处理结果发给浏览器。它由Web表单、XML Web服务和组件服务组成。其Web表单是ASP.NET应用程序的核心所在,它是向客户呈现数据和信息的基础,也是响应和处理客户与显示的Web表单交互生成的信息和数据的基础。 数据层是通过ADO.NET操纵数据为事务逻辑层提供数据服务,如存储数据操作结果、返回数据检索结果等。 1.2 ADO.NET访问数据库的原理 与数据库相连,ADO.NET提供了如下3种方式:通过ODBC相连;通过OLEDB相连;直接与SQL Server相连。3种方式由于应用层次的差异,使得效率由低到高,独立性由高到低。对于相连数据库的数据处理,也有2种方式,即一种是通过DataSet来隔离异构的数据源,另一种是以流方式从数据源读取(DataReader方式)。 传统的应用程序是通过先建立到数据库的连接,在程序的整个运行过程维护连接的方式来设计的。ASP.NET采取了断开连接方式的数据结构。当浏览器向Web服务器请求网页时,服务器处理这个请求,并将所请求的网页发送给浏览器,然后连接就被断开,直到浏览器发出下一个请求。 ADO.NET的另一个创新是引入了数据集(Dataset)。一个数据集是内存提供数据关系图的高速缓冲区。数据集对数据源一无所知,它们可以由程序或通过从数据仓库调入数据而被生成、填充。不论数据从何处获取,数据集都是通过使用同样的程序模板而被操作的,并且它使用相同的潜在的数据缓冲区。 2 系统的功能设计 2.1 系统的功能结构 该新闻管理系统可以在Windows 2000 Server操作系统平台上运行,Web服务器为IIS,数据库服务器为Microsoft SQL Server2000,开发工具采用的Microsoft Visual Studio .NET和DreamWeaver。图2给出系统的功能结构图。其工作流程为:用户登录通过权限判断,普通用户只能浏览、阅读和查询新闻,注册用户除了可以完成普通用户的操作外,还可以进入新闻管理模块进行新闻录入、修改和删除的操作。注册用户除系统管理员外只能对自己录入的新闻进行删改操作。 2.2 系统的功能特点 (1)操作简单、界面友好:完全控件式的页面布局,使得新闻的录入工作更简便;许多选项包括新闻类别、来源部门等只需要点击鼠标就可以完成;另外,跟踪出现的提示信息也让用户随时清楚自己的操作情况。 (2)即时可见:对新闻的处理(包括录入、修改、删除)将立即在主页的对应栏目显示出来,达到"即时发布、即时见效"的功能。 图2 系统功能结构图 (3)功能完善:包括常见网站的新闻管理的各个方面:新闻录入、浏览、删除、修改、检索等各个方面,完整地实现了网站对即时新闻的管理要求。 (4)方便移植:针对不同的企业,只需要稍作修改就可以开发出适合本企业特点的网站新闻管理系统! 3 系统的详细设计 系统的主要功能是通过几个功能模块来实现的。具体的设计过程如下: ⑴ 系统登录:该模块负责将用户分为普通用户和注册用户来实现用户权限的管理。 ⑵ 新闻浏览:该模块负责分页列出网站所有新闻的信息,包括标题、类型、来源部门字段及发布日期,每条新闻的标题被做成一个超链接,点击它们就能跳转页面进行新闻阅读。 ⑶ 新闻阅读:在其他页面点击标题链接即进入新闻阅读页面,此时,每条新闻的详细信息将被取出,包括内容、标题、关键字等,并按照相对固定的格式放置在页面的不同区域,所有新闻使用大致相同的页面布局,只是各字段对应的内容不同而已,另外,页面其它位置,可以动态放置其他元件,如网站标志logo、页面广告banner等链接图片,这样可以很容易地实现图文并茂的阅读效果。 ⑷ 新闻查询:该模块提供了新闻查询功能,输入待查找的内容及选定分类信息可以快速地找到符合条件的新闻,并输出查询结果。 ⑸ 新闻管理:该模块负责分页罗列登录的注册用户曾发布过且未删除的新闻信息,用户可以对该条新闻进行删除、修改。非新闻发布者除系统管理员外不具有对该条新闻的处理权限,所以不同用户进入此页面将显示不同的内容。 ⑹ 新闻录入和修改:注册用户录入一条新闻所需要的内容,包含标题、关键字、类型、来源部门、发布日期等,同时从登录模块得到用户名,这些信息将被写入数据库保存。该模块还负责编辑状态下的更新,这时,它将根据取得的Title字段值对页面控件初始化。 下面以系统登录页面的编写为例给出主要事件和函数,说明该系统的开发过程。 //IsRegUserOk函数:判断用户是否已经注册和密码是否正确 public bool IsRegUserOk() { string name=TextBoxName.Text.Trim(); string pwd=TextBoxPassword.Text.Trim(); //建立/打开数据库连接 SqlConnection conn=new SqlConnection(); conn.ConnectionString="server=(local);uid=sa;pwd=;database=jxdb"; conn.Open(); //建立sql字符串 string sql="select * from reg where name='"+name+"'"; SqlDataReader dr; SqlCommand cmd=new SqlCommand(sql,conn); dr=cmd.ExecuteReader(); //保留用户注册与否信息 bool isRegUserExist=dr.Read(); //关闭DataReader dr.Close(); //取得用户名的密码 string sqlBoth="select * from reg where name='"+name+"'"; sqlBoth+="and pwd='"+pwd+"'"; SqlCommand cmdBoth=new SqlCommand(sqlBoth,conn); SqlDataReader drBoth; drBoth=cmdBoth.ExecuteReader(); //保留用户名+密码同时存在信息 bool isBothExist=drBoth.Read(); //关闭DataReader drBoth.Close(); conn.Close(); //判断用户是否注册 if(!isRegUserExist) { Response.Write("<script>alert('此用户尚未注册!')"); return false; } //判断用户名与密码是否一致 else if(!isBothExist) { Response.Write("<script>alert('用户名和密码不一致,不能进入!')"); return false; } else return true; } 最后给出系统后端数据存储方案: 利用Microsoft SQL Server 2000建立数据库及其存储过程。这里给出两个必需的数据表,一是数据表News包含的字段有:编号、姓名、标题、关键字、内容、类型、来源部门和日期。字段说明如下: 二是数据表Reg包含的字段有:编号、姓名、密码、所属部门、电子邮箱和电话。字段说明如下: 参考文献 [1]天极网新技术研究室.《ASP.NET完全入门》.重庆出版社,2001 [2]Scott Worley著.《ASP.NET技术内幕》.王文龙 刘湘宁译.人民邮电出版社,2002 [3]Sanjeev Rohilla, Senthil Nathan, Surbhi Malhotra著.《ADO.NET专业项目实例开发》.陈君 王宝良译.国水利水电出版社,2003 [4]丁晟春 王曰芬.网站新闻发布管理系统的设计与应用.现代图书情报技术.2002,5 [5] 手机铃声下载 网站优化网站推广 免费论文下载 职称论文下载

110,525

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧