SqlMapper.OpenConnection() does not actually open connection
------------------------------------------------------------
Key: IBATISNET-291
URL: https://issues.apache.org/jira/browse/IBATISNET-291
Project: iBatis for .NET
Issue Type: Bug
Components: DataAccess
Affects Versions: DataAccess 1.9 .1
Reporter: Jonas Hamnered
The second sqlMap.OpenConnection() in the following sample causes an exception
for DataAccess 1.9.1.
ISqlMapper sqlMap = Mapper.Get();
using (IDalSession session = sqlMap.OpenConnection())
{
// session for some reason never used, could be due to logic in
called methods
}
using (IDalSession session = sqlMap.OpenConnection())
{
}
The exception is:
IBatisNet.DataMapper.Exceptions.DataMapperException: SqlMap could not invoke
OpenConnection(). A connection is already started. Call CloseConnection first.
at IBatisNet.DataMapper.SqlMapper.OpenConnection() in
C:\Devel\lib\iBatis\IBatisNet.DataMapper\SqlMapper.cs:line 204
The reason is as far as I can tell that sqlMap.OpenConnection no longer opens
the underlying connection. Instead this is done "on demand".
The problem is that if the session is never used before being disposed,
SqlMapSession.Dispose() does not properly cause the
SqlMapper._sessionStore.Dispose() to be called:
[from IBatisNet.DataMapper.SqlMapSession.Dispose()]
if (_isTransactionOpen == false)
{
if (_connection.State != ConnectionState.Closed)
{
_sqlMapper.CloseConnection();
}
}
This finally causes the second sqlMap.OpenConnection() call to throw an
exception since the
[from IBatisNet.DataMapper.SqlMapper]
public ISqlMapSession OpenConnection()
{
if (_sessionStore.LocalSession != null)
{
throw new DataMapperException("SqlMap could not invoke
OpenConnection(). A connection is already started. Call CloseConnection
first.");
}
...
A possible work-around is to manually call session.OpenConnection() inside the
using block.
Possible fixes could obviously be:
* to make sqlMap.OpenConnection always open the db connection (like in earlier
versions, and as the name says)
* alter SqlMapSession.Dispose() to somehow cause a
SqlMapper._sessionStore.Dispose() even if the connection is closed
--
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.