From: <ric...@us...> - 2009-10-08 17:50:32
|
Revision: 4740 http://nhibernate.svn.sourceforge.net/nhibernate/?rev=4740&view=rev Author: ricbrown Date: 2009-10-08 17:50:20 +0000 (Thu, 08 Oct 2009) Log Message: ----------- Fix NH-1964, NH-1983, Blobs and Clobs with Sql Server CE Modified Paths: -------------- branches/2.1.x/nhibernate/src/NHibernate/Driver/SqlServerCeDriver.cs branches/2.1.x/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj Added Paths: ----------- branches/2.1.x/nhibernate/src/NHibernate.Test/DriverTest/SqlServerCeDriverFixture.cs branches/2.1.x/nhibernate/src/NHibernate.Test/DriverTest/SqlServerCeEntity.hbm.xml Modified: branches/2.1.x/nhibernate/src/NHibernate/Driver/SqlServerCeDriver.cs =================================================================== --- branches/2.1.x/nhibernate/src/NHibernate/Driver/SqlServerCeDriver.cs 2009-10-01 12:44:34 UTC (rev 4739) +++ branches/2.1.x/nhibernate/src/NHibernate/Driver/SqlServerCeDriver.cs 2009-10-08 17:50:20 UTC (rev 4740) @@ -1,5 +1,6 @@ using System.Collections.Generic; using System.Data; +using System.Reflection; using NHibernate.Cfg; using NHibernate.SqlCommand; using NHibernate.SqlTypes; @@ -24,11 +25,18 @@ } private bool prepareSql; + private PropertyInfo dbParamSqlDbTypeProperty; public override void Configure(IDictionary<string, string> settings) { base.Configure(settings); prepareSql = PropertiesHelper.GetBoolean(Environment.PrepareSql, settings, false); + + using (IDbCommand cmd = CreateCommand()) + { + IDbDataParameter dbParam = cmd.CreateParameter(); + dbParamSqlDbTypeProperty = dbParam.GetType().GetProperty("SqlDbType"); + } } /// <summary> @@ -94,5 +102,24 @@ { get { return true; } } + + protected override void InitializeParameter(IDbDataParameter dbParam, string name, SqlType sqlType) + { + base.InitializeParameter(dbParam, name, sqlType); + + AdjustDbParamTypeForLargeObjects(dbParam, sqlType); + } + + private void AdjustDbParamTypeForLargeObjects(IDbDataParameter dbParam, SqlType sqlType) + { + if (sqlType is BinaryBlobSqlType) + { + dbParamSqlDbTypeProperty.SetValue(dbParam, SqlDbType.Image, null); + } + else if (sqlType is StringClobSqlType) + { + dbParamSqlDbTypeProperty.SetValue(dbParam, SqlDbType.NText, null); + } + } } } \ No newline at end of file Added: branches/2.1.x/nhibernate/src/NHibernate.Test/DriverTest/SqlServerCeDriverFixture.cs =================================================================== --- branches/2.1.x/nhibernate/src/NHibernate.Test/DriverTest/SqlServerCeDriverFixture.cs (rev 0) +++ branches/2.1.x/nhibernate/src/NHibernate.Test/DriverTest/SqlServerCeDriverFixture.cs 2009-10-08 17:50:20 UTC (rev 4740) @@ -0,0 +1,112 @@ +using System; +using System.Collections; +using NHibernate.Cfg; +using NHibernate.Dialect; +using NUnit.Framework; +using NHibernate.Criterion; +using System.Collections.Generic; + +namespace NHibernate.Test.DriverTest +{ + public class SqlServerCeEntity + { + public virtual int Id { get; set; } + + public virtual string StringProp { get; set; } + public virtual byte[] BinaryProp { get; set; } + + public virtual string StringClob { get; set; } + public virtual byte[] BinaryBlob { get; set; } + } + + [TestFixture] + public class SqlServerCeDriverFixture : TestCase + { + protected override string MappingsAssembly + { + get { return "NHibernate.Test"; } + } + + protected override IList Mappings + { + get { return new[] { "DriverTest.SqlServerCeEntity.hbm.xml" }; } + } + + protected override bool AppliesTo(Dialect.Dialect dialect) + { + return dialect is MsSqlCeDialect; + } + + protected override void OnTearDown() + { + base.OnTearDown(); + + using (ISession s = OpenSession()) + using (ITransaction tx = s.BeginTransaction()) + { + s.Delete("from SqlServerCeEntity"); + tx.Commit(); + } + } + + [Test] + public void SaveLoad() + { + using (ISession s = OpenSession()) + using (ITransaction tx = s.BeginTransaction()) + { + SqlServerCeEntity entity = new SqlServerCeEntity(); + entity.StringProp = "a small string"; + entity.BinaryProp = new byte[100]; + + entity.StringClob = new String('a', 8193); + entity.BinaryBlob = new byte[8193]; + + s.Save(entity); + tx.Commit(); + } + + using (ISession s = OpenSession()) + { + SqlServerCeEntity entity = + s.CreateCriteria(typeof(SqlServerCeEntity)) + .UniqueResult<SqlServerCeEntity>(); + + Assert.That(entity.StringProp, Is.EqualTo("a small string")); + Assert.That(entity.BinaryProp.Length, Is.EqualTo(100)); + + Assert.That(entity.StringClob, Is.EqualTo(new String('a', 8193))); + Assert.That(entity.BinaryBlob.Length, Is.EqualTo(8193)); + } + } + + [Test] + public void Query() + { + using (ISession s = OpenSession()) + using (ITransaction tx = s.BeginTransaction()) + { + SqlServerCeEntity entity = new SqlServerCeEntity(); + entity.StringProp = "a small string"; + entity.BinaryProp = System.Text.ASCIIEncoding.ASCII.GetBytes("binary string"); + + entity.StringClob = new String('a', 8193); + entity.BinaryBlob = new byte[8193]; + + s.Save(entity); + tx.Commit(); + } + + using (ISession s = OpenSession()) + { + IList<SqlServerCeEntity> entities = + s.CreateCriteria(typeof(SqlServerCeEntity)) + .Add(Restrictions.Eq("StringProp", "a small string")) + .Add(Restrictions.Eq("BinaryProp", System.Text.ASCIIEncoding.ASCII.GetBytes("binary string"))) + .List<SqlServerCeEntity>(); + + Assert.That(entities.Count, Is.EqualTo(1)); + } + } + } +} \ No newline at end of file Added: branches/2.1.x/nhibernate/src/NHibernate.Test/DriverTest/SqlServerCeEntity.hbm.xml =================================================================== --- branches/2.1.x/nhibernate/src/NHibernate.Test/DriverTest/SqlServerCeEntity.hbm.xml (rev 0) +++ branches/2.1.x/nhibernate/src/NHibernate.Test/DriverTest/SqlServerCeEntity.hbm.xml 2009-10-08 17:50:20 UTC (rev 4740) @@ -0,0 +1,23 @@ +<?xml version="1.0" encoding="utf-8" ?> +<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" + namespace="NHibernate.Test.DriverTest" + assembly="NHibernate.Test"> + + <class name="SqlServerCeEntity"> + <id name="Id"> + <generator class="native" /> + </id> + + <property name="StringProp"/> <!-- maps to NVARCHAR(255) --> + <property name="BinaryProp"/> <!-- maps to VARBINARY(8000) --> + + <property name="StringClob" type="StringClob"> + <column name="StringClob" sql-type="ntext"/> + </property> + + <property name="BinaryBlob" type="BinaryBlob"> + <column name="BinaryBlob" sql-type="image"/> + </property> + + </class> +</hibernate-mapping> Modified: branches/2.1.x/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj =================================================================== --- branches/2.1.x/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj 2009-10-01 12:44:34 UTC (rev 4739) +++ branches/2.1.x/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj 2009-10-08 17:50:20 UTC (rev 4740) @@ -105,6 +105,7 @@ <Compile Include="CfgTest\ConfigurationSchemaFixture.cs" /> <Compile Include="CfgTest\ConfigurationSerializationTests.cs" /> <Compile Include="CfgTest\DefaultNsAssmFixture.cs" /> + <Compile Include="DriverTest\SqlServerCeDriverFixture.cs" /> <Compile Include="FilterTest\ConfigFixture.cs" /> <Compile Include="FilterTest\FilterSecondPassArgsFixture.cs" /> <Compile Include="CfgTest\HbmBinderFixture.cs" /> @@ -1992,6 +1993,7 @@ <EmbeddedResource Include="Classic\EntityWithLifecycle.hbm.xml" /> <EmbeddedResource Include="Bytecode\Lightweight\ProductLine.hbm.xml" /> <EmbeddedResource Include="DriverTest\MultiTypeEntity.hbm.xml" /> + <EmbeddedResource Include="DriverTest\SqlServerCeEntity.hbm.xml" /> <Content Include="DynamicEntity\package.html" /> <EmbeddedResource Include="NHSpecificTest\NH1959\Mappings.hbm.xml" /> <EmbeddedResource Include="NHSpecificTest\NH1948\Mappings.hbm.xml" /> This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |