private static void OpenSqlConnection()
string connectionString = GetConnectionString();
using (SqlConnection connection = new SqlConnection(connectionString))
connection.Open();
Console.WriteLine("ServerVersion: {0}", connection.ServerVersion);
Console.WriteLine("State: {0}", connection.State);
static private string GetConnectionString()
// To avoid storing the connection string in your code,
// you can retrieve it from a configuration file, using the
// System.Configuration.ConfigurationSettings.AppSettings property
return "Data Source=(local);Initial Catalog=AdventureWorks;"
+ "Integrated Security=SSPI;";
其实我们都知道SqlConnection对象一定继承自IDispose接口,然后才可以using。using使用的对象最后都会Dispose处理掉,难道数据库连接对象的Close方法和Dispose是等价的?
这里明确告诉您,通过显式Close和using后Dispose是不一样的。到这里是不是很想知道Dispose和Close的区别?
MSDN对Close方法的解释是这样的:
关闭与数据库的连接,这是关闭任何打开连接的首选方法。 如果 SqlConnection超出范围,则不会将其关闭。因此,必须通过调用 Close 或 Dispose 显式关闭该连接。Close 和 Dispose 在功能上等效。如果连接池值 Pooling 设置为 true 或 yes,则基础连接将返回到连接池。另一方面,如果 Pooling 设置为 false 或 no,则会关闭到服务器的基础连接。
我们可以这样理解:通过调用Close方法关闭的SqlConnection对象,最后是要放回到连接池中的,也就是说这个对象还可以继续使用,只是这个对象现在的连接状态是关闭的,等到下次向池中申请连接对象,这个对象就可以激活复用而不用去new一个新的对象。
而通过调用Dispose()方法,则该对象很可能调用了GC.SuppressFinalize(this)(某些特殊的类可能并没有调用该方法),这样GC就会优先对这些对象进行回收而可能造成该对象无法使用。这里我们只要理解,在SqlConnection对象上调用Dispose方法,则这个连接就不能在连接池中继续使用了。
最后说明一下,ado.net使用了连接池技术用来复用连接,减少系统反复打开关闭连接的开销来提升性能,所以我上面说通过using“数据库操作看上去就像是操作一次数据库,打开一次数据库连接,保证线程安全”其实也是不对的。下面摘录一段MSDN的说法解惑:
连接池使新连接必须打开的次数得以减少。池进程保持物理连接的所有权。通过为每个给定的连接配置保留一组活动连接来管理连接。每当用户在连接上调用 Open 时,池进程就会查找池中可用的连接。如果某个池连接可用,会将该连接返回给调用者,而不是打开新连接。应用程序在该连接上调用 Close 时,池进程会将连接返回到活动连接池集中,而不是关闭连接。连接返回到池中之后,即可在下一个 Open 调用中重复使用。
只有配置相同的连接可以建立池连接。ADO.NET 同时保留多个池,每种配置各一个。在使用集成的安全性时,连接按照连接字符串以及 Windows 标识分到多个池中。还根据连接是否已在事务中登记来建立池连接。
池连接可以显著提高应用程序的性能和可缩放性。默认情况下,在 ADO.NET 中启用连接池。除非显式禁用,否则,在应用程序中打开和关闭连接时,池进程会对连接进行优化。还可以提供几个连接字符串修饰符来控制连接池的行为。
我们可以显式对连接池进行一些操作,但是通常不建议这么做。对连接池您还有什么疑惑吗?欢迎讨论。
http://msdn.microsoft.com/zh-cn/library/system.data.sqlclient.sqlconnection(VS.80).aspx
http://msdn.microsoft.com/zh-cn/library/8xx3tyca(VS.90).aspx
为什么要关闭数据库连接,可以不关闭吗?首先要说明的是连接数是有限制的:代码如下:for (int i = 0; i < 10000; i++){ SqlConnection conn = new SqlConnection(@"Data Source=.\SQLEXPRESS; AttachDbFilename=""E:\DB\
今晚看到上了评论头条的LoveJenny写的为什么要
关闭数据库连接,可以不
关闭吗?,文章写得简单易懂非常不错,而且代码贴的很到位,下面的讨论也很激烈(老赵都跑过去留言两次了,我恨)。又查看了两遍原文中的代码,我同意评论中有几位的看法,真正造成多线程并行操作数据库时的连接问题可能是由于对SqlConnection的不当使用。为什么呢?再来看一下LoveJenny兄弟贴出的一段重要源码:
ADO.NET技术是数据库访问的一个重要方法。
它常用的五个对象分别是:1.Connection2.Command3.DatadAdapter4.DataSet5.DataReader
1.Connection:就是连接数据库
2.Command:执行(T-SQL语句),就是数据库的命令
3.DataAdapter:负责数据库和数据集之间的一个联系,相当于桥梁
4.DataSet:用户填充dataset,断开的模式下进行
5.DataReader:负责从数据源中读取数据
visual stud
用户 'sa' 登录失败。该用户与可信 SQL Server 连接无关联。
说明: 执行当前 Web 请求期间,出现未处理的异常。请检查堆栈跟踪信息,以了解有关该错误以及代码中导致错误的出处的详细信息。
异常详细信息: System.Data.SqlClient.SqlException: 用户 'sa' 登录失败。该用户与可信 SQL Server 连接无关联。
说明: 执行当前
ConnectionState有六个属性值
ConnectionState.Broken;与数据源连接断开。只有在连接打开后才有可能发生这种情况。可以关闭处于这种状态下的连接,然后重新打开。
ConnectionState.Closed;连接处于关闭状态。
ConnectionState.Connecting;连接对象正在与数据源连接。
ConnectionState.Executing;
SQLite介绍
SQLite是一个类似于Access的单机版数据库管理系统,它将所有数据库的定义(包括定义、表、索引和数据本身)都保存在一个单一的文件中。并且,SQLite是一个用C实现的类库,它在内存消耗、文件体积、简单性方面都有不错的表现,如果数据在10W条以下,查询速度也是相当快的。
SQLite具有以下特征:
实现多数SQL92的标准,包括事务(原子性、一致性、隔离性和持久性)、触发器和...
1.问题引入
在SQL Server中备份/还原/分离/脱机/删除指定数据库时, 如果有其他用户正在使用此数据库时, SQL Server为了防止数据异常, 会报错而终止你的操作.
当然, 在SQL 2005里, 在做[分离/删除]数据库时提供了一个选项[关闭所以连接]供勾选(SQL 2000好像没有哦), 然而[备份/还原]操作却没有此选择, 也许你会说可...