You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ibatis.apache.org by rg...@apache.org on 2006/07/16 18:58:25 UTC
svn commit: r422475 - in
/ibatis/branches/IBatisNet.DataMapper-QueryForDataTable: ./
Configuration/Cache/ MappedStatements/ MappedStatements/ArgumentStrategy/
MappedStatements/PropertStrategy/ MappedStatements/ResultStrategy/
Author: rgrabowski
Date: Sun Jul 16 09:58:24 2006
New Revision: 422475
URL: http://svn.apache.org/viewvc?rev=422475&view=rev
Log:
Initial check-in for supporting QueryForDataTable. I've got it returning a DataTable from a <select> statement. I've also included a fixed QueryForObject for IBATISNET-104 (CachingStatement opens/closes connection to database if there is a cache hit) and the two line fix for IBATISNET-154 (allow SelectKey to specify a resultMap instead of just a resultClass).
Added:
ibatis/branches/IBatisNet.DataMapper-QueryForDataTable/MappedStatements/ArgumentStrategy/SelectDataTableStrategy.cs
ibatis/branches/IBatisNet.DataMapper-QueryForDataTable/MappedStatements/PropertStrategy/SelectDataTableStrategy.cs
ibatis/branches/IBatisNet.DataMapper-QueryForDataTable/MappedStatements/ResultStrategy/DataTableStrategy.cs
Modified:
ibatis/branches/IBatisNet.DataMapper-QueryForDataTable/Configuration/Cache/CacheModel.cs
ibatis/branches/IBatisNet.DataMapper-QueryForDataTable/ExecuteEventArgs.cs
ibatis/branches/IBatisNet.DataMapper-QueryForDataTable/IBatisNet.DataMapper.csproj
ibatis/branches/IBatisNet.DataMapper-QueryForDataTable/ISqlMapper.cs
ibatis/branches/IBatisNet.DataMapper-QueryForDataTable/MappedStatements/ArgumentStrategy/ArgumentStrategyFactory.cs
ibatis/branches/IBatisNet.DataMapper-QueryForDataTable/MappedStatements/ArgumentStrategy/SelectStrategy.cs
ibatis/branches/IBatisNet.DataMapper-QueryForDataTable/MappedStatements/CachingStatement.cs
ibatis/branches/IBatisNet.DataMapper-QueryForDataTable/MappedStatements/IMappedStatement.cs
ibatis/branches/IBatisNet.DataMapper-QueryForDataTable/MappedStatements/MappedStatement.cs
ibatis/branches/IBatisNet.DataMapper-QueryForDataTable/MappedStatements/PropertStrategy/PropertyStrategyFactory.cs
ibatis/branches/IBatisNet.DataMapper-QueryForDataTable/MappedStatements/PropertStrategy/SelectStrategy.cs
ibatis/branches/IBatisNet.DataMapper-QueryForDataTable/MappedStatements/ResultStrategy/ResultClassStrategy.cs
ibatis/branches/IBatisNet.DataMapper-QueryForDataTable/SqlMapper.cs
Modified: ibatis/branches/IBatisNet.DataMapper-QueryForDataTable/Configuration/Cache/CacheModel.cs
URL: http://svn.apache.org/viewvc/ibatis/branches/IBatisNet.DataMapper-QueryForDataTable/Configuration/Cache/CacheModel.cs?rev=422475&r1=422474&r2=422475&view=diff
==============================================================================
--- ibatis/branches/IBatisNet.DataMapper-QueryForDataTable/Configuration/Cache/CacheModel.cs (original)
+++ ibatis/branches/IBatisNet.DataMapper-QueryForDataTable/Configuration/Cache/CacheModel.cs Sun Jul 16 09:58:24 2006
@@ -252,7 +252,7 @@
{
if (_logger.IsDebugEnabled)
{
- _logger.Debug("Flush cacheModel named "+_id+" for statement '"+e.StatementName+"'");
+ _logger.Debug("Flush cacheModel named "+_id+" for statement '"+e.RequestScope.Statement.Id+"'");
}
Flush();
Modified: ibatis/branches/IBatisNet.DataMapper-QueryForDataTable/ExecuteEventArgs.cs
URL: http://svn.apache.org/viewvc/ibatis/branches/IBatisNet.DataMapper-QueryForDataTable/ExecuteEventArgs.cs?rev=422475&r1=422474&r2=422475&view=diff
==============================================================================
--- ibatis/branches/IBatisNet.DataMapper-QueryForDataTable/ExecuteEventArgs.cs (original)
+++ ibatis/branches/IBatisNet.DataMapper-QueryForDataTable/ExecuteEventArgs.cs Sun Jul 16 09:58:24 2006
@@ -2,7 +2,7 @@
#region Apache Notice
/*****************************************************************************
* $Header: $
- * $Revision: $
+ * $Revision$
* $Date$
*
* iBATIS.NET Data Mapper
@@ -25,29 +25,22 @@
#endregion
using System;
+using IBatisNet.DataMapper.Scope;
namespace IBatisNet.DataMapper
{
- /// <summary>
- /// Summary description for ExecuteEventArgs.
- /// </summary>
public class ExecuteEventArgs : EventArgs
{
- private string _statementName = string.Empty;
+ private RequestScope requestScope;
- /// <summary>
- /// Set or get the statement name
- /// </summary>
- public string StatementName
+ public ExecuteEventArgs(RequestScope requestScope)
{
- get
- {
- return _statementName;
- }
- set
- {
- _statementName = value;
- }
+ this.requestScope = requestScope;
+ }
+
+ public RequestScope RequestScope
+ {
+ get { return requestScope; }
}
}
-}
+}
\ No newline at end of file
Modified: ibatis/branches/IBatisNet.DataMapper-QueryForDataTable/IBatisNet.DataMapper.csproj
URL: http://svn.apache.org/viewvc/ibatis/branches/IBatisNet.DataMapper-QueryForDataTable/IBatisNet.DataMapper.csproj?rev=422475&r1=422474&r2=422475&view=diff
==============================================================================
--- ibatis/branches/IBatisNet.DataMapper-QueryForDataTable/IBatisNet.DataMapper.csproj (original)
+++ ibatis/branches/IBatisNet.DataMapper-QueryForDataTable/IBatisNet.DataMapper.csproj Sun Jul 16 09:58:24 2006
@@ -903,6 +903,11 @@
BuildAction = "Compile"
/>
<File
+ RelPath = "MappedStatements\ArgumentStrategy\SelectDataTableStrategy.cs"
+ SubType = "Code"
+ BuildAction = "Compile"
+ />
+ <File
RelPath = "MappedStatements\ArgumentStrategy\SelectListStrategy.cs"
SubType = "Code"
BuildAction = "Compile"
@@ -973,6 +978,11 @@
BuildAction = "Compile"
/>
<File
+ RelPath = "MappedStatements\PropertStrategy\SelectDataTableStrategy.cs"
+ SubType = "Code"
+ BuildAction = "Compile"
+ />
+ <File
RelPath = "MappedStatements\PropertStrategy\SelectListStrategy.cs"
SubType = "Code"
BuildAction = "Compile"
@@ -994,6 +1004,11 @@
/>
<File
RelPath = "MappedStatements\ResultStrategy\BaseResultStrategy.cs"
+ SubType = "Code"
+ BuildAction = "Compile"
+ />
+ <File
+ RelPath = "MappedStatements\ResultStrategy\DataTableStrategy.cs"
SubType = "Code"
BuildAction = "Compile"
/>
Modified: ibatis/branches/IBatisNet.DataMapper-QueryForDataTable/ISqlMapper.cs
URL: http://svn.apache.org/viewvc/ibatis/branches/IBatisNet.DataMapper-QueryForDataTable/ISqlMapper.cs?rev=422475&r1=422474&r2=422475&view=diff
==============================================================================
--- ibatis/branches/IBatisNet.DataMapper-QueryForDataTable/ISqlMapper.cs (original)
+++ ibatis/branches/IBatisNet.DataMapper-QueryForDataTable/ISqlMapper.cs Sun Jul 16 09:58:24 2006
@@ -187,6 +187,8 @@
/// <returns></returns>
IDalSession OpenConnection(string connectionString);
+ DataTable QueryForDataTable(string statementName, object parameterObject);
+
/// <summary>
/// Alias to QueryForMap, .NET spirit.
/// Feature idea by Ted Husted.
Modified: ibatis/branches/IBatisNet.DataMapper-QueryForDataTable/MappedStatements/ArgumentStrategy/ArgumentStrategyFactory.cs
URL: http://svn.apache.org/viewvc/ibatis/branches/IBatisNet.DataMapper-QueryForDataTable/MappedStatements/ArgumentStrategy/ArgumentStrategyFactory.cs?rev=422475&r1=422474&r2=422475&view=diff
==============================================================================
--- ibatis/branches/IBatisNet.DataMapper-QueryForDataTable/MappedStatements/ArgumentStrategy/ArgumentStrategyFactory.cs (original)
+++ ibatis/branches/IBatisNet.DataMapper-QueryForDataTable/MappedStatements/ArgumentStrategy/ArgumentStrategyFactory.cs Sun Jul 16 09:58:24 2006
@@ -38,6 +38,8 @@
private static IArgumentStrategy _selectGenericListStrategy = null;
private static IArgumentStrategy _selectListStrategy = null;
private static IArgumentStrategy _selectObjectStrategy = null;
+ private static IArgumentStrategy _selectDataTableStrategy = null;
+
/// <summary>
/// Initializes the <see cref="ArgumentStrategyFactory"/> class.
@@ -50,6 +52,7 @@
_selectArrayStrategy = new SelectArrayStrategy();
_selectListStrategy = new SelectListStrategy();
_selectObjectStrategy = new SelectObjectStrategy();
+ _selectDataTableStrategy = new SelectDataTableStrategy();
#if dotnet2
_selectGenericListStrategy = new SelectGenericListStrategy();
#endif
@@ -78,7 +81,8 @@
_selectArrayStrategy,
_selectGenericListStrategy,
_selectListStrategy,
- _selectObjectStrategy);
+ _selectObjectStrategy,
+ _selectDataTableStrategy);
}
}
}
Added: ibatis/branches/IBatisNet.DataMapper-QueryForDataTable/MappedStatements/ArgumentStrategy/SelectDataTableStrategy.cs
URL: http://svn.apache.org/viewvc/ibatis/branches/IBatisNet.DataMapper-QueryForDataTable/MappedStatements/ArgumentStrategy/SelectDataTableStrategy.cs?rev=422475&view=auto
==============================================================================
--- ibatis/branches/IBatisNet.DataMapper-QueryForDataTable/MappedStatements/ArgumentStrategy/SelectDataTableStrategy.cs (added)
+++ ibatis/branches/IBatisNet.DataMapper-QueryForDataTable/MappedStatements/ArgumentStrategy/SelectDataTableStrategy.cs Sun Jul 16 09:58:24 2006
@@ -0,0 +1,20 @@
+using System.Data;
+using IBatisNet.DataMapper.Commands;
+using IBatisNet.DataMapper.Configuration.ResultMapping;
+using IBatisNet.DataMapper.Scope;
+
+namespace IBatisNet.DataMapper.MappedStatements.ArgumentStrategy
+{
+ public sealed class SelectDataTableStrategy : IArgumentStrategy
+ {
+ public object GetValue(RequestScope request, ResultMap resultMap, ResultProperty mapping, ref IDataReader reader,
+ object keys)
+ {
+ // Get the select statement
+ IMappedStatement selectStatement = request.MappedStatement.SqlMap.GetMappedStatement(mapping.Select);
+
+ reader = DataReaderTransformer.Transform(reader, request.Session.DataSource.DbProvider);
+ return selectStatement.ExecuteQueryForDataTable(request.Session, keys);
+ }
+ }
+}
Modified: ibatis/branches/IBatisNet.DataMapper-QueryForDataTable/MappedStatements/ArgumentStrategy/SelectStrategy.cs
URL: http://svn.apache.org/viewvc/ibatis/branches/IBatisNet.DataMapper-QueryForDataTable/MappedStatements/ArgumentStrategy/SelectStrategy.cs?rev=422475&r1=422474&r2=422475&view=diff
==============================================================================
--- ibatis/branches/IBatisNet.DataMapper-QueryForDataTable/MappedStatements/ArgumentStrategy/SelectStrategy.cs (original)
+++ ibatis/branches/IBatisNet.DataMapper-QueryForDataTable/MappedStatements/ArgumentStrategy/SelectStrategy.cs Sun Jul 16 09:58:24 2006
@@ -58,12 +58,13 @@
IArgumentStrategy selectArrayStrategy,
IArgumentStrategy selectGenericListStrategy,
IArgumentStrategy selectListStrategy,
- IArgumentStrategy selectObjectStrategy)
+ IArgumentStrategy selectObjectStrategy,
+ IArgumentStrategy selectDataTableStrategy)
{
// Collection object or .NET object
if (mapping.MemberType.BaseType == typeof(Array))
{
- _selectStrategy = selectArrayStrategy;
+ _selectStrategy = selectArrayStrategy;
}
#if dotnet2
else if (mapping.MemberType.IsGenericType &&
@@ -72,16 +73,19 @@
_selectStrategy = selectGenericListStrategy;
}
#endif
- // Check if the object to Map implement 'IList' or is IList type
- // If yes the ResultProperty is map to a IList object
+ // Check if the object to Map implement 'IList' or is IList type
+ // If yes the ResultProperty is map to a IList object
else if ( typeof(IList).IsAssignableFrom(mapping.MemberType) )
{
- _selectStrategy = selectListStrategy;
+ _selectStrategy = selectListStrategy;
+ }
+ else if (typeof(DataTable).IsAssignableFrom(mapping.MemberType) )
+ {
+ _selectStrategy = selectDataTableStrategy;
}
-
else // The ResultProperty is map to a .Net object
{
- _selectStrategy = selectObjectStrategy;
+ _selectStrategy = selectObjectStrategy;
}
}
Modified: ibatis/branches/IBatisNet.DataMapper-QueryForDataTable/MappedStatements/CachingStatement.cs
URL: http://svn.apache.org/viewvc/ibatis/branches/IBatisNet.DataMapper-QueryForDataTable/MappedStatements/CachingStatement.cs?rev=422475&r1=422474&r2=422475&view=diff
==============================================================================
--- ibatis/branches/IBatisNet.DataMapper-QueryForDataTable/MappedStatements/CachingStatement.cs (original)
+++ ibatis/branches/IBatisNet.DataMapper-QueryForDataTable/MappedStatements/CachingStatement.cs Sun Jul 16 09:58:24 2006
@@ -52,6 +52,8 @@
/// </summary>
public event ExecuteEventHandler Execute;
+ public event ExecuteEventHandler PreExecute;
+
/// <summary>
/// Constructor
/// </summary>
@@ -145,7 +147,24 @@
return map;
}
-
+ public DataTable ExecuteQueryForDataTable(IDalSession session, object parameterObject)
+ {
+ RequestScope request = this.Statement.Sql.GetRequestScope(this, parameterObject, session);
+
+ _mappedStatement.PreparedCommand.Create( request, session, Statement, parameterObject );
+
+ CacheKey cacheKey = this.GetCacheKey(request);
+ cacheKey.Update("ExecuteQueryForDataTable");
+
+ DataTable dataTable = Statement.CacheModel[cacheKey] as DataTable;
+ if (dataTable == null)
+ {
+ dataTable = _mappedStatement.RunQueryForDataTable( request, session, parameterObject);
+ this.Statement.CacheModel[cacheKey] = dataTable;
+ }
+
+ return dataTable;
+ }
/// <summary>
/// Execute an update statement. Also used for delete statement.
Modified: ibatis/branches/IBatisNet.DataMapper-QueryForDataTable/MappedStatements/IMappedStatement.cs
URL: http://svn.apache.org/viewvc/ibatis/branches/IBatisNet.DataMapper-QueryForDataTable/MappedStatements/IMappedStatement.cs?rev=422475&r1=422474&r2=422475&view=diff
==============================================================================
--- ibatis/branches/IBatisNet.DataMapper-QueryForDataTable/MappedStatements/IMappedStatement.cs (original)
+++ ibatis/branches/IBatisNet.DataMapper-QueryForDataTable/MappedStatements/IMappedStatement.cs Sun Jul 16 09:58:24 2006
@@ -25,11 +25,11 @@
#endregion
#region Imports
-using System;
using System.Collections;
#if dotnet2
using System.Collections.Generic;
#endif
+using System.Data;
using IBatisNet.Common;
using IBatisNet.DataMapper.Commands;
using IBatisNet.DataMapper.Configuration.Statements;
@@ -55,6 +55,8 @@
/// </summary>
event ExecuteEventHandler Execute;
+ event ExecuteEventHandler PreExecute;
+
#endregion
#region Properties
@@ -120,6 +122,20 @@
#endregion
+ #region ExecuteQueryForDataTable
+
+ /// <summary>
+ /// Executes the SQL and retuns all rows selected in a DataTable with its TableName property to the name of
+ /// the statement.
+ /// </summary>
+ /// <param name="session">The session used to execute the statement</param>
+ /// <param name="parameterObject">The object used to set the parameters in the SQL. </param>
+ /// <returns>A DataTable containing the selected rows.</returns>
+ /// <exception cref="IBatisNet.DataMapper.Exceptions.DataMapperException">If a transaction is not in progress, or the database throws an exception.</exception>
+ DataTable ExecuteQueryForDataTable(IDalSession session, object parameterObject);
+
+ #endregion
+
#region ExecuteUpdate
/// <summary>
@@ -294,5 +310,5 @@
IList<T> ExecuteQueryForRowDelegate<T>(IDalSession session, object parameterObject, SqlMapper.RowDelegate<T> rowDelegate);
#endif
#endregion
- }
+ }
}
Modified: ibatis/branches/IBatisNet.DataMapper-QueryForDataTable/MappedStatements/MappedStatement.cs
URL: http://svn.apache.org/viewvc/ibatis/branches/IBatisNet.DataMapper-QueryForDataTable/MappedStatements/MappedStatement.cs?rev=422475&r1=422474&r2=422475&view=diff
==============================================================================
--- ibatis/branches/IBatisNet.DataMapper-QueryForDataTable/MappedStatements/MappedStatement.cs (original)
+++ ibatis/branches/IBatisNet.DataMapper-QueryForDataTable/MappedStatements/MappedStatement.cs Sun Jul 16 09:58:24 2006
@@ -62,6 +62,8 @@
/// </summary>
public class MappedStatement : IMappedStatement
{
+ public event ExecuteEventHandler PreExecute;
+
/// <summary>
/// Event launch on exceute query
/// </summary>
@@ -249,6 +251,7 @@
using ( IDbCommand command = request.IDbCommand )
{
+ RaisePreExecuteEvent(request);
using ( IDataReader reader = command.ExecuteReader() )
{
if ( reader.Read() )
@@ -267,7 +270,7 @@
RetrieveOutputParameters(request, session, command, parameterObject);
}
- RaiseExecuteEvent();
+ RaiseExecuteEvent(request);
return result;
}
@@ -718,6 +721,7 @@
using ( IDbCommand command = request.IDbCommand )
{
+ RaisePreExecuteEvent(request);
rows = command.ExecuteNonQuery();
ExecutePostSelect(request);
@@ -725,7 +729,7 @@
RetrieveOutputParameters(request, session, command, parameterObject);
}
- RaiseExecuteEvent();
+ RaiseExecuteEvent(request);
return rows;
}
@@ -764,6 +768,7 @@
{
if (_statement is Insert)
{
+ RaisePreExecuteEvent(request);
command.ExecuteNonQuery();
}
else if (_statement is Procedure && (_statement.ResultClass != null) &&
@@ -773,6 +778,7 @@
returnValueParameter.Direction = ParameterDirection.ReturnValue;
command.Parameters.Add(returnValueParameter);
+ RaisePreExecuteEvent(request);
command.ExecuteNonQuery ( );
generatedKey = returnValueParameter.Value;
@@ -782,6 +788,7 @@
else
{
+ RaisePreExecuteEvent(request);
generatedKey = command.ExecuteScalar();
if ( (_statement.ResultClass!=null) &&
_sqlMap.TypeHandlerFactory.IsSimpleType(_statement.ResultClass) )
@@ -806,13 +813,22 @@
RetrieveOutputParameters(request, session, command, parameterObject);
}
- RaiseExecuteEvent();
+ RaiseExecuteEvent(request);
return generatedKey;
}
#endregion
+ public DataTable ExecuteQueryForDataTable(IDalSession session, object parameterObject)
+ {
+ RequestScope request = _statement.Sql.GetRequestScope(this, parameterObject, session);
+
+ _preparedCommand.Create(request, session, this.Statement, parameterObject);
+
+ return RunQueryForDataTable(request, session, parameterObject);
+ }
+
#region ExecuteQueryForMap
/// <summary>
@@ -900,6 +916,23 @@
}
+ public DataTable RunQueryForDataTable(RequestScope request, IDalSession session, object parameterObject)
+ {
+ DataTable dataTable = null;
+
+ using (IDbCommand command = request.IDbCommand)
+ {
+ using (IDataReader reader = command.ExecuteReader())
+ {
+ while (reader.Read() )
+ {
+ dataTable = (DataTable)_resultStrategy.Process(request, reader, dataTable);
+ }
+ }
+ }
+
+ return dataTable;
+ }
#endregion
@@ -917,19 +950,28 @@
PostSelectStrategyFactory.Get(postSelect.Method).Execute(postSelect, request);
}
}
-
/// <summary>
/// Raise an event ExecuteEventArgs
/// (Used when a query is executed)
/// </summary>
- private void RaiseExecuteEvent()
+ private void RaisePreExecuteEvent(RequestScope requestScope)
+ {
+ if (PreExecute != null)
+ {
+ PreExecute(this, new ExecuteEventArgs(requestScope));
+ }
+ }
+
+ /// <summary>
+ /// Raise an event ExecuteEventArgs
+ /// (Used when a query is executed)
+ /// </summary>
+ private void RaiseExecuteEvent(RequestScope requestScope)
{
- ExecuteEventArgs e = new ExecuteEventArgs();
- e.StatementName = _statement.Id;
if (Execute != null)
{
- Execute(this, e);
+ Execute(this, new ExecuteEventArgs(requestScope));
}
}
@@ -950,6 +992,5 @@
#endregion
-
}
}
Modified: ibatis/branches/IBatisNet.DataMapper-QueryForDataTable/MappedStatements/PropertStrategy/PropertyStrategyFactory.cs
URL: http://svn.apache.org/viewvc/ibatis/branches/IBatisNet.DataMapper-QueryForDataTable/MappedStatements/PropertStrategy/PropertyStrategyFactory.cs?rev=422475&r1=422474&r2=422475&view=diff
==============================================================================
--- ibatis/branches/IBatisNet.DataMapper-QueryForDataTable/MappedStatements/PropertStrategy/PropertyStrategyFactory.cs (original)
+++ ibatis/branches/IBatisNet.DataMapper-QueryForDataTable/MappedStatements/PropertStrategy/PropertyStrategyFactory.cs Sun Jul 16 09:58:24 2006
@@ -39,6 +39,7 @@
private static IPropertyStrategy _selectGenericListStrategy = null;
private static IPropertyStrategy _selectListStrategy = null;
private static IPropertyStrategy _selectObjectStrategy = null;
+ private static IPropertyStrategy _selectDataTableStrategy = null;
/// <summary>
/// Initializes the <see cref="PropertyStrategyFactory"/> class.
@@ -51,6 +52,7 @@
_selectArrayStrategy = new SelectArrayStrategy();
_selectListStrategy = new SelectListStrategy();
_selectObjectStrategy = new SelectObjectStrategy();
+ _selectDataTableStrategy = new SelectDataTableStrategy();
#if dotnet2
_selectGenericListStrategy = new SelectGenericListStrategy();
#endif
@@ -79,7 +81,8 @@
_selectArrayStrategy,
_selectGenericListStrategy,
_selectListStrategy,
- _selectObjectStrategy);
+ _selectObjectStrategy,
+ _selectDataTableStrategy);
}
}
}
Added: ibatis/branches/IBatisNet.DataMapper-QueryForDataTable/MappedStatements/PropertStrategy/SelectDataTableStrategy.cs
URL: http://svn.apache.org/viewvc/ibatis/branches/IBatisNet.DataMapper-QueryForDataTable/MappedStatements/PropertStrategy/SelectDataTableStrategy.cs?rev=422475&view=auto
==============================================================================
--- ibatis/branches/IBatisNet.DataMapper-QueryForDataTable/MappedStatements/PropertStrategy/SelectDataTableStrategy.cs (added)
+++ ibatis/branches/IBatisNet.DataMapper-QueryForDataTable/MappedStatements/PropertStrategy/SelectDataTableStrategy.cs Sun Jul 16 09:58:24 2006
@@ -0,0 +1,73 @@
+#region Apache Notice
+/*****************************************************************************
+ * $Revision: 374175 $
+ * $LastChangedDate: 2006-04-25 19:40:27 +0200 (mar., 25 avr. 2006) $
+ * $LastChangedBy: gbayon $
+ *
+ * iBATIS.NET Data Mapper
+ * Copyright (C) 2006/2005 - The Apache Software Foundation
+ *
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ********************************************************************************/
+#endregion
+
+using System;
+using System.Collections;
+using System.Data;
+using IBatisNet.DataMapper.Configuration.ResultMapping;
+using IBatisNet.DataMapper.Scope;
+
+namespace IBatisNet.DataMapper.MappedStatements.PropertyStrategy
+{
+ /// <summary>
+ /// <see cref="IPropertyStrategy"/> implementation when a 'select' attribute exists
+ /// on an <see cref="ResultProperty"/> and the object property is
+ /// different from an <see cref="Array"/> or an <see cref="IList"/>.
+ /// </summary>
+ public sealed class SelectDataTableStrategy : IPropertyStrategy
+ {
+
+ #region IPropertyStrategy members
+
+ ///<summary>
+ /// Sets value of the specified <see cref="ResultProperty"/> on the target object
+ /// when a 'select' attribute exists and fills an object property.
+ /// on the <see cref="ResultProperty"/> are empties.
+ /// </summary>
+ /// <param name="request">The request.</param>
+ /// <param name="resultMap">The result map.</param>
+ /// <param name="mapping">The ResultProperty.</param>
+ /// <param name="target">The target.</param>
+ /// <param name="reader">The current <see cref="IDataReader"/></param>
+ /// <param name="keys">The keys</param>
+ public void Set(RequestScope request, ResultMap resultMap,
+ ResultProperty mapping, ref object target, IDataReader reader, object keys)
+ {
+ // Get the select statement
+ IMappedStatement selectStatement = request.MappedStatement.SqlMap.GetMappedStatement(mapping.Select);
+
+ PostBindind postSelect = new PostBindind();
+ postSelect.Statement = selectStatement;
+ postSelect.Keys = keys;
+ postSelect.Target = target;
+ postSelect.ResultProperty = mapping;
+
+ postSelect.Method = PostBindind.ExecuteMethod.ExecuteQueryForObject;
+ request.QueueSelect.Enqueue(postSelect);
+ }
+
+ #endregion
+ }
+}
Modified: ibatis/branches/IBatisNet.DataMapper-QueryForDataTable/MappedStatements/PropertStrategy/SelectStrategy.cs
URL: http://svn.apache.org/viewvc/ibatis/branches/IBatisNet.DataMapper-QueryForDataTable/MappedStatements/PropertStrategy/SelectStrategy.cs?rev=422475&r1=422474&r2=422475&view=diff
==============================================================================
--- ibatis/branches/IBatisNet.DataMapper-QueryForDataTable/MappedStatements/PropertStrategy/SelectStrategy.cs (original)
+++ ibatis/branches/IBatisNet.DataMapper-QueryForDataTable/MappedStatements/PropertStrategy/SelectStrategy.cs Sun Jul 16 09:58:24 2006
@@ -57,12 +57,13 @@
IPropertyStrategy selectArrayStrategy,
IPropertyStrategy selectGenericListStrategy,
IPropertyStrategy selectListStrategy,
- IPropertyStrategy selectObjectStrategy)
+ IPropertyStrategy selectObjectStrategy,
+ IPropertyStrategy selectDataTableStrategy)
{
// Collection object or .NET object
if (mapping.SetAccessor.MemberType.BaseType == typeof(Array))
{
- _selectStrategy = selectArrayStrategy;
+ _selectStrategy = selectArrayStrategy;
}
#if dotnet2
else if (mapping.SetAccessor.MemberType.IsGenericType &&
@@ -71,16 +72,19 @@
_selectStrategy = selectGenericListStrategy;
}
#endif
- // Check if the object to Map implement 'IList' or is IList type
- // If yes the ResultProperty is map to a IList object
- else if (typeof(IList).IsAssignableFrom(mapping.SetAccessor.MemberType))
+ // Check if the object to Map implement 'IList' or is IList type
+ // If yes the ResultProperty is map to a IList object
+ else if (typeof(IList).IsAssignableFrom(mapping.SetAccessor.MemberType))
{
- _selectStrategy = selectListStrategy;
+ _selectStrategy = selectListStrategy;
+ }
+ else if (typeof(DataTable).IsAssignableFrom(mapping.SetAccessor.MemberType))
+ {
+ _selectStrategy = selectDataTableStrategy;
}
-
else // The ResultProperty is map to a .Net object
{
- _selectStrategy = selectObjectStrategy;
+ _selectStrategy = selectObjectStrategy;
}
}
Added: ibatis/branches/IBatisNet.DataMapper-QueryForDataTable/MappedStatements/ResultStrategy/DataTableStrategy.cs
URL: http://svn.apache.org/viewvc/ibatis/branches/IBatisNet.DataMapper-QueryForDataTable/MappedStatements/ResultStrategy/DataTableStrategy.cs?rev=422475&view=auto
==============================================================================
--- ibatis/branches/IBatisNet.DataMapper-QueryForDataTable/MappedStatements/ResultStrategy/DataTableStrategy.cs (added)
+++ ibatis/branches/IBatisNet.DataMapper-QueryForDataTable/MappedStatements/ResultStrategy/DataTableStrategy.cs Sun Jul 16 09:58:24 2006
@@ -0,0 +1,82 @@
+#region Apache Notice
+/*****************************************************************************
+ * $Revision: 374175 $
+ * $LastChangedDate: 2006-04-25 19:40:27 +0200 (mar., 25 avr. 2006) $
+ * $LastChangedBy: gbayon $
+ *
+ * iBATIS.NET Data Mapper
+ * Copyright (C) 2006/2005 - The Apache Software Foundation
+ *
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ********************************************************************************/
+#endregion
+
+using System.Collections;
+using System.Data;
+using IBatisNet.DataMapper.Configuration.ResultMapping;
+using IBatisNet.DataMapper.Scope;
+
+namespace IBatisNet.DataMapper.MappedStatements.ResultStrategy
+{
+ /// <summary>
+ /// <see cref="IResultStrategy"/> implementation when
+ /// a 'resultClass' attribute is specified and
+ /// the type of the result object is <see cref="IDictionary"/>.
+ /// </summary>
+ public sealed class DataTableStrategy : IResultStrategy
+ {
+ #region IResultStrategy Members
+
+ /// <summary>
+ /// Processes the specified <see cref="IDataReader"/>
+ /// when a 'resultClass' attribute is specified on the statement and
+ /// the 'resultClass' attribute is a <see cref="DataTable"/>.
+ /// </summary>
+ /// <param name="request">The request.</param>
+ /// <param name="reader">The reader.</param>
+ /// <param name="resultObject">The result object.</param>
+ public object Process(RequestScope request, IDataReader reader, object resultObject)
+ {
+ object outObject = resultObject;
+
+ if (outObject == null)
+ {
+ outObject = new DataTable(request.Statement.Id);
+
+ DataTable dataColumn = reader.GetSchemaTable();
+ for (int i = 0; i < dataColumn.Rows.Count; i++)
+ {
+ ((DataTable) outObject).Columns.Add(dataColumn.Rows[i][0].ToString());
+ }
+ }
+
+ DataRow dataRow = ((DataTable) outObject).NewRow();
+ int count = reader.FieldCount;
+ for (int i = 0; i < count; i++)
+ {
+ ResultProperty property = new ResultProperty();
+ property.PropertyName = "value";
+ property.ColumnIndex = i;
+ property.TypeHandler = request.DataExchangeFactory.TypeHandlerFactory.GetTypeHandler(reader.GetFieldType(i));
+ dataRow[i] = property.GetDataBaseValue(reader);
+ }
+ ((DataTable) outObject).Rows.Add(dataRow);
+
+ return outObject;
+ }
+
+ #endregion
+ }
+}
\ No newline at end of file
Modified: ibatis/branches/IBatisNet.DataMapper-QueryForDataTable/MappedStatements/ResultStrategy/ResultClassStrategy.cs
URL: http://svn.apache.org/viewvc/ibatis/branches/IBatisNet.DataMapper-QueryForDataTable/MappedStatements/ResultStrategy/ResultClassStrategy.cs?rev=422475&r1=422474&r2=422475&view=diff
==============================================================================
--- ibatis/branches/IBatisNet.DataMapper-QueryForDataTable/MappedStatements/ResultStrategy/ResultClassStrategy.cs (original)
+++ ibatis/branches/IBatisNet.DataMapper-QueryForDataTable/MappedStatements/ResultStrategy/ResultClassStrategy.cs Sun Jul 16 09:58:24 2006
@@ -38,6 +38,7 @@
private static IResultStrategy _simpleTypeStrategy = null;
private static IResultStrategy _dictionaryStrategy = null;
private static IResultStrategy _listStrategy = null;
+ private static IResultStrategy _dataTableStrategy = null;
private static IResultStrategy _autoMapStrategy = null;
/// <summary>
@@ -48,6 +49,7 @@
_simpleTypeStrategy = new SimpleTypeStrategy();
_dictionaryStrategy = new DictionaryStrategy();
_listStrategy = new ListStrategy();
+ _dataTableStrategy = new DataTableStrategy();
_autoMapStrategy = new AutoMapStrategy();
}
@@ -66,13 +68,17 @@
{
return _simpleTypeStrategy.Process(request, reader, resultObject);
}
- else if (typeof(IDictionary).IsAssignableFrom(request.Statement.ResultClass))
+ else if (typeof(IDictionary).IsAssignableFrom(request.Statement.ResultClass))
{
return _dictionaryStrategy.Process(request, reader, resultObject);
}
- else if (typeof(IList).IsAssignableFrom(request.Statement.ResultClass))
+ else if (typeof(IList).IsAssignableFrom(request.Statement.ResultClass))
{
return _listStrategy.Process(request, reader, resultObject);
+ }
+ else if (typeof(DataTable).IsAssignableFrom(request.Statement.ResultClass))
+ {
+ return _dataTableStrategy.Process(request, reader, resultObject);
}
else
{
Modified: ibatis/branches/IBatisNet.DataMapper-QueryForDataTable/SqlMapper.cs
URL: http://svn.apache.org/viewvc/ibatis/branches/IBatisNet.DataMapper-QueryForDataTable/SqlMapper.cs?rev=422475&r1=422474&r2=422475&view=diff
==============================================================================
--- ibatis/branches/IBatisNet.DataMapper-QueryForDataTable/SqlMapper.cs (original)
+++ ibatis/branches/IBatisNet.DataMapper-QueryForDataTable/SqlMapper.cs Sun Jul 16 09:58:24 2006
@@ -53,6 +53,7 @@
namespace IBatisNet.DataMapper
{
+
/// <summary>
/// Summary description for SqlMap.
/// </summary>
@@ -611,7 +612,41 @@
}
#endregion
-
+
+ public DataTable QueryForDataTable(string statementName, object parameterObject)
+ {
+ bool isSessionLocal = false;
+ IDalSession session = _sessionHolder.LocalSession;
+ DataTable dataTable = null;
+
+ if (session == null)
+ {
+ session = new SqlMapSession(this);
+ session.OpenConnection();
+ isSessionLocal = true;
+ }
+
+ try
+ {
+ IMappedStatement statement = GetMappedStatement(statementName);
+ dataTable = statement.ExecuteQueryForDataTable(session, parameterObject);
+ }
+ catch
+ {
+ throw;
+ }
+ finally
+ {
+ if ( isSessionLocal )
+ {
+ session.CloseConnection();
+ }
+ }
+
+ return dataTable;
+
+ }
+
#region QueryForObject
/// <summary>
@@ -626,22 +661,24 @@
/// <returns> The single result object populated with the result set data.</returns>
public object QueryForObject(string statementName, object parameterObject)
{
- bool isSessionLocal = false;
+ bool isSessionLocal = true;
+
+ IMappedStatement statement = GetMappedStatement(statementName);
+
IDalSession session = _sessionHolder.LocalSession;
- object result;
-
if (session == null)
{
- session = new SqlMapSession(this);
- session.OpenConnection();
isSessionLocal = true;
+ session = new SqlMapSession(this);
+
+ // delay calling OpenConnection
+ statement.PreExecute += new ExecuteEventHandler(statement_PreExecute);
}
- try
+ try
{
- IMappedStatement statement = GetMappedStatement(statementName);
- result = statement.ExecuteQueryForObject(session, parameterObject);
- }
+ return statement.ExecuteQueryForObject(session, parameterObject);
+ }
catch
{
throw;
@@ -653,8 +690,6 @@
session.CloseConnection();
}
}
-
- return result;
}
/// <summary>
@@ -1653,5 +1688,11 @@
#endregion
#endregion
+
+ private void statement_PreExecute(object sender, ExecuteEventArgs e)
+ {
+ e.RequestScope.Session.OpenConnection();
+ e.RequestScope.IDbCommand.Connection = e.RequestScope.Session.Connection;
+ }
}
}