Skip to content

Commit b3a44d5

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

File tree

9 files changed

+459
-2
lines changed

9 files changed

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