Author: gbayon
Date: Wed Jun 11 11:40:13 2008
New Revision: 666779

URL: http://svn.apache.org/viewvc?rev=666779&view=rev
Log:
Fix IBATISNET-272

Added:
    
ibatis/trunk/cs/V3/src/Apache.Ibatis.DataMapper/MappedStatements/ResultStrategy/DataTableStrategy.cs
   (with props)
Modified:
    
ibatis/trunk/cs/V3/src/Apache.Ibatis.Common/Utilities/TypesResolver/TypeRegistry.cs
    
ibatis/trunk/cs/V3/src/Apache.Ibatis.DataMapper.SqlClient.Test.2005/Fixtures/Mapping/StatementTest.cs
    
ibatis/trunk/cs/V3/src/Apache.Ibatis.DataMapper.SqlClient.Test.2005/Maps/Account.xml
    
ibatis/trunk/cs/V3/src/Apache.Ibatis.DataMapper/Apache.Ibatis.DataMapper.20005.csproj
    ibatis/trunk/cs/V3/src/Apache.Ibatis.DataMapper/DataMapper.cs
    ibatis/trunk/cs/V3/src/Apache.Ibatis.DataMapper/IDataMapper.cs
    
ibatis/trunk/cs/V3/src/Apache.Ibatis.DataMapper/MappedStatements/CachingStatement.cs
    
ibatis/trunk/cs/V3/src/Apache.Ibatis.DataMapper/MappedStatements/IMappedStatement.cs
    
ibatis/trunk/cs/V3/src/Apache.Ibatis.DataMapper/MappedStatements/MappedStatement.cs
    
ibatis/trunk/cs/V3/src/Apache.Ibatis.DataMapper/MappedStatements/ResultStrategy/MapStrategy.cs
    
ibatis/trunk/cs/V3/src/Apache.Ibatis.DataMapper/MappedStatements/ResultStrategy/ResultClassStrategy.cs
    
ibatis/trunk/cs/V3/src/Apache.Ibatis.DataMapper/Model/ResultMapping/ResultProperty.cs
    
ibatis/trunk/cs/V3/src/Apache.Ibatis.DataMapper/TypeHandlers/TypeHandlerFactory.cs

Modified: 
ibatis/trunk/cs/V3/src/Apache.Ibatis.Common/Utilities/TypesResolver/TypeRegistry.cs
URL: 
http://svn.apache.org/viewvc/ibatis/trunk/cs/V3/src/Apache.Ibatis.Common/Utilities/TypesResolver/TypeRegistry.cs?rev=666779&r1=666778&r2=666779&view=diff
==============================================================================
--- 
ibatis/trunk/cs/V3/src/Apache.Ibatis.Common/Utilities/TypesResolver/TypeRegistry.cs
 (original)
+++ 
ibatis/trunk/cs/V3/src/Apache.Ibatis.Common/Utilities/TypesResolver/TypeRegistry.cs
 Wed Jun 11 11:40:13 2008
@@ -30,6 +30,7 @@
 using System.Collections;
 using System.Collections.Specialized;
 using System.Collections.Generic;
+using System.Data;
 
 #endregion
 
@@ -129,6 +130,15 @@
                /// </summary>
                public const string HashtableAlias3 = "hashmap";
 
+        /// <summary>
+        /// The alias around the 'DataTable' type.
+        /// </summary>
+        public const string DataTableAlias1 = "datatable";
+        /// <summary>
+        /// Another alias around the 'DataTable' type.
+        /// </summary>
+        public const string DataTableAlias2 = "data";
+
                /// <summary>
                /// The alias around the 'short' type.
                /// </summary>
@@ -316,7 +326,7 @@
                #endregion
 
                #region Fields
-        private static IDictionary<string, Type> _types = new 
Dictionary<string, Type>();
+        private static readonly IDictionary<string, Type> types = new 
Dictionary<string, Type>();
                #endregion
 
                #region Constructor (s) / Destructor
@@ -338,89 +348,92 @@
         static TypeRegistry()
                {
                        // Initialize a dictionary with some fully qualifiaed 
name 
-                       _types[ArrayListAlias1] = typeof (ArrayList);
-                       _types[ArrayListAlias2] = typeof (ArrayList);
+            types[DataTableAlias1] = typeof(DataTable);
+            types[DataTableAlias2] = typeof(DataTable);
+
+                       types[ArrayListAlias1] = typeof (ArrayList);
+                       types[ArrayListAlias2] = typeof (ArrayList);
 
-                       _types[BoolAlias] = typeof (bool);
-                       _types[BooleanAlias] = typeof (bool);
+                       types[BoolAlias] = typeof (bool);
+                       types[BooleanAlias] = typeof (bool);
 
-                       _types[ByteAlias] = typeof (byte);
+                       types[ByteAlias] = typeof (byte);
 
-                       _types[CharAlias] = typeof (char);
+                       types[CharAlias] = typeof (char);
 
-                       _types[DateAlias1] = typeof (DateTime);
-                       _types[DateAlias2] = typeof (DateTime);
+                       types[DateAlias1] = typeof (DateTime);
+                       types[DateAlias2] = typeof (DateTime);
 
-                       _types[DecimalAlias] = typeof (decimal);
+                       types[DecimalAlias] = typeof (decimal);
 
-                       _types[DoubleAlias] = typeof (double);
+                       types[DoubleAlias] = typeof (double);
 
-                       _types[FloatAlias] = typeof (float);
-                       _types[SingleAlias] = typeof (float);
+                       types[FloatAlias] = typeof (float);
+                       types[SingleAlias] = typeof (float);
 
-                       _types[GuidAlias] = typeof (Guid);
+                       types[GuidAlias] = typeof (Guid);
 
-                       _types[HashtableAlias1] = typeof (Hashtable);
-                       _types[HashtableAlias2] = typeof (Hashtable);
-                       _types[HashtableAlias3] = typeof (Hashtable);
+                       types[HashtableAlias1] = typeof (Hashtable);
+                       types[HashtableAlias2] = typeof (Hashtable);
+                       types[HashtableAlias3] = typeof (Hashtable);
 
-                       _types[Int16Alias1] = typeof (short);
-                       _types[Int16Alias2] = typeof (short);
+                       types[Int16Alias1] = typeof (short);
+                       types[Int16Alias2] = typeof (short);
 
-                       _types[Int32Alias1] = typeof (int);
-                       _types[Int32Alias2] = typeof (int);
-                       _types[Int32Alias3] = typeof (int);
+                       types[Int32Alias1] = typeof (int);
+                       types[Int32Alias2] = typeof (int);
+                       types[Int32Alias3] = typeof (int);
 
-                       _types[Int64Alias1] = typeof (long);
-                       _types[Int64Alias2] = typeof (long);
+                       types[Int64Alias1] = typeof (long);
+                       types[Int64Alias2] = typeof (long);
 
-                       _types[UInt16Alias1] = typeof (ushort);
-                       _types[UInt16Alias2] = typeof (ushort);
+                       types[UInt16Alias1] = typeof (ushort);
+                       types[UInt16Alias2] = typeof (ushort);
 
-                       _types[UInt32Alias1] = typeof (uint);
-                       _types[UInt32Alias2] = typeof (uint);
+                       types[UInt32Alias1] = typeof (uint);
+                       types[UInt32Alias2] = typeof (uint);
 
-                       _types[UInt64Alias1] = typeof (ulong);
-                       _types[UInt64Alias2] = typeof (ulong);
+                       types[UInt64Alias1] = typeof (ulong);
+                       types[UInt64Alias2] = typeof (ulong);
 
-                       _types[SByteAlias] = typeof (sbyte);
+                       types[SByteAlias] = typeof (sbyte);
 
-                       _types[StringAlias] = typeof (string);
+                       types[StringAlias] = typeof (string);
 
-                       _types[TimeSpanAlias] = typeof (string);
+                       types[TimeSpanAlias] = typeof (string);
 
-            _types[NullableInt32Alias] = typeof(int?);
-            _types[NullableInt32ArrayAlias] = typeof(int?[]);
+            types[NullableInt32Alias] = typeof(int?);
+            types[NullableInt32ArrayAlias] = typeof(int?[]);
 
-            _types[NullableDecimalAlias] = typeof(decimal?);
-            _types[NullableDecimalArrayAlias] = typeof(decimal?[]);
+            types[NullableDecimalAlias] = typeof(decimal?);
+            types[NullableDecimalArrayAlias] = typeof(decimal?[]);
 
-            _types[NullableCharAlias] = typeof(char?);
-            _types[NullableCharArrayAlias] = typeof(char?[]);
+            types[NullableCharAlias] = typeof(char?);
+            types[NullableCharArrayAlias] = typeof(char?[]);
 
-            _types[NullableInt64Alias] = typeof(long?);
-            _types[NullableInt64ArrayAlias] = typeof(long?[]);
+            types[NullableInt64Alias] = typeof(long?);
+            types[NullableInt64ArrayAlias] = typeof(long?[]);
 
-            _types[NullableInt16Alias] = typeof(short?);
-            _types[NullableInt16ArrayAlias] = typeof(short?[]);
+            types[NullableInt16Alias] = typeof(short?);
+            types[NullableInt16ArrayAlias] = typeof(short?[]);
 
-            _types[NullableUInt32Alias] = typeof(uint?);
-            _types[NullableUInt32ArrayAlias] = typeof(uint?[]);
+            types[NullableUInt32Alias] = typeof(uint?);
+            types[NullableUInt32ArrayAlias] = typeof(uint?[]);
 
-            _types[NullableUInt64Alias] = typeof(ulong?);
-            _types[NullableUInt64ArrayAlias] = typeof(ulong?[]);
+            types[NullableUInt64Alias] = typeof(ulong?);
+            types[NullableUInt64ArrayAlias] = typeof(ulong?[]);
 
-            _types[NullableUInt16Alias] = typeof(ushort?);
-            _types[NullableUInt16ArrayAlias] = typeof(ushort?[]);
+            types[NullableUInt16Alias] = typeof(ushort?);
+            types[NullableUInt16ArrayAlias] = typeof(ushort?[]);
 
-            _types[NullableDoubleAlias] = typeof(double?);
-            _types[NullableDoubleArrayAlias] = typeof(double?[]);
+            types[NullableDoubleAlias] = typeof(double?);
+            types[NullableDoubleArrayAlias] = typeof(double?[]);
 
-            _types[NullableFloatAlias] = typeof(float?);
-            _types[NullableFloatArrayAlias] = typeof(float?[]);
+            types[NullableFloatAlias] = typeof(float?);
+            types[NullableFloatArrayAlias] = typeof(float?[]);
 
-            _types[NullableBoolAlias] = typeof(bool?);
-            _types[NullableBoolArrayAlias] = typeof(bool?[]);
+            types[NullableBoolAlias] = typeof(bool?);
+            types[NullableBoolArrayAlias] = typeof(bool?[]);
 
         }
                #endregion
