From: <ric...@us...> - 2010-07-28 20:57:52
|
Revision: 5073 http://nhibernate.svn.sourceforge.net/nhibernate/?rev=5073&view=rev Author: ricbrown Date: 2010-07-28 20:57:45 +0000 (Wed, 28 Jul 2010) Log Message: ----------- Fix NH-2257 (Parameter ordering not working when driver does not support Named Parameters) Modified Paths: -------------- trunk/nhibernate/src/NHibernate/AdoNet/AbstractBatcher.cs trunk/nhibernate/src/NHibernate/Driver/DriverBase.cs trunk/nhibernate/src/NHibernate/Driver/IDriver.cs trunk/nhibernate/src/NHibernate/Engine/IBatcher.cs trunk/nhibernate/src/NHibernate/Loader/Loader.cs trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj Added Paths: ----------- trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2257/ trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2257/Domain.cs trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2257/Fixture.cs trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2257/Mappings.hbm.xml Modified: trunk/nhibernate/src/NHibernate/AdoNet/AbstractBatcher.cs =================================================================== --- trunk/nhibernate/src/NHibernate/AdoNet/AbstractBatcher.cs 2010-07-28 20:44:14 UTC (rev 5072) +++ trunk/nhibernate/src/NHibernate/AdoNet/AbstractBatcher.cs 2010-07-28 20:57:45 UTC (rev 5073) @@ -222,6 +222,11 @@ } } + public void ExpandQueryParameters(IDbCommand cmd, SqlString sqlString) + { + Driver.ExpandQueryParameters(cmd, sqlString); + } + public IDataReader ExecuteReader(IDbCommand cmd) { CheckReaders(); Modified: trunk/nhibernate/src/NHibernate/Driver/DriverBase.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Driver/DriverBase.cs 2010-07-28 20:44:14 UTC (rev 5072) +++ trunk/nhibernate/src/NHibernate/Driver/DriverBase.cs 2010-07-28 20:57:45 UTC (rev 5073) @@ -208,6 +208,36 @@ return dbParam; } + public virtual void ExpandQueryParameters(IDbCommand cmd, SqlString sqlString) + { + if (UseNamedPrefixInSql) + return; // named parameters are ok + + var expandedParameters = new List<IDbDataParameter>(); + foreach (object part in sqlString.Parts) + { + if (part is Parameter) + { + var parameter = (Parameter)part; + var originalParameter = (IDbDataParameter)cmd.Parameters[parameter.ParameterPosition.Value]; + expandedParameters.Add(CloneParameter(cmd, originalParameter)); + } + } + + cmd.Parameters.Clear(); + foreach (var parameter in expandedParameters) + cmd.Parameters.Add(parameter); + } + + protected virtual IDbDataParameter CloneParameter(IDbCommand cmd, IDbDataParameter originalParameter) + { + var clone = cmd.CreateParameter(); + clone.DbType = originalParameter.DbType; + clone.ParameterName = originalParameter.ParameterName; + clone.Value = originalParameter.Value; + return clone; + } + public void PrepareCommand(IDbCommand command) { OnBeforePrepare(command); Modified: trunk/nhibernate/src/NHibernate/Driver/IDriver.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Driver/IDriver.cs 2010-07-28 20:44:14 UTC (rev 5072) +++ trunk/nhibernate/src/NHibernate/Driver/IDriver.cs 2010-07-28 20:57:45 UTC (rev 5073) @@ -95,5 +95,16 @@ /// <param name="sqlType">The SqlType to set for IDbDataParameter.</param> /// <returns>An IDbDataParameter ready to be added to an IDbCommand.</returns> IDbDataParameter GenerateParameter(IDbCommand command, string name, SqlType sqlType); + + /// <summary> + /// Expand the parameters of the cmd to have a single parameter for each parameter in the + /// sql string + /// </summary> + /// <remarks> + /// This is for databases that do not support named parameters. So, instead of a single parameter + /// for 'select ... from MyTable t where t.Col1 = @p0 and t.Col2 = @p0' we can issue + /// 'select ... from MyTable t where t.Col1 = ? and t.Col2 = ?' + /// </remarks> + void ExpandQueryParameters(IDbCommand cmd, SqlString sqlString); } } \ No newline at end of file Modified: trunk/nhibernate/src/NHibernate/Engine/IBatcher.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Engine/IBatcher.cs 2010-07-28 20:44:14 UTC (rev 5072) +++ trunk/nhibernate/src/NHibernate/Engine/IBatcher.cs 2010-07-28 20:57:45 UTC (rev 5073) @@ -132,6 +132,17 @@ int ExecuteNonQuery(IDbCommand cmd); /// <summary> + /// Expand the parameters of the cmd to have a single parameter for each parameter in the + /// sql string + /// </summary> + /// <remarks> + /// This is for databases that do not support named parameters. So, instead of a single parameter + /// for 'select ... from MyTable t where t.Col1 = @p0 and t.Col2 = @p0' we can issue + /// 'select ... from MyTable t where t.Col1 = ? and t.Col2 = ?' + /// </remarks> + void ExpandQueryParameters(IDbCommand cmd, SqlString sqlString); + + /// <summary> /// Must be called when an exception occurs. /// </summary> /// <param name="e"></param> Modified: trunk/nhibernate/src/NHibernate/Loader/Loader.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Loader/Loader.cs 2010-07-28 20:44:14 UTC (rev 5072) +++ trunk/nhibernate/src/NHibernate/Loader/Loader.cs 2010-07-28 20:57:45 UTC (rev 5073) @@ -1148,6 +1148,8 @@ BindLimitParameters(command, colIndex, selection, session); } + session.Batcher.ExpandQueryParameters(command, sqlString); + if (!useLimit) { SetMaxRows(command, selection); Property changes on: trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2257 ___________________________________________________________________ Added: bugtraq:url + http://jira.nhibernate.org/browse/%BUGID% Added: bugtraq:logregex + NH-\d+ Added: trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2257/Domain.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2257/Domain.cs (rev 0) +++ trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2257/Domain.cs 2010-07-28 20:57:45 UTC (rev 5073) @@ -0,0 +1,11 @@ +using System; + +namespace NHibernate.Test.NHSpecificTest.NH2257 +{ + public class Foo + { + public virtual int Id { get; set; } + public virtual string Name { get; set; } + public virtual int Ord { get; set; } + } +} \ No newline at end of file Added: trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2257/Fixture.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2257/Fixture.cs (rev 0) +++ trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2257/Fixture.cs 2010-07-28 20:57:45 UTC (rev 5073) @@ -0,0 +1,30 @@ +using System.Linq; +using NUnit.Framework; + +namespace NHibernate.Test.NHSpecificTest.NH2257 +{ + public class Fixture : BugTestCase + { + protected override bool AppliesTo(NHibernate.Dialect.Dialect dialect) + { + return (dialect is NHibernate.Dialect.InformixDialect1000); + } + + [Test] + public void InformixUsingDuplicateParameters() + { + using (var session = OpenSession()) + using (var transaction = session.BeginTransaction()) + { + session.Save(new Foo() { Name = "aa" }); + + var list = + session.CreateQuery("from Foo f where f.Name = :p1 and not f.Name <> :p1") + .SetParameter("p1", "aa") + .List<Foo>(); + + Assert.That(list.Count, Is.EqualTo(1)); + } + } + } +} \ No newline at end of file Added: trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2257/Mappings.hbm.xml =================================================================== --- trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2257/Mappings.hbm.xml (rev 0) +++ trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2257/Mappings.hbm.xml 2010-07-28 20:57:45 UTC (rev 5073) @@ -0,0 +1,13 @@ +<?xml version="1.0" encoding="utf-8" ?> +<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" + assembly="NHibernate.Test" + namespace="NHibernate.Test.NHSpecificTest.NH2257"> + + <class name="Foo"> + <id name="Id"> + <generator class="hilo" /> + </id> + <property name="Name"/> + <property name="Ord"/> + </class> +</hibernate-mapping> Modified: trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj =================================================================== --- trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj 2010-07-28 20:44:14 UTC (rev 5072) +++ trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj 2010-07-28 20:57:45 UTC (rev 5073) @@ -774,6 +774,8 @@ <Compile Include="NHSpecificTest\NH2243\Person.cs" /> <Compile Include="NHSpecificTest\NH2251\Domain.cs" /> <Compile Include="NHSpecificTest\NH2251\Fixture.cs" /> + <Compile Include="NHSpecificTest\NH2257\Domain.cs" /> + <Compile Include="NHSpecificTest\NH2257\Fixture.cs" /> <Compile Include="NHSpecificTest\NH473\Child.cs" /> <Compile Include="NHSpecificTest\NH473\Fixture.cs" /> <Compile Include="NHSpecificTest\NH473\Parent.cs" /> @@ -2215,6 +2217,7 @@ <EmbeddedResource Include="DriverTest\SqlServerCeEntity.hbm.xml" /> <EmbeddedResource Include="CollectionTest\NullableValueTypeElementMapFixture.hbm.xml" /> <Content Include="DynamicEntity\package.html" /> + <EmbeddedResource Include="NHSpecificTest\NH2257\Mappings.hbm.xml" /> <EmbeddedResource Include="NHSpecificTest\NH2208\Mappings.hbm.xml" /> <EmbeddedResource Include="NHSpecificTest\NH2251\Mappings.hbm.xml" /> <EmbeddedResource Include="NHSpecificTest\NH2041\Mappings.hbm.xml" /> This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |