diff --git a/src/Spring/Spring.Data/Data/Core/AdoTemplate.cs b/src/Spring/Spring.Data/Data/Core/AdoTemplate.cs index 9f5984e5..e98ed3a7 100644 --- a/src/Spring/Spring.Data/Data/Core/AdoTemplate.cs +++ b/src/Spring/Spring.Data/Data/Core/AdoTemplate.cs @@ -329,8 +329,8 @@ namespace Spring.Data.Core IDbDataAdapter dataAdapter = null; try { - dataAdapter = DbProvider.CreateDataAdapter(); - //TODO row updated event handling... + dataAdapter = DbProvider.CreateDataAdapter(); + //TODO row updated event handling... (SPRNET-1014) dataAdapter.SelectCommand = DbProvider.CreateCommand(); dataAdapter.SelectCommand.Connection = connectionTxPairToUse.Connection; //TODO register for warnings on connection. @@ -1150,7 +1150,8 @@ namespace Spring.Data.Core #endregion ITableMappingCollection mappingCollection = DoCreateMappingCollection(null); - return (int)Execute(new DataAdapterFillCallback(dataTable, + return (int)Execute(new DataAdapterFillCallback(dbProvider, + dataTable, commandType, sql, mappingCollection, null, null, null)); } @@ -1172,7 +1173,8 @@ namespace Spring.Data.Core tableMappingName = "Table"; } ITableMappingCollection mappingCollection = DoCreateMappingCollection(new string[] { tableMappingName }); - return (int)Execute(new DataAdapterFillCallback(dataTable, + return (int)Execute(new DataAdapterFillCallback(dbProvider, + dataTable, commandType, sql, mappingCollection, null, null, null)); @@ -1183,9 +1185,10 @@ namespace Spring.Data.Core { ValidateFillArguments(dataTable, sql, tableMapping); ITableMappingCollection mappingCollection = new DataTableMappingCollection(); - mappingCollection.Add((object)tableMapping); + mappingCollection.Add(tableMapping); - return (int)Execute(new DataAdapterFillCallback(dataTable, + return (int)Execute(new DataAdapterFillCallback(dbProvider, + dataTable, commandType, sql, mappingCollection, null, null, null)); } @@ -1197,7 +1200,8 @@ namespace Spring.Data.Core ValidateFillArguments(dataTable, sql, tableMapping); ITableMappingCollection mappingCollection = new DataTableMappingCollection(); mappingCollection.Add((object)tableMapping); - return (int)Execute(new DataAdapterFillCallback(dataTable, + return (int)Execute(new DataAdapterFillCallback(dbProvider, + dataTable, commandType, sql, mappingCollection, setter, null, null)); } @@ -1212,7 +1216,7 @@ namespace Spring.Data.Core { ValidateFillWithParameterArguments(dataTable, sql, parameters); ITableMappingCollection mappingCollection = DoCreateMappingCollection(null); - return (int)Execute(new DataAdapterFillCallback(dataTable, + return (int)Execute(new DataAdapterFillCallback(dbProvider,dataTable, commandType, sql, mappingCollection, null, null, parameters)); @@ -1228,7 +1232,7 @@ namespace Spring.Data.Core tableMappingName = "Table"; } ITableMappingCollection mappingCollection = DoCreateMappingCollection(new string[] { tableMappingName }); - return (int)Execute(new DataAdapterFillCallback(dataTable, + return (int)Execute(new DataAdapterFillCallback(dbProvider, dataTable, commandType, sql, mappingCollection, null, null, parameters)); } @@ -1240,7 +1244,7 @@ namespace Spring.Data.Core ValidateFillWithParameterArguments(dataTable, sql, parameters, tableMapping); ITableMappingCollection mappingCollection = new DataTableMappingCollection(); mappingCollection.Add((object)tableMapping); - return (int)Execute(new DataAdapterFillCallback(dataTable, + return (int)Execute(new DataAdapterFillCallback(dbProvider, dataTable, commandType, sql, mappingCollection, null, null, parameters)); } @@ -1253,7 +1257,7 @@ namespace Spring.Data.Core ValidateFillWithParameterArguments(dataTable, sql, parameters, tableMapping); ITableMappingCollection mappingCollection = new DataTableMappingCollection(); mappingCollection.Add((object)tableMapping); - return (int)Execute(new DataAdapterFillCallback(dataTable, + return (int)Execute(new DataAdapterFillCallback(dbProvider, dataTable, commandType, sql, mappingCollection, dataAdapterSetter, null, parameters)); } @@ -1262,7 +1266,7 @@ namespace Spring.Data.Core #endregion #region DataTable Update operations - //TODO conflict options... + public int DataTableUpdateWithCommandBuilder(DataTable dataTable, CommandType commandType, @@ -1490,7 +1494,7 @@ namespace Spring.Data.Core ITableMappingCollection mappingCollection = DoCreateMappingCollection(null); - return (int)Execute(new DataAdapterFillCallback(dataSet, + return (int)Execute(new DataAdapterFillCallback(DbProvider, dataSet, commandType, sql, mappingCollection, null, null, null)); } @@ -1513,7 +1517,7 @@ namespace Spring.Data.Core tableNames = new string[] { "Table" }; } ITableMappingCollection mappingCollection = DoCreateMappingCollection(tableNames); - return (int)Execute(new DataAdapterFillCallback(dataSet, + return (int)Execute(new DataAdapterFillCallback(DbProvider, dataSet, commandType, sql, mappingCollection, null, null, null)); } @@ -1523,7 +1527,7 @@ namespace Spring.Data.Core ITableMappingCollection tableMapping) { ValidateFillArguments(dataSet, sql, tableMapping); - return (int)Execute(new DataAdapterFillCallback(dataSet, + return (int)Execute(new DataAdapterFillCallback(DbProvider, dataSet, commandType, sql, tableMapping, null, null, null)); @@ -1534,7 +1538,7 @@ namespace Spring.Data.Core IDataAdapterSetter setter) { ValidateFillArguments(dataSet, sql, tableMapping); - return (int)Execute(new DataAdapterFillCallback(dataSet, + return (int)Execute(new DataAdapterFillCallback(DbProvider, dataSet, commandType, sql, tableMapping, setter, null, null)); @@ -1546,7 +1550,7 @@ namespace Spring.Data.Core IDataSetFillLifecycleProcessor fillLifecycleProcessor) { ValidateFillArguments(dataSet, sql, tableMapping); - return (int)Execute(new DataAdapterFillCallback(dataSet, + return (int)Execute(new DataAdapterFillCallback(DbProvider, dataSet, commandType, sql, tableMapping, setter, fillLifecycleProcessor, null)); @@ -1561,7 +1565,7 @@ namespace Spring.Data.Core { ValidateFillWithParameterArguments(dataSet, sql, parameters); ITableMappingCollection mappingCollection = DoCreateMappingCollection(null); - return (int)Execute(new DataAdapterFillCallback(dataSet, + return (int)Execute(new DataAdapterFillCallback(DbProvider, dataSet, commandType, sql, mappingCollection, null, null, parameters)); @@ -1577,7 +1581,7 @@ namespace Spring.Data.Core tableNames = new string[] { "Table" }; } ITableMappingCollection tableMapping = DoCreateMappingCollection(tableNames); - return (int)Execute(new DataAdapterFillCallback(dataSet, + return (int)Execute(new DataAdapterFillCallback(DbProvider, dataSet, commandType, sql, tableMapping, null, null, parameters)); @@ -1588,7 +1592,7 @@ namespace Spring.Data.Core ITableMappingCollection tableMapping) { ValidateFillWithParameterArguments(dataSet, sql, parameters, tableMapping); - return (int)Execute(new DataAdapterFillCallback(dataSet, + return (int)Execute(new DataAdapterFillCallback(DbProvider, dataSet, commandType, sql, tableMapping, null, null, parameters)); } @@ -1599,7 +1603,7 @@ namespace Spring.Data.Core IDataAdapterSetter dataAdapterSetter) { ValidateFillWithParameterArguments(dataSet, sql, parameters, tableMapping); - return (int)Execute(new DataAdapterFillCallback(dataSet, + return (int)Execute(new DataAdapterFillCallback(DbProvider, dataSet, commandType, sql, tableMapping, dataAdapterSetter, null, parameters)); } @@ -1611,7 +1615,7 @@ namespace Spring.Data.Core IDataSetFillLifecycleProcessor fillLifecycleProcessor) { ValidateFillWithParameterArguments(dataSet, sql, parameters, tableMapping); - return (int)Execute(new DataAdapterFillCallback(dataSet, + return (int)Execute(new DataAdapterFillCallback(DbProvider, dataSet, commandType, sql, tableMapping, dataAdapterSetter, fillLifecycleProcessor, parameters)); } @@ -1681,7 +1685,7 @@ namespace Spring.Data.Core ITableMappingCollection mappingCollection = DoCreateMappingCollection(new string[] { tableName }); - return (int)Execute(new DataAdapterUpdateCallback(dataSet, + return (int)Execute(new DataAdapterUpdateCallback(DbProvider, dataSet, mappingCollection, insertCommand, updateCommand, @@ -1722,7 +1726,7 @@ namespace Spring.Data.Core } ITableMappingCollection mappingCollection = DoCreateMappingCollection(new string[] { tableName }); - int returnVal = (int)Execute(new DataAdapterUpdateCallback(dataSet, mappingCollection, + int returnVal = (int)Execute(new DataAdapterUpdateCallback(DbProvider, dataSet, mappingCollection, insertCommand, updateCommand, deleteCommand, null)); if (insertSql != null) @@ -1751,7 +1755,7 @@ namespace Spring.Data.Core { ValidateUpdateArguments(dataSet, tableName); ITableMappingCollection tableMapping = DoCreateMappingCollection(new string[] { tableName }); - return (int)Execute(new DataAdapterUpdateCallback(dataSet, + return (int)Execute(new DataAdapterUpdateCallback(DbProvider, dataSet, tableMapping, insertCommand, updateCommand, @@ -1767,7 +1771,7 @@ namespace Spring.Data.Core IDbCommand deleteCommand) { ValidateUpdateArguments(dataSet, tableMapping); - return (int)Execute(new DataAdapterUpdateCallback(dataSet, + return (int)Execute(new DataAdapterUpdateCallback(DbProvider, dataSet, tableMapping, insertCommand, updateCommand, @@ -1783,7 +1787,7 @@ namespace Spring.Data.Core IDataAdapterSetter dataAdapterSetter) { ValidateUpdateArguments(dataSet, tableMapping); - return (int)Execute(new DataAdapterUpdateCallback(dataSet, + return (int)Execute(new DataAdapterUpdateCallback(DbProvider, dataSet, tableMapping, insertCommand, updateCommand, @@ -1873,7 +1877,7 @@ namespace Spring.Data.Core ParameterUtils.CopyParameters(deleteCommand, deleteParameters); } - int returnVal = (int)Execute(new DataAdapterUpdateCallback(dataTable, mappingCollection, + int returnVal = (int)Execute(new DataAdapterUpdateCallback(DbProvider, dataTable, mappingCollection, insertCommand, updateCommand, deleteCommand, null)); if (insertSql != null) @@ -2161,9 +2165,11 @@ namespace Spring.Data.Core private ITableMappingCollection mappingCollection; private IDataAdapterSetter dataAdapterSetter; private IDataSetFillLifecycleProcessor fillLifecycleProcessor; - private IDbParameters parameters; + private IDbParameters parameters; + private IDbProvider dbProvider; - public DataAdapterFillCallback(DataSet dataSet, + public DataAdapterFillCallback(IDbProvider dbProvider, + DataSet dataSet, CommandType commandType, string sql, ITableMappingCollection mappingCollection, @@ -2171,7 +2177,8 @@ namespace Spring.Data.Core IDataSetFillLifecycleProcessor fillLifecycleProcessor, IDbParameters parameters) { - containsDataSet = true; + containsDataSet = true; + this.dbProvider = dbProvider; this.dataSet = dataSet; this.commandType = commandType; this.sql = sql; @@ -2179,9 +2186,10 @@ namespace Spring.Data.Core this.dataAdapterSetter = dataAdapterSetter; this.fillLifecycleProcessor = fillLifecycleProcessor; this.parameters = parameters; - } - - public DataAdapterFillCallback(DataTable dataTable, + } + + public DataAdapterFillCallback(IDbProvider dbProvider, + DataTable dataTable, CommandType commandType, string sql, ITableMappingCollection mappingCollection, @@ -2189,7 +2197,8 @@ namespace Spring.Data.Core IDataSetFillLifecycleProcessor fillLifecycleProcessor, IDbParameters parameters) { - containsDataSet = false; + containsDataSet = false; + this.dbProvider = dbProvider; this.dataTable = dataTable; this.commandType = commandType; this.sql = sql; @@ -2202,9 +2211,14 @@ namespace Spring.Data.Core public object DoInDataAdapter(IDbDataAdapter dataAdapter) - { + { + ConnectionTxPair connectionTxPairToUse = ConnectionUtils.GetConnectionTxPair(dbProvider); + dataAdapter.SelectCommand.Connection = connectionTxPairToUse.Connection; + dataAdapter.SelectCommand.Transaction = connectionTxPairToUse.Transaction; + dataAdapter.SelectCommand.CommandType = commandType; - dataAdapter.SelectCommand.CommandText = sql; + dataAdapter.SelectCommand.CommandText = sql; + //TODO investigate performance of cloning....would need to change signature to // DataTableMapping[] otherwise... foreach (DataTableMapping dataTableMapping in mappingCollection) @@ -2263,16 +2277,13 @@ namespace Spring.Data.Core private IDbCommand insertCommand; private IDbCommand updateCommand; private IDbCommand deleteCommand; - private IDataAdapterSetter dataAdapterSetter; + private IDataAdapterSetter dataAdapterSetter; + private IDbProvider dbProvider; - public DataAdapterUpdateCallback(DataSet dataSet, - ITableMappingCollection mappingCollection, - IDbCommand insertCommand, - IDbCommand updateCommand, - IDbCommand deleteCommand, - IDataAdapterSetter dataAdapterSetter) + public DataAdapterUpdateCallback(IDbProvider dbProvider, DataSet dataSet, ITableMappingCollection mappingCollection, IDbCommand insertCommand, IDbCommand updateCommand, IDbCommand deleteCommand, IDataAdapterSetter dataAdapterSetter) { - containsDataSet = true; + containsDataSet = true; + this.dbProvider = dbProvider; this.dataSet = dataSet; this.mappingCollection = mappingCollection; this.insertCommand = insertCommand; @@ -2281,14 +2292,10 @@ namespace Spring.Data.Core this.dataAdapterSetter = dataAdapterSetter; } - public DataAdapterUpdateCallback(DataTable dataTable, - ITableMappingCollection mappingCollection, - IDbCommand insertCommand, - IDbCommand updateCommand, - IDbCommand deleteCommand, - IDataAdapterSetter dataAdapterSetter) + public DataAdapterUpdateCallback(IDbProvider dbProvider, DataTable dataTable, ITableMappingCollection mappingCollection, IDbCommand insertCommand, IDbCommand updateCommand, IDbCommand deleteCommand, IDataAdapterSetter dataAdapterSetter) { - containsDataSet = false; + containsDataSet = false; + this.dbProvider = dbProvider; this.dataTable = dataTable; this.mappingCollection = mappingCollection; this.insertCommand = insertCommand; @@ -2299,7 +2306,11 @@ namespace Spring.Data.Core #region IDataAdapterCallback Members public object DoInDataAdapter(IDbDataAdapter dataAdapter) - { + { + ConnectionTxPair connectionTxPairToUse = ConnectionUtils.GetConnectionTxPair(dbProvider); + dataAdapter.SelectCommand.Connection = connectionTxPairToUse.Connection; + dataAdapter.SelectCommand.Transaction = connectionTxPairToUse.Transaction; + //TODO - did not make copies of parameters... if (insertCommand == null && updateCommand == null && deleteCommand == null) { diff --git a/src/Spring/Spring.Data/Data/IAdoOperations.cs b/src/Spring/Spring.Data/Data/IAdoOperations.cs index 21bf9471..36a29f55 100644 --- a/src/Spring/Spring.Data/Data/IAdoOperations.cs +++ b/src/Spring/Spring.Data/Data/IAdoOperations.cs @@ -287,27 +287,6 @@ namespace Spring.Data string parameterName, Enum dbType, int size, object parameterValue); - /* - /// - /// Execute a query for a result list, given static SQL. - /// - /// - /// The results will be mapped to a List (one entry for each row) - /// of IDictionaries (one entry for each column using he column - /// name as the key). Each element in the list will be of the form - /// returned by ths interfaces QueryForMap() methods. - /// - /// The type of the command. - /// The SQL query to execute - /// - IList QueryForList(CommandType cmdType, string sql); - */ - //IDictionary QueryForDictionary(CommandType cmdType, string sql); - //TODO - - //Object QueryForObject(CommandType cmdType, String sql, Type requiredType) throws DataAccessException; - //IDictionary QueryForDictionary - //IList QueryForList - #endregion #region Query for ObjectDelegate @@ -402,19 +381,9 @@ namespace Spring.Data // each with either a IRowMapper, IResultSetExtractor, IRowCallback // and multiple output parameters. IDictionary QueryWithCommandCreator(IDbCommandCreator commandCreator, IList resultProcessors); - - //TODO - //Object QueryForObject(... Type requiredType) - //IDictionary QueryForDictionary - //IList QueryForList - + #endregion - - // *************************************************************** - // NB: Complex DataSet/DataTable operations are best handled with - // DataSetOperations class in Spring.Data.Objects - // *************************************************************** - + #region DataTable Create operations without parameters DataTable DataTableCreate(CommandType commandType, string sql); @@ -449,11 +418,7 @@ namespace Spring.Data ITableMapping tableMapping, IDataAdapterSetter dataAdapterSetter); - - //TODO - /* - DataTable DataTableCreateWithParams(IDbDataAdapterCreator dataAdapterCreator); - */ + #endregion @@ -497,17 +462,10 @@ namespace Spring.Data IDbParameters parameters, ITableMapping tableMapping, IDataAdapterSetter dataAdapterSetter); - - //TODO - /* - int DataTableFillWithParams(DataTable dataTable, - IDbDataAdapterCreator dataAdapterCreator); - - */ + #endregion #region DataTable Update operations - //TODO conflict options... int DataTableUpdateWithCommandBuilder(DataTable dataTable, CommandType commandType, @@ -665,8 +623,6 @@ namespace Spring.Data #endregion #region DataSet Update operations - //TODO expose RowUpdate event in a generic manner - //TODO any way to integrate Accept/RejectChanges based on tx outcome? int DataSetUpdateWithCommandBuilder(DataSet dataSet, CommandType commandType, diff --git a/test/Spring/Spring.Data.Integration.Tests/Data/AdoTemplateTests.cs b/test/Spring/Spring.Data.Integration.Tests/Data/AdoTemplateTests.cs index f6b4a1c0..c3e25612 100644 --- a/test/Spring/Spring.Data.Integration.Tests/Data/AdoTemplateTests.cs +++ b/test/Spring/Spring.Data.Integration.Tests/Data/AdoTemplateTests.cs @@ -32,6 +32,8 @@ using Spring.Data.Common; using Spring.Data.Core; using Spring.Data.Support; using Spring.Objects; +using Spring.Transaction; +using Spring.Transaction.Support; #endregion @@ -48,6 +50,7 @@ namespace Spring.Data IAdoOperations adoOperations; IDbProvider dbProvider; + private IPlatformTransactionManager transactionManager; #endregion @@ -82,13 +85,8 @@ namespace Spring.Data Assert.IsNotNull(ctx); dbProvider = ctx["DbProvider"] as IDbProvider; Assert.IsNotNull(dbProvider); - UserCredentialsDbProvider userCredentialsDbProvider = dbProvider as UserCredentialsDbProvider; - Assert.IsNotNull(userCredentialsDbProvider); - - //userCredentialsDbProvider.Username = "User ID=springqa"; - //userCredentialsDbProvider.Password = "Password=springqa"; - userCredentialsDbProvider.SetCredentialsForCurrentThread("User ID=springqa", "Password=springqa"); - adoOperations = new AdoTemplate(userCredentialsDbProvider); + adoOperations = new AdoTemplate(dbProvider); + transactionManager = new AdoPlatformTransactionManager(dbProvider); } @@ -97,12 +95,10 @@ namespace Spring.Data [Test] public void FillDataSetNoParams() { - String sql = "select TestObjectNo, Age, Name from TestObjects"; - DataSet dataSet = new DataSet(); - adoOperations.DataSetFill(dataSet, CommandType.Text, sql); - Assert.AreEqual(1, dataSet.Tables.Count); - Assert.AreEqual(4, dataSet.Tables["Table"].Rows.Count); - + PopulateTestObjectsTable(); + string sql = ValidateTestObjects(4); + DataSet dataSet; + dataSet = new DataSet(); adoOperations.DataSetFill(dataSet, CommandType.Text, sql, new string[] {"TestObjects"}); Assert.AreEqual(1, dataSet.Tables.Count); @@ -125,41 +121,92 @@ namespace Spring.Data } } - - [Test] - public void UpdateDataSet() + + [Test] + public void UpdateDataSet() + { + PopulateTestObjectsTable(); + ValidateTestObjects(4); + DoUpdateDataSet(); + ValidateTestObjects(5); + + } + + [Test] + public void UpdateDataSetTxRollback() + { + + PopulateTestObjectsTable(); + ValidateTestObjects(4); + TransactionTemplate tt = new TransactionTemplate(transactionManager); + try + { + object result = tt.Execute(new DataSetUpdateTransactionCallback(this, true)); + Assert.Fail("Should have thrown exception to rollback transaction."); + } catch (Exception e) + { + ValidateTestObjects(4); + } + } + + private void PopulateTestObjectsTable() { + adoOperations.ExecuteNonQuery(CommandType.Text, "truncate table TestObjects"); + int age = 18; + int counter = 0; + for (int i=0;i<4;i++) + { + String sql = + String.Format("insert into TestObjects(Age, Name) VALUES ({0}, '{1}')", age++, "George" + counter++); + adoOperations.ExecuteNonQuery(CommandType.Text, sql); + } + } + + private string ValidateTestObjects(int count) + { String sql = "select TestObjectNo, Age, Name from TestObjects"; DataSet dataSet = new DataSet(); - adoOperations.DataSetFill(dataSet, CommandType.Text, sql, new string[] {"TestObjects"}); - - //Create and add new row. + adoOperations.DataSetFill(dataSet, CommandType.Text, sql); + Assert.AreEqual(1, dataSet.Tables.Count); + Assert.AreEqual(count, dataSet.Tables["Table"].Rows.Count); + return sql; + } + + + + public void DoUpdateDataSet() + { + String sql = "select TestObjectNo, Age, Name from TestObjects"; + DataSet dataSet = new DataSet(); + adoOperations.DataSetFill(dataSet, CommandType.Text, sql, new string[] { "TestObjects" }); + + //Create and add new row. DataRow myDataRow = dataSet.Tables["TestObjects"].NewRow(); myDataRow["Age"] = 101; - myDataRow["Name"] = "OldManWinter"; + myDataRow["Name"] = "OldManWinter"; dataSet.Tables["TestObjects"].Rows.Add(myDataRow); - - //TODO - think about api... - IDbCommand insertCommand = dbProvider.CreateCommand(); - insertCommand.CommandText = "insert into TestObjects(Age,Name) values (@Age,@Name)"; + + //TODO - think about api... + IDbCommand insertCommand = dbProvider.CreateCommand(); + insertCommand.CommandText = "insert into TestObjects(Age,Name) values (@Age,@Name)"; IDbParameters parameters = adoOperations.CreateDbParameters(); parameters.Add("Name", DbType.String, 12, "Name"); - //TODO - remembering the -1 isn't all that natural... add string name, dbtype, string sourceCol) - //or AddSourceCol("Age", SqlDbType.Int); would copy into source col? + //TODO - remembering the -1 isn't all that natural... add string name, dbtype, string sourceCol) + //or AddSourceCol("Age", SqlDbType.Int); would copy into source col? parameters.Add("Age", SqlDbType.Int, -1, "Age"); - - //TODO - this isn't all that natural... - ParameterUtils.CopyParameters(insertCommand, parameters); - - //insertCommand.Parameters.Add() - - adoOperations.DataSetUpdate(dataSet, "TestObjects", - insertCommand, - null, - null); - //TODO avoid param Utils copy by adding argument... - + //TODO - this isn't all that natural... + ParameterUtils.CopyParameters(insertCommand, parameters); + + //insertCommand.Parameters.Add() + + adoOperations.DataSetUpdate(dataSet, "TestObjects", + insertCommand, + null, + null); + + //TODO avoid param Utils copy by adding argument... + //adoOperations.DataSetUpdate(dataSet, "TestObjects", // insertCommand, parameters, // null, null, @@ -169,11 +216,10 @@ namespace Spring.Data // CommandType type, string sql, parameters, // null, null, // null, null); - - //TODO how about breaking up the operations... - } - + //TODO how about breaking up the operations... + } + [Test] public void ExecuteQueryWithResultSetExtractor() { @@ -284,4 +330,32 @@ namespace Spring.Data } } + + internal class DataSetUpdateTransactionCallback : ITransactionCallback + { + private bool throwException; + private AdoTemplateTests adoTemplateTests; + + public DataSetUpdateTransactionCallback(AdoTemplateTests adoTemplateTests, bool throwException) + { + this.throwException = throwException; + this.adoTemplateTests = adoTemplateTests; + } + + /// + /// Gets called by TransactionTemplate.Execute within a + /// transaction context. + /// + /// The associated transaction status. + /// A result object or null. + public object DoInTransaction(ITransactionStatus status) + { + if (throwException) + { + throw new ArgumentException("Explicitly thrown exception"); + } + adoTemplateTests.DoUpdateDataSet(); + return null; + } + } } diff --git a/test/Spring/Spring.Data.Integration.Tests/Data/adoTemplateTests.xml b/test/Spring/Spring.Data.Integration.Tests/Data/adoTemplateTests.xml index 289a7da1..997d39ac 100644 --- a/test/Spring/Spring.Data.Integration.Tests/Data/adoTemplateTests.xml +++ b/test/Spring/Spring.Data.Integration.Tests/Data/adoTemplateTests.xml @@ -1,33 +1,14 @@ + xmlns:db="http://www.springframework.net/database"> - - - - - - - - +