@@ -446,7 +459,7 @@
         public static Type ResolveType(string alias)
         {
             Type type = null;
-            _types.TryGetValue(alias.ToLower(), out type);
+            types.TryGetValue(alias.ToLower(), out type);
             return type;
         }
 

Modified: 
ibatis/trunk/cs/V3/src/Apache.Ibatis.DataMapper.SqlClient.Test.2005/Fixtures/Mapping/StatementTest.cs
URL: 
http://svn.apache.org/viewvc/ibatis/trunk/cs/V3/src/Apache.Ibatis.DataMapper.SqlClient.Test.2005/Fixtures/Mapping/StatementTest.cs?rev=666779&r1=666778&r2=666779&view=diff
==============================================================================
--- 
ibatis/trunk/cs/V3/src/Apache.Ibatis.DataMapper.SqlClient.Test.2005/Fixtures/Mapping/StatementTest.cs
 (original)
+++ 
ibatis/trunk/cs/V3/src/Apache.Ibatis.DataMapper.SqlClient.Test.2005/Fixtures/Mapping/StatementTest.cs
 Wed Jun 11 11:40:13 2008
@@ -1,5 +1,6 @@
 using System;
 using System.Collections;
+using System.Data;
 using Apache.Ibatis.Common.Exceptions;
 using Apache.Ibatis.Common.Utilities;
 using Apache.Ibatis.DataMapper.Model;
@@ -7,6 +8,7 @@
 using Apache.Ibatis.DataMapper.SqlClient.Test.Domain;
 using Apache.Ibatis.DataMapper.SqlClient.Test.Fixtures;
 using NUnit.Framework;
