大家说下是先conn.close()呢还是先comm.Dispose()呢?

时间:2021-01-17 23:51:29
假如程序中使用了tran, comm, conn

那么我们在结束时下面的顺序是怎样的?请说明理由....

conn.close();
conn.close();
comm.Dispose();
tran.Dispose();

48 个解决方案

#1


沙发~

#2


conn关闭连接方在最后把。。。

#3


先清理再关。

#4


正常的顺序是
Trans.Commit
Trans.Dispose()
Command.Dispose()
Connection.Close()
Connection.Dispose()

不过你要是反着来也行,
1.Command.Dispose(),若Command上有未提交的事务,则自动Rollback.
2.Connection.Close().不会调用Command.Dispose(),但事务会Rollback.

 

#5



 tran.Dispose();
comm.Dispose(); 
 conn.close(); 

本人觉得应该是这样,不知道原因,但知道嵌套。


#6


tran.Dispose(); 
comm.Dispose(); 
conn.close(); 

#7


Q:我上面的代码中如果没有异常抛出的话,我可以使用close()或dispose()吗

A:我们毫无顾忌地用他们中的任意一个,或两个同时使用.在一个已经close或dipose()的连接中使用close()或dispose()是不会影响的

Q:Close()和Dispose()有什么不同,我应该用哪一个好?
A:它们做的是同一件事,你可以调用他们中的任意一个,或两个同时使用.

Q:你所说的"practically the same thing”是什么意思?
A:Dispose()将会通过sqlConnection来清理相关的连接,之后执行close().它们没有什么本质的区别,你可以通过reflector来证明这点

Q:与close()相比,connection.dispose()会将连接些移除吗?
A:不会

#8


Close函数和Dispose函数是一种约定。调用Close函数释放资源后可能还需要再次使用,
而Dispose函数释放的资源不再使用。 

this.dispose()已经释放了实例占用的资源   
this.close()只是关闭一些连接或少量资源,实例还是存在的

#9


引用 8 楼 CeShenBeiWang 的回复:
Close函数和Dispose函数是一种约定。调用Close函数释放资源后可能还需要再次使用, 
而Dispose函数释放的资源不再使用。 

this.dispose()已经释放了实例占用的资源  
this.close()只是关闭一些连接或少量资源,实例还是存在的

那顺序是如何?~

#10


引用 7 楼 cpp2017 的回复:
Q:我上面的代码中如果没有异常抛出的话,我可以使用close()或dispose()吗 

A:我们毫无顾忌地用他们中的任意一个,或两个同时使用.在一个已经close或dipose()的连接中使用close()或dispose()是不会影响的 

Q:Close()和Dispose()有什么不同,我应该用哪一个好? 
A:它们做的是同一件事,你可以调用他们中的任意一个,或两个同时使用. 

Q:你所说的"practically the same thing”是什么意思? 
A:Dispose()将会通过sqlConnection…


是否写了conn.close()就不用写conn.dispose()了?

#11


如果dispose()是释放实例后占用的资源,那么是否在这个过程中是否就已包含了close呢?

那是不是说我们在写时之需要写conn.dispose()就可以,而不需要在额外的写close()了呢?

#12


其实在调用时不会用到con.dispose(),而是用到con.close().
其实很多时候我们都会忘记把连接关闭,不过.net提供了using指令可以自动关闭
用法
using(sqlconnection sqlcon=new sqlconnection("连接字符串"))
{
sqlcon.open()//在这里面只用打开就可以了
sqlcon.close()//这一句可以不要,因为执行完using()系统会自动关闭连接的。
}
一般要是手动关闭只用con.close()一下就可以了。不用释放。

#13


up

#14


先close 再 dispose

不过用using不是好点么.

#15


con.dispose()是释放资源,而con.close()是关闭连接。
顺序没有什么先后。

#16


用using比較好

#17


conn.close();
conn.close(); 
comm.Dispose(); 
tran.Dispose(); 

close是关闭对象对象,还没有销毁,就好比数据库连接你还可以open开
但dispose就不一样了,直接销毁资源了,你再open会报错的  

#18


没有必要dispose

#19


 我个人认为用using 比较好

#20


1、先销毁事务
2、关闭连接
3、销毁连接

#21


