Skip to content

Commit 522013a

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

File tree

9 files changed

+466
-3
lines changed

9 files changed

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