+using NUnit.Framework.SyntaxHelpers;
 
 namespace Apache.Ibatis.DataMapper.SqlClient.Test.Fixtures.Mapping
 {
@@ -43,6 +45,60 @@
 
         #region Object Query tests
 
+
+        [Test]
+        public void QueryForDatatable_with_resulclass_should_work()
+        {
+            DataTable dataTable = 
dataMapper.QueryForDataTable("SimpleAccountDataTable", 1);
+
+            DataRow[] currentRows = dataTable.Select(null, null, 
DataViewRowState.CurrentRows);
+
+            //if (currentRows.Length < 1)
+            //    Console.WriteLine("No Current Rows Found");
+            //else
+            //{
+            //    foreach (DataColumn column in dataTable.Columns)
+            //        Console.Write("\t{0}", column.ColumnName);
+
+            //    Console.WriteLine("\tRowState");
+
+            //    foreach (DataRow row in currentRows)
+            //    {
+            //        foreach (DataColumn column in dataTable.Columns)
+            //            Console.Write("\t{0}", row[column]);
+
+            //        Console.WriteLine("\t" + row.RowState);
+            //    }
+            //}
+
+
+            Assert.That(dataTable, Is.Not.Null);
+            Assert.That(currentRows.Length, Is.GreaterThan(0));
+            Assert.That(dataTable.Columns[0].ColumnName, 
Is.EqualTo("Account_ID"));
+            Assert.That(dataTable.Columns[1].ColumnName, 
Is.EqualTo("Account_FirstName"));
+            Assert.That(currentRows[0][0], Is.EqualTo(1));
+            Assert.That(currentRows[0][1], Is.EqualTo("Joe"));
+        }
+
+        [Test]
+        public void QueryForDatatable_with_resulmap_should_work()
+        {
+            DataTable dataTable = 
dataMapper.QueryForDataTable("SimpleAccountDataTableViaResultMap", 1);
+
+            DataRow[] currentRows = dataTable.Select(null, null, 
DataViewRowState.CurrentRows);
+
+            Assert.That(dataTable, Is.Not.Null);
+            Assert.That(currentRows.Length, Is.GreaterThan(0));
+            Assert.That(dataTable.Columns[0].ColumnName, Is.EqualTo("Id"));
+            Assert.That(dataTable.Columns[0].DataType, 
Is.EqualTo(typeof(int)));
+
+            Assert.That(dataTable.Columns[1].ColumnName, 
Is.EqualTo("FirstName"));
+            Assert.That(dataTable.Columns[1].DataType, 
Is.EqualTo(typeof(string)));
+
+            Assert.That(currentRows[0][0], Is.EqualTo(1));
+            Assert.That(currentRows[0][1], Is.EqualTo("Joe"));
+        }
+
         [Test]
         public void Statement_with_SqlSource_should_work()
         {

Modified: 
ibatis/trunk/cs/V3/src/Apache.Ibatis.DataMapper.SqlClient.Test.2005/Maps/Account.xml
URL: 
http://svn.apache.org/viewvc/ibatis/trunk/cs/V3/src/Apache.Ibatis.DataMapper.SqlClient.Test.2005/Maps/Account.xml?rev=666779&r1=666778&r2=666779&view=diff
==============================================================================
--- 
ibatis/trunk/cs/V3/src/Apache.Ibatis.DataMapper.SqlClient.Test.2005/Maps/Account.xml
 (original)
+++ 
ibatis/trunk/cs/V3/src/Apache.Ibatis.DataMapper.SqlClient.Test.2005/Maps/Account.xml
 Wed Jun 11 11:40:13 2008
@@ -30,6 +30,11 @@
   </cacheModels>
        
        <resultMaps>
+
+    <resultMap id="Account-result-DataTable" class="dataTable">
+      <result property="Id"           column="Account_ID"/>
+      <result property="FirstName"    column="Account_FirstName"/>
+    </resultMap>
     
     <resultMap id="Category-result" class="Category2">
       <result property="Id" column="Category_ID"/>
@@ -140,6 +145,17 @@
     -->
   <statements>
 
+    <!-- Query for DataTable -->
+    <select id="SimpleAccountDataTableViaResultMap" parameterClass="int" 
resultMap="Account-result-DataTable">
+      select *
+      from Accounts
+    </select>
+
+    <select id="SimpleAccountDataTable" parameterClass="int" 
resultClass="data">
+      select *
+      from Accounts
+    </select>
+    
     <!-- external sql source -->
     <select id="SimpleSqlSource" sqlSource="SimpleSqlSource" 
resultMap="account-result"/>
     <select id="SqlSourceWithParameter" parameterClass="Integer" 
sqlSource="SqlSourceWithParameter" resultMap="account-result"/>

Modified: 
ibatis/trunk/cs/V3/src/Apache.Ibatis.DataMapper/Apache.Ibatis.DataMapper.20005.csproj
URL: 
http://svn.apache.org/viewvc/ibatis/trunk/cs/V3/src/Apache.Ibatis.DataMapper/Apache.Ibatis.DataMapper.20005.csproj?rev=666779&r1=666778&r2=666779&view=diff
==============================================================================
--- 
ibatis/trunk/cs/V3/src/Apache.Ibatis.DataMapper/Apache.Ibatis.DataMapper.20005.csproj
 (original)
+++ 
ibatis/trunk/cs/V3/src/Apache.Ibatis.DataMapper/Apache.Ibatis.DataMapper.20005.csproj
 Wed Jun 11 11:40:13 2008
@@ -120,6 +120,7 @@
     <Compile Include="Configuration\Module\ResultMapModuleBuilder.cs" />
     <Compile Include="Configuration\Module\TypeAliasModuleBuilder.cs" />
     <Compile Include="Configuration\Module\TypeHandlerModuleBuilder.cs" />
+    <Compile Include="MappedStatements\ResultStrategy\DataTableStrategy.cs" />
     <Compile Include="Session\DataMapperLocalSessionScope.cs" />
     <Compile Include="IMapperFactory.cs" />
     <Compile 
Include="Configuration\Interpreters\Config\AbstractInterpreter.cs" />

Modified: ibatis/trunk/cs/V3/src/Apache.Ibatis.DataMapper/DataMapper.cs
URL: 
http://svn.apache.org/viewvc/ibatis/trunk/cs/V3/src/Apache.Ibatis.DataMapper/DataMapper.cs?rev=666779&r1=666778&r2=666779&view=diff
==============================================================================
--- ibatis/trunk/cs/V3/src/Apache.Ibatis.DataMapper/DataMapper.cs (original)
+++ ibatis/trunk/cs/V3/src/Apache.Ibatis.DataMapper/DataMapper.cs Wed Jun 11 
11:40:13 2008
@@ -26,7 +26,7 @@
 
 using System.Collections;
 using System.Collections.Generic;
-
+using System.Data;
 using Apache.Ibatis.Common.Contracts;
 using Apache.Ibatis.DataMapper.Session;
 using Apache.Ibatis.DataMapper.Model;
@@ -486,6 +486,22 @@
             return Update(statementId, parameterObject);
         }
 
+        /// <summary>
+        /// Executes a SQL SELECT statement that returns  data
+        /// to populate a DataTable.
+        /// If a resultMap is specified, the column name will be the result 
property name.
+        /// </summary>
+        /// <param name="statementId">The statement id.</param>
+        /// <param name="parameterObject">The parameter object.</param>
+        /// <returns>A DataTable</returns>
+        public DataTable QueryForDataTable(string statementId, object 
parameterObject)
+        {
+            using (DataMapperLocalSessionScope sessionScope = new 
DataMapperLocalSessionScope(sessionStore, sessionFactory))
+            {
+                IMappedStatement statement = 
modelStore.GetMappedStatement(statementId);
+                return 
statement.ExecuteQueryForDataTable(sessionScope.Session, parameterObject);
+            }
+        }
         #endregion
 
         #region IModelStoreAccessor Members

Modified: ibatis/trunk/cs/V3/src/Apache.Ibatis.DataMapper/IDataMapper.cs
URL: 
http://svn.apache.org/viewvc/ibatis/trunk/cs/V3/src/Apache.Ibatis.DataMapper/IDataMapper.cs?rev=666779&r1=666778&r2=666779&view=diff
==============================================================================
--- ibatis/trunk/cs/V3/src/Apache.Ibatis.DataMapper/IDataMapper.cs (original)
+++ ibatis/trunk/cs/V3/src/Apache.Ibatis.DataMapper/IDataMapper.cs Wed Jun 11 
11:40:13 2008
@@ -25,6 +25,7 @@
 
 using System.Collections;
 using System.Collections.Generic;
+using System.Data;
 using Apache.Ibatis.DataMapper.Exceptions;
 
 namespace Apache.Ibatis.DataMapper
@@ -295,6 +296,15 @@
         /// <param name="rowDelegate"></param>
         /// <returns>A List of result objects.</returns>
         IList<T> QueryWithRowDelegate<T>(string statementName, object 
parameterObject, RowDelegate<T> rowDelegate);
-  
+
+        /// <summary>
+        /// Executes a SQL SELECT statement that returns  data 
+        /// to populate a DataTable.
+        /// If a resultMap is specified, the column name will be the result 
property name.
+        /// </summary>
+        /// <param name="statementId">The statement id.</param>
+        /// <param name="parameterObject">The parameter object.</param>
+        /// <returns>A DataTable</returns>
+        DataTable QueryForDataTable(string statementId, object 
parameterObject);
     }
 }