引用 19 楼 hncz_zhoumin 的回复:
我个人认为用using 比较好


只有实现了IDispose接口的对象才能用using块
连接对象关闭就可以了,没有必要销毁

#22


using 自动关闭就可以啦,没必要销毁

#23


先关闭,然后释放
因为关闭只是中断了与数据库的连接,但这个连接还被该程序占用着,没有释放,而数据库的连接数是有限的
所以你还用及时释放掉

#24


关注

#25


引用 11 楼 Aimis 的回复:
如果dispose()是释放实例后占用的资源,那么是否在这个过程中是否就已包含了close呢? 

那是不是说我们在写时之需要写conn.dispose()就可以,而不需要在额外的写close()了呢?

是的,其实反编译framework中的类就可以知道
dispose() 包含了close()

#26


学习了

#27


引用 16 楼 zzxap 的回复:
用using比較好


木有明白~请大侠明示

#28


我是否可以理解为顺序如下:


_tran.Dispose();
_comm.Dispose();
_conn.Close();
_conn.Dispose();


????

#29


我们做的项目通常是想Close(),再Dispose()的

#30


我不要想当然~

我要知道最终的结果~

#31


up

#32


数据库连接有链接池的概念,当close一个链接,这个链接对象可能还存在连接池里面;等其它请求进行调用;如果dispose就直接把这个对象销毁了。

#33


引用 30 楼 Aimis 的回复:
我不要想当然~ 

我要知道最终的结果~

我觉得、我习惯性的写法:

conn.close(); 
conn.Dispose(); 


如果非要都写上,那我就:

conn.close(); 
tran.Dispose();
comm.Dispose();

conn.Dispose();  



 

#34



comm.Dispose(); 
conn.close(); 

#35


学习了

#36


查看IL代码你可以发现,一般的非托管类里面的close方法都是调用dispose()方法的

#37


肯定最后con.close()膝盖都想到了···

#38


引用 4 楼 Garnett_KG 的回复:
正常的顺序是 
Trans.Commit 
Trans.Dispose() 
Command.Dispose() 
Connection.Close() 
Connection.Dispose() 

不过你要是反着来也行, 
1.Command.Dispose(),若Command上有未提交的事务,则自动Rollback. 
2.Connection.Close().不会调用Command.Dispose(),但事务会Rollback. 


up

#39


和打开的顺序相反,先打开的最后关

#40


只有一句
conn.Dispose(); 

是必要的,其它的都是多余的。

不过这一句你也最好不要直接写,应该使用using结构来 确保自动地调用它。

#41


引用 40 楼 sp1234 的回复:
只有一句
C# codeconn.Dispose(); 



是必要的,其它的都是多余的。 

不过这一句你也最好不要直接写,应该使用using结构来确保自动地调用它。

大哥,有没有关于using结构的相关文章供我学习一下~

鞠躬~

#42


comm.Dispose(); 
conn.close();

#43


用USING 不要明白太多。我是這樣的

#44


mark!~

#45


只想说一点:调用了close之后就没有调用Dispose了,因为close里面已经调用过Dispose了

#46


同意4楼的
正常的顺序是
Trans.Commit
Trans.Dispose()
Command.Dispose()
Connection.Close()
Connection.Dispose() 


using的用法是这样的

using(SqlConnection sqlConn = new SqlConnection(connstr))
{
string strsql = "INSERT INTO ADDRESS001 (F001,F002,F003) VALUES (@F001,@F002,@F003)";
SqlCommand CmdObj = new SqlCommand();
CmdObj.Connection=sqlConn;
CmdObj.CommandText=strsql;

CmdObj.Parameters.Add("@F001",SqlDbType.VarChar);
CmdObj.Parameters.Add("@F002",SqlDbType.Int);
CmdObj.Parameters.Add("@F003",SqlDbType.Int);

CmdObj.Parameters["@F001"].Value=group.group_name;
CmdObj.Parameters["@F002"].Value=group.order;
CmdObj.Parameters["@F003"].Value=group.user_id;

try
{
sqlConn.Open();
CmdObj.ExecuteNonQuery();

result=1;
errorinfo="分组添加成功!";
}
catch(System.Data.SqlClient.SqlException err)
{
result=-1;
errorinfo="分组添加失败:数据库操作出错!"+err;
}
finally
{
sqlConn.Close();
}
}

#47


我也一直是先Close再Dispose都没出现过什么问题

#48


应该是 先清理 在关闭!

#1


沙发~

#2


conn关闭连接方在最后把。。。

#3


先清理再关。

#4


正常的顺序是
Trans.Commit
Trans.Dispose()
Command.Dispose()
Connection.Close()
Connection.Dispose()

不过你要是反着来也行,
1.Command.Dispose(),若Command上有未提交的事务,则自动Rollback.
2.Connection.Close().不会调用Command.Dispose(),但事务会Rollback.

 

#5



 tran.Dispose();
comm.Dispose(); 
 conn.close(); 

本人觉得应该是这样,不知道原因,但知道嵌套。


#6


tran.Dispose(); 
comm.Dispose(); 
conn.close(); 

#7


Q:我上面的代码中如果没有异常抛出的话,我可以使用close()或dispose()吗

A:我们毫无顾忌地用他们中的任意一个,或两个同时使用.在一个已经close或dipose()的连接中使用close()或dispose()是不会影响的

Q:Close()和Dispose()有什么不同,我应该用哪一个好?
A:它们做的是同一件事,你可以调用他们中的任意一个,或两个同时使用.

Q:你所说的"practically the same thing”是什么意思?
A:Dispose()将会通过sqlConnection来清理相关的连接,之后执行close().它们没有什么本质的区别,你可以通过reflector来证明这点

Q:与close()相比,connection.dispose()会将连接些移除吗?
A:不会

#8


Close函数和Dispose函数是一种约定。调用Close函数释放资源后可能还需要再次使用,
而Dispose函数释放的资源不再使用。 

this.dispose()已经释放了实例占用的资源   
this.close()只是关闭一些连接或少量资源,实例还是存在的

#9


引用 8 楼 CeShenBeiWang 的回复:
Close函数和Dispose函数是一种约定。调用Close函数释放资源后可能还需要再次使用, 
而Dispose函数释放的资源不再使用。 

this.dispose()已经释放了实例占用的资源  
this.close()只是关闭一些连接或少量资源,实例还是存在的

那顺序是如何?~

#10


引用 7 楼 cpp2017 的回复:
Q:我上面的代码中如果没有异常抛出的话,我可以使用close()或dispose()吗 

A:我们毫无顾忌地用他们中的任意一个,或两个同时使用.在一个已经close或dipose()的连接中使用close()或dispose()是不会影响的 

Q:Close()和Dispose()有什么不同,我应该用哪一个好? 
A:它们做的是同一件事,你可以调用他们中的任意一个,或两个同时使用. 

Q:你所说的"practically the same thing”是什么意思? 
A:Dispose()将会通过sqlConnection…


是否写了conn.close()就不用写conn.dispose()了?

#11


如果dispose()是释放实例后占用的资源,那么是否在这个过程中是否就已包含了close呢?

那是不是说我们在写时之需要写conn.dispose()就可以,而不需要在额外的写close()了呢?

#12


其实在调用时不会用到con.dispose(),而是用到con.close().
其实很多时候我们都会忘记把连接关闭,不过.net提供了using指令可以自动关闭
用法
using(sqlconnection sqlcon=new sqlconnection("连接字符串"))
{
sqlcon.open()//在这里面只用打开就可以了
sqlcon.close()//这一句可以不要,因为执行完using()系统会自动关闭连接的。
}
一般要是手动关闭只用con.close()一下就可以了。不用释放。

#13


up

#14


先close 再 dispose

不过用using不是好点么.

#15


con.dispose()是释放资源,而con.close()是关闭连接。
顺序没有什么先后。

#16


用using比較好

#17


conn.close();
conn.close(); 
comm.Dispose(); 
tran.Dispose(); 

close是关闭对象对象,还没有销毁,就好比数据库连接你还可以open开
但dispose就不一样了,直接销毁资源了,你再open会报错的  

#18


没有必要dispose

#19


 我个人认为用using 比较好

#20


1、先销毁事务
2、关闭连接
3、销毁连接

#21


引用 19 楼 hncz_zhoumin 的回复:
我个人认为用using 比较好


只有实现了IDispose接口的对象才能用using块
连接对象关闭就可以了,没有必要销毁

