Skip to content

Commit 43f8514

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

File tree

9 files changed

+473
-2
lines changed

9 files changed

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

0 commit comments

Comments
 (0)