Modified: 
ibatis/trunk/cs/V3/src/Apache.Ibatis.DataMapper/MappedStatements/CachingStatement.cs
URL: 
http://svn.apache.org/viewvc/ibatis/trunk/cs/V3/src/Apache.Ibatis.DataMapper/MappedStatements/CachingStatement.cs?rev=666779&r1=666778&r2=666779&view=diff
==============================================================================
--- 
ibatis/trunk/cs/V3/src/Apache.Ibatis.DataMapper/MappedStatements/CachingStatement.cs
 (original)
+++ 
ibatis/trunk/cs/V3/src/Apache.Ibatis.DataMapper/MappedStatements/CachingStatement.cs
 Wed Jun 11 11:40:13 2008
@@ -99,6 +99,17 @@
             get { return mappedStatement.ModelStore; }
                }
 
+        /// <summary>
+        /// Executes an SQL statement that returns DataTable.
+        /// </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>The object</returns>
+        public DataTable ExecuteQueryForDataTable(ISession session, object 
parameterObject)
+        {
+            return mappedStatement.ExecuteQueryForDataTable(session, 
parameterObject);
+        }
+
                /// <summary>
                /// Executes the SQL and retuns all rows selected in a map that 
is keyed on the property named
                /// in the keyProperty parameter.  The value at each key will 
be the value of the property specified

Modified: 
ibatis/trunk/cs/V3/src/Apache.Ibatis.DataMapper/MappedStatements/IMappedStatement.cs
URL: 
http://svn.apache.org/viewvc/ibatis/trunk/cs/V3/src/Apache.Ibatis.DataMapper/MappedStatements/IMappedStatement.cs?rev=666779&r1=666778&r2=666779&view=diff
==============================================================================
--- 
ibatis/trunk/cs/V3/src/Apache.Ibatis.DataMapper/MappedStatements/IMappedStatement.cs
 (original)
+++ 
ibatis/trunk/cs/V3/src/Apache.Ibatis.DataMapper/MappedStatements/IMappedStatement.cs
 Wed Jun 11 11:40:13 2008
@@ -27,6 +27,7 @@
 #region Imports
 using System.Collections;
 using System.Collections.Generic;
+using System.Data;
 using Apache.Ibatis.DataMapper.Data;
 using Apache.Ibatis.DataMapper.Model;
 using Apache.Ibatis.DataMapper.Model.Statements;
@@ -261,7 +262,15 @@
         /// <returns></returns>
         IList<T> ExecuteQueryForRowDelegate<T>(ISession session, object 
parameterObject, RowDelegate<T> rowDelegate);
         #endregion
-           
-           
+
+        #region ExecuteQueryForDataTable
+        /// <summary>
+        /// Executes an SQL statement that returns DataTable.
+        /// </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>The object</returns>
+        DataTable ExecuteQueryForDataTable(ISession session, object 
parameterObject); 
+        #endregion
     }
 }

Modified: 
ibatis/trunk/cs/V3/src/Apache.Ibatis.DataMapper/MappedStatements/MappedStatement.cs
URL: 
http://svn.apache.org/viewvc/ibatis/trunk/cs/V3/src/Apache.Ibatis.DataMapper/MappedStatements/MappedStatement.cs?rev=666779&r1=666778&r2=666779&view=diff
==============================================================================
--- 
ibatis/trunk/cs/V3/src/Apache.Ibatis.DataMapper/MappedStatements/MappedStatement.cs
 (original)
+++ 
ibatis/trunk/cs/V3/src/Apache.Ibatis.DataMapper/MappedStatements/MappedStatement.cs
 Wed Jun 11 11:40:13 2008
@@ -1008,6 +1008,67 @@
         
         #endregion
 
