Skip to content

Commit d6646ca

Browse files
committed
Adjusting string parameter sizes for MSSQL
1 parent eb2adba commit d6646ca

File tree

9 files changed

+449
-2
lines changed

9 files changed

+449
-2
lines changed
Lines changed: 183 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,183 @@
1+
//------------------------------------------------------------------------------
2+
// <auto-generated>
3+
// This code was generated by AsyncGenerator.
4+
//
5+
// Changes to this file may cause incorrect behavior and will be lost if
6+
// the code is regenerated.
7+
// </auto-generated>
8+
//------------------------------------------------------------------------------
9+
10+
11+
using System.Data;
12+
using System.Data.SqlClient;
13+
using System.Linq;
14+
using NHibernate.Cfg;
15+
using NHibernate.Criterion;
16+
using NHibernate.Dialect;
17+
using NHibernate.Driver;
18+
using NHibernate.Engine;
19+
using NHibernate.Exceptions;
20+
using NHibernate.Linq;
21+
using NUnit.Framework;
22+
23+
namespace NHibernate.Test.NHSpecificTest.NH3403
24+
{
25+
using System.Threading.Tasks;
26+
using System.Threading;
27+
[TestFixture]
28+
public class FixtureAsync : BugTestCase
29+
{
30+
protected override bool AppliesTo(ISessionFactoryImplementor factory)
31+
{
32+
return factory.ConnectionProvider.Driver is SqlClientDriver;
33+
}
34+
35+
protected override void Configure(Configuration configuration)
36+
{
37+
cfg.SetProperty(Environment.ConnectionDriver, typeof(TestSqlClientDriver).AssemblyQualifiedName);
38+
}
39+
40+
protected override void OnTearDown()
41+
{
42+
using (ISession session = OpenSession())
43+
using (ITransaction transaction = session.BeginTransaction())
44+
{
45+
session.Delete("from System.Object");
46+
47+
session.Flush();
48+
transaction.Commit();
49+
}
50+
}
51+
52+
protected override void OnSetUp()
53+
{
54+
base.OnSetUp();
55+
using (ISession session = OpenSession())
56+
using (ITransaction transaction = session.BeginTransaction())
57+
{
58+
var e1 = new Entity { Name = "Bob" };
59+
session.Save(e1);
60+
transaction.Commit();
61+
}
62+
}
63+
64+
[Test]
65+
public async Task InsertShouldUseMappedSizeAsync()
66+
{
67+
Driver.ClearCommands();
68+
69+
using (ISession session = OpenSession())
70+
using (ITransaction transaction = session.BeginTransaction())
71+
{
72+
var e1 = new Entity { Name = "Al", AnsiName = "Al" };
73+
await (session.SaveAsync(e1));
74+
await (transaction.CommitAsync());
75+
Assert.AreEqual(SqlDbType.NVarChar, Driver.LastCommandParameters.First().SqlDbType);
76+
Assert.AreEqual(3, Driver.LastCommandParameters.First().Size);
77+
Assert.AreEqual(SqlDbType.VarChar, Driver.LastCommandParameters.Last().SqlDbType);
78+
Assert.AreEqual(3, Driver.LastCommandParameters.Last().Size);
79+
}
80+
}
81+
82+
[Test]
83+
public void InsertWithTooLongValuesShouldThrowAsync()
84+
{
85+
Driver.ClearCommands();
86+
87+
using (ISession session = OpenSession())
88+
using (ITransaction transaction = session.BeginTransaction())
89+
{
90+
var e1 = new Entity { Name = "Alal", AnsiName = "Alal" };
91+
92+
var ex = Assert.ThrowsAsync<GenericADOException>(
93+
async () =>
94+
{
95+
await (session.SaveAsync(e1));
96+
await (transaction.CommitAsync());
97+
});
98+
99+
var sqlEx = ex.InnerException as SqlException;
100+
Assert.IsNotNull(sqlEx);
101+
Assert.That(sqlEx.Number, Is.EqualTo(8152));
102+
}
103+
}
104+
105+
[TestCase("Name", SqlDbType.NVarChar)]
106+
[TestCase("AnsiName", SqlDbType.VarChar)]
107+
public async Task LinqEqualsShouldUseMappedSizeAsync(string property, SqlDbType expectedDbType, CancellationToken cancellationToken = default(CancellationToken))
108+
{
109+
Driver.ClearCommands();
110+
111+
using (ISession session = OpenSession())
112+
using (ITransaction transaction = session.BeginTransaction())
113+
{
114+
if (property == "Name")
115+
{
116+
await (session.Query<Entity>().Where(x => x.Name == "Bob").ToListAsync(cancellationToken));
117+
}
118+
else
119+
{
120+
await (session.Query<Entity>().Where(x => x.AnsiName == "Bob").ToListAsync(cancellationToken));
121+
}
122+
Assert.AreEqual(3, Driver.LastCommandParameters.First().Size);
123+
Assert.AreEqual(expectedDbType, Driver.LastCommandParameters.First().SqlDbType);
124+
}
125+
}
126+
127+
[TestCase("Name", SqlDbType.NVarChar)]
128+
[TestCase("AnsiName", SqlDbType.VarChar)]
129+
public async Task HqlLikeShouldUseLargerSizeAsync(string property, SqlDbType expectedDbType, CancellationToken cancellationToken = default(CancellationToken))
130+
{
131+
Driver.ClearCommands();
132+
133+
using (ISession session = OpenSession())
134+
using (ITransaction transaction = session.BeginTransaction())
135+
{
136+
await (session.CreateQuery("from Entity where " + property + " like :name").SetParameter("name", "%Bob%").ListAsync<Entity>(cancellationToken));
137+
138+
Assert.GreaterOrEqual(Driver.LastCommandParameters.First().Size, 5);
139+
Assert.AreEqual(expectedDbType, Driver.LastCommandParameters.First().SqlDbType);
140+
}
141+
}
142+
143+
[TestCase("Name", SqlDbType.NVarChar)]
144+
[TestCase("AnsiName", SqlDbType.VarChar)]
145+
public async Task CriteriaEqualsShouldUseMappedSizeAsync(string property, SqlDbType expectedDbType, CancellationToken cancellationToken = default(CancellationToken))
146+
{
147+
Driver.ClearCommands();
148+
149+
using (ISession session = OpenSession())
150+
using (ITransaction transaction = session.BeginTransaction())
151+
{
152+
Driver.ClearCommands();
153+
154+
await (session.CreateCriteria<Entity>().Add(Restrictions.Eq(property, "Bob"))
155+
.ListAsync<Entity>(cancellationToken));
156+
157+
Assert.GreaterOrEqual(Driver.LastCommandParameters.First().Size, 3);
158+
Assert.AreEqual(expectedDbType, Driver.LastCommandParameters.First().SqlDbType);
159+
}
160+
}
161+
162+
[TestCase("Name", SqlDbType.NVarChar)]
163+
[TestCase("AnsiName", SqlDbType.VarChar)]
164+
public async Task CriteriaLikeShouldUseLargerSizeAsync(string property, SqlDbType expectedDbType, CancellationToken cancellationToken = default(CancellationToken))
165+
{
166+
Driver.ClearCommands();
167+
168+
using (ISession session = OpenSession())
169+
using (ITransaction transaction = session.BeginTransaction())
170+
{
171+
await (session.CreateCriteria<Entity>().Add(Restrictions.Like(property, "%Bob%"))
172+
.ListAsync<Entity>(cancellationToken));
173+
174+
Assert.GreaterOrEqual(Driver.LastCommandParameters.First().Size, 5);
175+
Assert.AreEqual(expectedDbType, Driver.LastCommandParameters.First().SqlDbType);
176+
}
177+
}
178+
private TestSqlClientDriver Driver
179+
{
180+
get { return Sfi.ConnectionProvider.Driver as TestSqlClientDriver; }
181+
}
182+
}
183+
}
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
namespace NHibernate.Test.NHSpecificTest.NH3403
2+
{
3+
class Entity
4+
{
5+
public virtual int Id { get; set; }
6+
public virtual string Name { get; set; }
7+
public virtual string AnsiName { get; set; }
8+
}
9+
}
Lines changed: 171 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,171 @@
1+
using System.Data;
2+
using System.Data.SqlClient;
3+
using System.Linq;
4+
using NHibernate.Cfg;
5+
using NHibernate.Criterion;
6+
using NHibernate.Dialect;
7+
using NHibernate.Driver;
8+
using NHibernate.Engine;
9+
using NHibernate.Exceptions;
10+
using NHibernate.Linq;
11+
using NUnit.Framework;
12+
13+
namespace NHibernate.Test.NHSpecificTest.NH3403
14+
{
15+
[TestFixture]
16+
public class Fixture : BugTestCase
17+
{
18+
protected override bool AppliesTo(ISessionFactoryImplementor factory)
19+
{
20+
return factory.ConnectionProvider.Driver is SqlClientDriver;
21+
}
22+
23+
protected override void Configure(Configuration configuration)
24+
{
25+
cfg.SetProperty(Environment.ConnectionDriver, typeof(TestSqlClientDriver).AssemblyQualifiedName);
26+
}
27+
28+
protected override void OnTearDown()
29+
{
30+
using (ISession session = OpenSession())
31+
using (ITransaction transaction = session.BeginTransaction())
32+
{
33+
session.Delete("from System.Object");
34+
35+
session.Flush();
36+
transaction.Commit();
37+
}
38+
}
39+
40+
protected override void OnSetUp()
41+
{
42+
base.OnSetUp();
43+
using (ISession session = OpenSession())
44+
using (ITransaction transaction = session.BeginTransaction())
45+
{
46+
var e1 = new Entity { Name = "Bob" };
47+
session.Save(e1);
48+
transaction.Commit();
49+
}
50+
}
51+
52+
[Test]
53+
public void InsertShouldUseMappedSize()
54+
{
55+
Driver.ClearCommands();
56+
57+
using (ISession session = OpenSession())
58+
using (ITransaction transaction = session.BeginTransaction())
59+
{
60+
var e1 = new Entity { Name = "Al", AnsiName = "Al" };
61+
session.Save(e1);
62+
transaction.Commit();
63+
Assert.AreEqual(SqlDbType.NVarChar, Driver.LastCommandParameters.First().SqlDbType);
64+
Assert.AreEqual(3, Driver.LastCommandParameters.First().Size);
65+
Assert.AreEqual(SqlDbType.VarChar, Driver.LastCommandParameters.Last().SqlDbType);
66+
Assert.AreEqual(3, Driver.LastCommandParameters.Last().Size);
67+
}
68+
}
69+
70+
[Test]
71+
public void InsertWithTooLongValuesShouldThrow()
72+
{
73+
Driver.ClearCommands();
74+
75+
using (ISession session = OpenSession())
76+
using (ITransaction transaction = session.BeginTransaction())
77+
{
78+
var e1 = new Entity { Name = "Alal", AnsiName = "Alal" };
79+
80+
var ex = Assert.Throws<GenericADOException>(
81+
() =>
82+
{
83+
session.Save(e1);
84+
transaction.Commit();
85+
});
86+
87+
var sqlEx = ex.InnerException as SqlException;
88+
Assert.IsNotNull(sqlEx);
89+
Assert.That(sqlEx.Number, Is.EqualTo(8152));
90+
}
91+
}
92+
93+
[TestCase("Name", SqlDbType.NVarChar)]
94+
[TestCase("AnsiName", SqlDbType.VarChar)]
95+
public void LinqEqualsShouldUseMappedSize(string property, SqlDbType expectedDbType)
96+
{
97+
Driver.ClearCommands();
98+
99+
using (ISession session = OpenSession())
100+
using (ITransaction transaction = session.BeginTransaction())
101+
{
102+
if (property == "Name")
103+
{
104+
session.Query<Entity>().Where(x => x.Name == "Bob").ToList();
105+
}
106+
else
107+
{
108+
session.Query<Entity>().Where(x => x.AnsiName == "Bob").ToList();
109+
}
110+
Assert.AreEqual(3, Driver.LastCommandParameters.First().Size);
111+
Assert.AreEqual(expectedDbType, Driver.LastCommandParameters.First().SqlDbType);
112+
}
113+
}
114+
115+
[TestCase("Name", SqlDbType.NVarChar)]
116+
[TestCase("AnsiName", SqlDbType.VarChar)]
117+
public void HqlLikeShouldUseLargerSize(string property, SqlDbType expectedDbType)
118+
{
119+
Driver.ClearCommands();
120+
121+
using (ISession session = OpenSession())
122+
using (ITransaction transaction = session.BeginTransaction())
123+
{
124+
session.CreateQuery("from Entity where " + property + " like :name").SetParameter("name", "%Bob%").List<Entity>();
125+
126+
Assert.GreaterOrEqual(Driver.LastCommandParameters.First().Size, 5);
127+
Assert.AreEqual(expectedDbType, Driver.LastCommandParameters.First().SqlDbType);
128+
}
129+
}
130+
131+
[TestCase("Name", SqlDbType.NVarChar)]
132+
[TestCase("AnsiName", SqlDbType.VarChar)]
133+
public void CriteriaEqualsShouldUseMappedSize(string property, SqlDbType expectedDbType)
134+
{
135+
Driver.ClearCommands();
136+
137+
using (ISession session = OpenSession())
138+
using (ITransaction transaction = session.BeginTransaction())
139+
{
140+
Driver.ClearCommands();
141+
142+
session.CreateCriteria<Entity>().Add(Restrictions.Eq(property, "Bob"))
143+
.List<Entity>();
144+
145+
Assert.GreaterOrEqual(Driver.LastCommandParameters.First().Size, 3);
146+
Assert.AreEqual(expectedDbType, Driver.LastCommandParameters.First().SqlDbType);
147+
}
148+
}
149+
150+
[TestCase("Name", SqlDbType.NVarChar)]
151+
[TestCase("AnsiName", SqlDbType.VarChar)]
152+
public void CriteriaLikeShouldUseLargerSize(string property, SqlDbType expectedDbType)
153+
{
154+
Driver.ClearCommands();
155+
156+
using (ISession session = OpenSession())
157+
using (ITransaction transaction = session.BeginTransaction())
158+
{
159+
session.CreateCriteria<Entity>().Add(Restrictions.Like(property, "%Bob%"))
160+
.List<Entity>();
161+
162+
Assert.GreaterOrEqual(Driver.LastCommandParameters.First().Size, 5);
163+
Assert.AreEqual(expectedDbType, Driver.LastCommandParameters.First().SqlDbType);
164+
}
165+
}
166+
private TestSqlClientDriver Driver
167+
{
168+
get { return Sfi.ConnectionProvider.Driver as TestSqlClientDriver; }
169+
}
170+
}
171+
}
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
<?xml version="1.0" encoding="utf-8" ?>
2+
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" assembly="NHibernate.Test" namespace="NHibernate.Test.NHSpecificTest.NH3403">
3+
4+
<class name="Entity">
5+
<id name="Id" generator="native" />
6+
<property name="Name" length="3"/>
7+
<property name="AnsiName" length="3" type="AnsiString"/>
8+
</class>
9+
10+
</hibernate-mapping>

0 commit comments

Comments
 (0)