#22


using 自动关闭就可以啦,没必要销毁

#23


先关闭,然后释放
因为关闭只是中断了与数据库的连接,但这个连接还被该程序占用着,没有释放,而数据库的连接数是有限的
所以你还用及时释放掉

#24


关注

#25


引用 11 楼 Aimis 的回复:
如果dispose()是释放实例后占用的资源,那么是否在这个过程中是否就已包含了close呢? 

那是不是说我们在写时之需要写conn.dispose()就可以,而不需要在额外的写close()了呢?

是的,其实反编译framework中的类就可以知道
dispose() 包含了close()

#26


学习了

#27


引用 16 楼 zzxap 的回复:
用using比較好


木有明白~请大侠明示

#28


我是否可以理解为顺序如下:


_tran.Dispose();
_comm.Dispose();
_conn.Close();
_conn.Dispose();


????

#29


我们做的项目通常是想Close(),再Dispose()的

#30


我不要想当然~

我要知道最终的结果~

#31


up

#32


数据库连接有链接池的概念,当close一个链接,这个链接对象可能还存在连接池里面;等其它请求进行调用;如果dispose就直接把这个对象销毁了。

#33


引用 30 楼 Aimis 的回复:
我不要想当然~ 

我要知道最终的结果~

我觉得、我习惯性的写法:

conn.close(); 
conn.Dispose(); 


如果非要都写上,那我就:

conn.close(); 
tran.Dispose();
comm.Dispose();

conn.Dispose();  



 

#34



comm.Dispose(); 
conn.close(); 

#35


学习了

#36


查看IL代码你可以发现,一般的非托管类里面的close方法都是调用dispose()方法的

#37


肯定最后con.close()膝盖都想到了···

#38


引用 4 楼 Garnett_KG 的回复:
正常的顺序是 
Trans.Commit 
Trans.Dispose() 
Command.Dispose() 
Connection.Close() 
Connection.Dispose() 

不过你要是反着来也行, 
1.Command.Dispose(),若Command上有未提交的事务,则自动Rollback. 
2.Connection.Close().不会调用Command.Dispose(),但事务会Rollback. 


up

#39


和打开的顺序相反,先打开的最后关

#40


只有一句
conn.Dispose(); 

是必要的,其它的都是多余的。

不过这一句你也最好不要直接写,应该使用using结构来 确保自动地调用它。

#41


引用 40 楼 sp1234 的回复:
只有一句
C# codeconn.Dispose(); 



是必要的,其它的都是多余的。 

不过这一句你也最好不要直接写,应该使用using结构来确保自动地调用它。

大哥,有没有关于using结构的相关文章供我学习一下~

鞠躬~

#42


comm.Dispose(); 
conn.close();

#43


用USING 不要明白太多。我是這樣的

#44


mark!~

#45


只想说一点:调用了close之后就没有调用Dispose了,因为close里面已经调用过Dispose了

#46


同意4楼的
正常的顺序是
Trans.Commit
Trans.Dispose()
Command.Dispose()
Connection.Close()
Connection.Dispose() 


using的用法是这样的

using(SqlConnection sqlConn = new SqlConnection(connstr))
{
string strsql = "INSERT INTO ADDRESS001 (F001,F002,F003) VALUES (@F001,@F002,@F003)";
SqlCommand CmdObj = new SqlCommand();
CmdObj.Connection=sqlConn;
CmdObj.CommandText=strsql;

CmdObj.Parameters.Add("@F001",SqlDbType.VarChar);
CmdObj.Parameters.Add("@F002",SqlDbType.Int);
CmdObj.Parameters.Add("@F003",SqlDbType.Int);

CmdObj.Parameters["@F001"].Value=group.group_name;
CmdObj.Parameters["@F002"].Value=group.order;
CmdObj.Parameters["@F003"].Value=group.user_id;

try
{
sqlConn.Open();
CmdObj.ExecuteNonQuery();

result=1;
errorinfo="分组添加成功!";
}
catch(System.Data.SqlClient.SqlException err)
{
result=-1;
errorinfo="分组添加失败:数据库操作出错!"+err;
}
finally
{
sqlConn.Close();
}
}

#47


我也一直是先Close再Dispose都没出现过什么问题

#48


应该是 先清理 在关闭!