+        #region ExecuteQueryForDataTable
+        /// <summary>
+        /// Executes an SQL statement that returns DataTable.
+        /// </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>The object</returns>
+        public virtual DataTable ExecuteQueryForDataTable(ISession session, 
object parameterObject)
+        {
+            DataTable dataTable = null;
+
+            object param = RaisePreEvent<PreSelectEventArgs>(PreSelectEvent, 
parameterObject);
+
+            RequestScope request = statement.Sql.GetRequestScope(this, param, 
session);
+            preparedCommand.Create(request, session, Statement, param);
+
+            dataTable = RunQueryForForDataTable(request, session, param);
+
+            return RaisePostEvent<DataTable, 
PostSelectEventArgs>(PostSelectEvent, param, dataTable);
+        }
+
+        /// <summary>
+        /// Runs the query for for data table.
+        /// </summary>
+        /// <param name="request">The request.</param>
+        /// <param name="session">The session.</param>
+        /// <param name="parameterObject">The parameter object.</param>
+        /// <returns></returns>
+        internal DataTable RunQueryForForDataTable(RequestScope request, 
ISession session, object parameterObject)
+        {
+            DataTable dataTable = null;
+
+            using (IDbCommand command = request.IDbCommand)
+            {
+                IDataReader reader = command.ExecuteReader();
+
+                try
+                {
+                    // Get Results
+                    while (reader.Read())
+                    {
+                        dataTable = (DataTable)resultStrategy.Process(request, 
ref reader, dataTable);
+                    }
+                }
+                finally
+                {
+                    reader.Close();
+                    reader.Dispose();
+                }
+
+                // do we need ??
+                //ExecuteDelayedLoad(request);
+
+                // do we need ??
+                //RetrieveOutputParameters(request, session, command, 
parameterObject);
+            }
+
+            return dataTable;
+        } 
+        #endregion
+
         #endregion
 
        /// <summary>

Added: 
ibatis/trunk/cs/V3/src/Apache.Ibatis.DataMapper/MappedStatements/ResultStrategy/DataTableStrategy.cs
URL: 
http://svn.apache.org/viewvc/ibatis/trunk/cs/V3/src/Apache.Ibatis.DataMapper/MappedStatements/ResultStrategy/DataTableStrategy.cs?rev=666779&view=auto
==============================================================================
--- 
ibatis/trunk/cs/V3/src/Apache.Ibatis.DataMapper/MappedStatements/ResultStrategy/DataTableStrategy.cs
 (added)
+++ 
ibatis/trunk/cs/V3/src/Apache.Ibatis.DataMapper/MappedStatements/ResultStrategy/DataTableStrategy.cs
 Wed Jun 11 11:40:13 2008
