我正在开发一个带有Visual Studio 2012 Ultimate版本的WinForm应用程序以及所有Service Pack,C#和.NET Framework 4.5。
我得到了这个例外:
Internal .Net Framework Data Provider error 1
使用此堆栈:
en System.Data.ProviderBase.DbConnectionInternal.PrePush(Object expectedOwner)
en System.Data.ProviderBase.DbConnectionPool.PutObject(DbConnectionInternal obj, Object owningObject)
en System.Data.ProviderBase.DbConnectionInternal.CloseConnection(DbConnection owningObject, DbConnectionFactory connectionFactory)
en System.Data.SqlClient.SqlConnection.CloseInnerConnection()
en System.Data.SqlClient.SqlConnection.Close()
en AdoData.TRZIC.DisposeCurrentConnection()
en AdoData.TRZIC.Finalize()
在析构函数中:
~TRZIC()
{
DisposeCurrentConnection();
if (this.getCodeCmd != null)
this.getCodeCmd.Dispose();
}
private void DisposeCurrentConnection()
{
if (this.conn != null)
{
if (this.conn.State == ConnectionState.Open)
this.conn.Close();
this.conn.Dispose();
this.conn = null;
}
}
我在第this.conn.Close();
行中得到了例外。
而conn
是private SqlConnection conn = null;
你知道为什么吗?
答案 0 :(得分:16)
我找到了解决方案here。
基本上归结为:
注意
不要在类的Finalize方法中对Connection,DataReader或任何其他托管对象调用Close或Dispose。在终结器中,您应该只释放您的类直接拥有的非托管资源。如果您的类不拥有任何非托管资源,请不要在类定义中包含Finalize方法。有关更多信息,请参阅垃圾收集。
答案 1 :(得分:1)
这不是答案,但我强烈建议您使用using
处理连接。然后你不需要担心处理对象。
using (SqlConnection connection = new SqlConnection(connectionString))
{
try
{
connection.Open();
SqlCommand command = new SqlCommand("......", connection);
command.ExecuteNonQuery();
}
catch (Exception)
{
/*Handle error*/
}
}