@@ -0,0 +1,153 @@
+#region Apache Notice
+/*****************************************************************************
+ * $Revision: 374175 $
+ * $LastChangedDate$
+ * $LastChangedBy$
+ * 
+ * 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.Data;
+using Apache.Ibatis.DataMapper.Model.ResultMapping;
+using Apache.Ibatis.DataMapper.Scope;
+using Apache.Ibatis.DataMapper.TypeHandlers;
+using System;
+
+namespace Apache.Ibatis.DataMapper.MappedStatements.ResultStrategy
+{
+    /// <summary>
+    /// <see cref="IResultStrategy"/> implementation when 
+    /// a 'resultClass' attribute is specified and
+    /// the type of the result object is <see cref="DataTable"/>.
+    /// </summary>
+    public class DataTableStrategy : IResultStrategy
+    {
+        #region IResultStrategy Members
+
+        /// <summary>
+        /// Processes the specified <see cref="IDataReader"/>.
+        /// </summary>
+        /// <param name="request">The request.</param>
+        /// <param name="reader">The reader.</param>
+        /// <param name="resultObject">The result object.</param>
+        /// <returns></returns>
+        public object Process(RequestScope request, ref IDataReader reader, 
object resultObject)
+        {
+            IResultMap resultMap = 
request.CurrentResultMap.ResolveSubMap(reader);
+            DataTable dataTable = resultObject as DataTable;
+
+            if (dataTable == null)
+            {
+                dataTable = new DataTable(resultMap.Id);
+                if (resultMap is AutoResultMap)
+                {
+                    for (int index = 0; index < reader.FieldCount; index++)
+                    {
+                        string columnName = reader.GetName(index);
+                        Type type = reader.GetFieldType(index);
+
+                        DataColumn column = new DataColumn();
+                        column.DataType = type;
+                        column.ColumnName = columnName;
+                        dataTable.Columns.Add(column);
+                    }
+                }
+                else
+                {
+                    for (int index = 0; index < resultMap.Properties.Count; 
index++)
+                    {
+                        ResultProperty property = resultMap.Properties[index];
+                        DataColumn column = new DataColumn();
+                        if (property.CLRType.Length > 0)
+                        {
+                            column.DataType = property.MemberType;
+                        }
+                        //column.DataType = 
reader.GetFieldType(reader.GetOrdinal(property.PropertyName));
+                        column.ColumnName = property.PropertyName;
+                        dataTable.Columns.Add(column);
+                    }
+                }
+            }
+
+            DataRow row = null;
+            if (resultMap is AutoResultMap)
+            {
+                row = dataTable.NewRow();
+                for (int index = 0; index < reader.FieldCount; index++)
+                {
+                    string propertyName = reader.GetName(index);
+                    int columnIndex = index;
+                    ITypeHandler typeHandler = 
request.DataExchangeFactory.TypeHandlerFactory.GetTypeHandler(reader.GetFieldType(index));
+
+                    ResultProperty property = new ResultProperty(
+                        propertyName,
+                        string.Empty,
+                        columnIndex,
+                        string.Empty,
+                        string.Empty,
+                        string.Empty,
+                        false,
+                        string.Empty,
+                        null,
+                        string.Empty,
+                        typeof(DataTable),
+                        request.DataExchangeFactory,
+                        typeHandler);
+
+                    object value = property.GetDataBaseValue(reader);
+                    if (value == null)
+                    {
+                        value = DBNull.Value;
+                    }
+                    row[property.PropertyName] = value;
+                }
+            }
+            else
+            {
+                // We must set the DataType before adding any data to the 
DataTable
+                for (int index = 0; index < resultMap.Properties.Count; 
index++)
+                {
+                    ResultProperty property = resultMap.Properties[index];
+                    object value = property.GetDataBaseValue(reader);
+                    if (value != null && property.CLRType.Length == 0)
+                    {
+                        dataTable.Columns[property.PropertyName].DataType = 
value.GetType();
+                    }
+                }
+                row = dataTable.NewRow();
+                for (int index = 0; index < resultMap.Properties.Count; 
index++)
+                {
+                    ResultProperty property = resultMap.Properties[index];
+                    object value = property.GetDataBaseValue(reader);
+                    if (value == null)
+                    {
+                        value = DBNull.Value;
+                    }
+                    row[property.PropertyName] = value;
+
+                }
+            }
+            dataTable.Rows.Add(row);
+
+            return dataTable;
+        }
+
+        #endregion
+    }
+}

Propchange: 
ibatis/trunk/cs/V3/src/Apache.Ibatis.DataMapper/MappedStatements/ResultStrategy/DataTableStrategy.cs
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: 
ibatis/trunk/cs/V3/src/Apache.Ibatis.DataMapper/MappedStatements/ResultStrategy/DataTableStrategy.cs
------------------------------------------------------------------------------
    svn:keywords = Id LastChangedDate LastChangedBy

Modified: 
ibatis/trunk/cs/V3/src/Apache.Ibatis.DataMapper/MappedStatements/ResultStrategy/MapStrategy.cs
URL: 
http://svn.apache.org/viewvc/ibatis/trunk/cs/V3/src/Apache.Ibatis.DataMapper/MappedStatements/ResultStrategy/MapStrategy.cs?rev=666779&r1=666778&r2=666779&view=diff
==============================================================================
--- 
ibatis/trunk/cs/V3/src/Apache.Ibatis.DataMapper/MappedStatements/ResultStrategy/MapStrategy.cs
 (original)
+++ 
ibatis/trunk/cs/V3/src/Apache.Ibatis.DataMapper/MappedStatements/ResultStrategy/MapStrategy.cs
 Wed Jun 11 11:40:13 2008
@@ -38,6 +38,7 @@
         private static readonly IResultStrategy resultMapStrategy = null;
         private static readonly IResultStrategy groupByStrategy = null;
         private static readonly IResultStrategy cirularStrategy = null;
+        private static readonly IResultStrategy dataTableStrategy = null;
 
         /// <summary>
         /// Initializes the <see cref="MapStrategy"/> class.
@@ -47,6 +48,7 @@
             resultMapStrategy = new ResultMapStrategy();
             groupByStrategy = new GroupByStrategy();
             cirularStrategy = new CirularStrategy();
+            dataTableStrategy = new DataTableStrategy();
         }
         
         #region IResultStrategy Members
@@ -69,6 +71,10 @@
             {
                 return cirularStrategy.Process(request, ref reader, 
resultObject);
             }
+            else if (typeof(DataTable).IsAssignableFrom(resultMap.Class))
+            {
+                return dataTableStrategy.Process(request, ref reader, 
resultObject);
+            }
             else
             {
                 return resultMapStrategy.Process(request, ref reader, 
resultObject);

Modified: 
ibatis/trunk/cs/V3/src/Apache.Ibatis.DataMapper/MappedStatements/ResultStrategy/ResultClassStrategy.cs
URL: 
http://svn.apache.org/viewvc/ibatis/trunk/cs/V3/src/Apache.Ibatis.DataMapper/MappedStatements/ResultStrategy/ResultClassStrategy.cs?rev=666779&r1=666778&r2=666779&view=diff
==============================================================================
--- 
ibatis/trunk/cs/V3/src/Apache.Ibatis.DataMapper/MappedStatements/ResultStrategy/ResultClassStrategy.cs
 (original)
+++ 
ibatis/trunk/cs/V3/src/Apache.Ibatis.DataMapper/MappedStatements/ResultStrategy/ResultClassStrategy.cs
 Wed Jun 11 11:40:13 2008
@@ -35,20 +35,23 @@
        /// </summary>
     public sealed class ResultClassStrategy : IResultStrategy
        {
-               private static IResultStrategy _simpleTypeStrategy = null;
-               private static IResultStrategy _dictionaryStrategy = null;
-               private static IResultStrategy _listStrategy = null;
-               private static IResultStrategy _autoMapStrategy = null;
+               private static IResultStrategy simpleTypeStrategy = null;
+               private static IResultStrategy dictionaryStrategy = null;
+               private static IResultStrategy listStrategy = null;
+               private static IResultStrategy autoMapStrategy = null;
+        private static IResultStrategy dataTableStrategy = null;
 
                /// <summary>
                /// Initializes a new instance of the <see 
cref="ResultClassStrategy"/> class.
                /// </summary>
                public ResultClassStrategy()
                {
-                       _simpleTypeStrategy = new SimpleTypeStrategy();
-                       _dictionaryStrategy = new DictionaryStrategy();
-                       _listStrategy = new ListStrategy();
-                       _autoMapStrategy = new AutoMapStrategy();
+                       simpleTypeStrategy = new SimpleTypeStrategy();
+                       dictionaryStrategy = new DictionaryStrategy();
+                       listStrategy = new ListStrategy();
+                       autoMapStrategy = new AutoMapStrategy();
+            dataTableStrategy = new DataTableStrategy();
+
                }
 
         #region IResultStrategy Members
@@ -65,19 +68,23 @@
                        // Check if the ResultClass is a 'primitive' Type
             if 
(request.DataExchangeFactory.TypeHandlerFactory.IsSimpleType(request.CurrentResultMap.Class))
                        {
-                return _simpleTypeStrategy.Process(request, ref reader, 
resultObject);
+                return simpleTypeStrategy.Process(request, ref reader, 
resultObject);
                        }
             else if 
(typeof(IDictionary).IsAssignableFrom(request.CurrentResultMap.Class)) 
                        {
-                return _dictionaryStrategy.Process(request, ref reader, 
resultObject);
+                return dictionaryStrategy.Process(request, ref reader, 
resultObject);
                        }
             else if 
(typeof(IList).IsAssignableFrom(request.CurrentResultMap.Class)) 
                        {
-                return _listStrategy.Process(request, ref reader, 
resultObject);
+                return listStrategy.Process(request, ref reader, resultObject);
                        }
-                       else
+            else if 
(typeof(DataTable).IsAssignableFrom(request.CurrentResultMap.Class))
+            {
+                return dataTableStrategy.Process(request, ref reader, 
resultObject);
+            }
+            else
                        {
-                return _autoMapStrategy.Process(request, ref reader, 
resultObject);
+                return autoMapStrategy.Process(request, ref reader, 
resultObject);
                        }
                }
 

Modified: 
ibatis/trunk/cs/V3/src/Apache.Ibatis.DataMapper/Model/ResultMapping/ResultProperty.cs
URL: 
http://svn.apache.org/viewvc/ibatis/trunk/cs/V3/src/Apache.Ibatis.DataMapper/Model/ResultMapping/ResultProperty.cs?rev=666779&r1=666778&r2=666779&view=diff
==============================================================================
--- 
ibatis/trunk/cs/V3/src/Apache.Ibatis.DataMapper/Model/ResultMapping/ResultProperty.cs
 (original)
+++ 
ibatis/trunk/cs/V3/src/Apache.Ibatis.DataMapper/Model/ResultMapping/ResultProperty.cs
 Wed Jun 11 11:40:13 2008
@@ -395,7 +395,8 @@
             
             if ( propertyName.Length>0 && 
                                 propertyName != "value" && 
-                               
!typeof(IDictionary).IsAssignableFrom(resultClass) )
+                               
!typeof(IDictionary).IsAssignableFrom(resultClass)&&
+                !typeof(DataTable).IsAssignableFrom(resultClass)) 
                        {   
                 #region SetAccessor
                 if (!isComplexMemberName)

Modified: 
ibatis/trunk/cs/V3/src/Apache.Ibatis.DataMapper/TypeHandlers/TypeHandlerFactory.cs
URL: 
http://svn.apache.org/viewvc/ibatis/trunk/cs/V3/src/Apache.Ibatis.DataMapper/TypeHandlers/TypeHandlerFactory.cs?rev=666779&r1=666778&r2=666779&view=diff
==============================================================================
--- 
ibatis/trunk/cs/V3/src/Apache.Ibatis.DataMapper/TypeHandlers/TypeHandlerFactory.cs
 (original)
+++ 
ibatis/trunk/cs/V3/src/Apache.Ibatis.DataMapper/TypeHandlers/TypeHandlerFactory.cs
 Wed Jun 11 11:40:13 2008
@@ -29,6 +29,7 @@
 using System;
 using System.Collections;
 using System.Collections.Generic;
+using System.Data;
 using System.Reflection;
 using Apache.Ibatis.Common.Exceptions;
 using Apache.Ibatis.Common.Logging;
@@ -356,9 +357,9 @@
             {
                 handler = GetUnkownTypeHandler();
             }
-            else if (typeof(IDictionary).IsAssignableFrom(classType))
+            else if (typeof(IDictionary).IsAssignableFrom(classType) || 
typeof(DataTable).IsAssignableFrom(classType))
             {
-                // IDictionary
+                // IDictionary or DataTable
                 if (memberType == null || memberType.Length == 0)
                 {
                     handler = GetUnkownTypeHandler();
@@ -431,9 +432,9 @@
             {
                 handler = GetUnkownTypeHandler();
             }
-            else if (typeof(IDictionary).IsAssignableFrom(argumentType))
+            else if (typeof(IDictionary).IsAssignableFrom(argumentType) || 
typeof(DataTable).IsAssignableFrom(argumentType))
             {
-                // IDictionary
+                // IDictionary or 
                 if (clrType == null || clrType.Length == 0)
                 {
                     handler = GetUnkownTypeHandler();


Reply via email to