Skip to content

Commit 4a2fe1b

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

File tree

9 files changed

+539
-2
lines changed

9 files changed

+539
-2
lines changed
Lines changed: 228 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,228 @@
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 NHibernate.Type;
23+
using NUnit.Framework;
24+
25+
namespace NHibernate.Test.NHSpecificTest.GH1300
26+
{
27+
using System.Threading.Tasks;
28+
using System.Threading;
29+
[TestFixture]
30+
public class FixtureAsync : BugTestCase
31+
{
32+
protected override bool AppliesTo(Dialect.Dialect dialect)
33+
{
34+
return dialect is MsSql2000Dialect;
35+
}
36+
37+
protected override bool AppliesTo(ISessionFactoryImplementor factory)
38+
{
39+
return factory.ConnectionProvider.Driver is SqlClientDriver;
40+
}
41+
42+
protected override void Configure(Configuration configuration)
43+
{
44+
using (var cp = ConnectionProviderFactory.NewConnectionProvider(cfg.Properties))
45+
{
46+
if (cp.Driver is SqlClientDriver)
47+
{
48+
configuration.SetProperty(Environment.ConnectionDriver, typeof(TestSqlClientDriver).AssemblyQualifiedName);
49+
}
50+
}
51+
}
52+
53+
protected override void OnTearDown()
54+
{
55+
using (var session = OpenSession())
56+
using (var transaction = session.BeginTransaction())
57+
{
58+
session.Delete("from System.Object");
59+
60+
session.Flush();
61+
transaction.Commit();
62+
}
63+
}
64+
65+
protected override void OnSetUp()
66+
{
67+
base.OnSetUp();
68+
using (var session = OpenSession())
69+
using (var transaction = session.BeginTransaction())
70+
{
71+
var e1 = new Entity { Name = "Bob" };
72+
session.Save(e1);
73+
transaction.Commit();
74+
}
75+
}
76+
77+
[Test]
78+
public async Task InsertShouldUseMappedSizeAsync()
79+
{
80+
Driver.ClearCommands();
81+
82+
using (var session = OpenSession())
83+
using (var transaction = session.BeginTransaction())
84+
{
85+
var e1 = new Entity { Name = "Al", AnsiName = "Al" };
86+
await (session.SaveAsync(e1));
87+
await (transaction.CommitAsync());
88+
Assert.That(Driver.LastCommandParameters.First().SqlDbType, Is.EqualTo(SqlDbType.NVarChar));
89+
Assert.That(Driver.LastCommandParameters.First().Size, Is.EqualTo(3));
90+
Assert.That(Driver.LastCommandParameters.Last().SqlDbType, Is.EqualTo(SqlDbType.VarChar));
91+
Assert.That(Driver.LastCommandParameters.Last().Size, Is.EqualTo(3));
92+
}
93+
}
94+
95+
[Test]
96+
public void InsertWithTooLongValuesShouldThrowAsync()
97+
{
98+
Driver.ClearCommands();
99+
100+
using (var session = OpenSession())
101+
using (var transaction = session.BeginTransaction())
102+
{
103+
var e1 = new Entity { Name = "Alal", AnsiName = "Alal" };
104+
105+
var ex = Assert.ThrowsAsync<GenericADOException>(
106+
async () =>
107+
{
108+
await (session.SaveAsync(e1));
109+
await (transaction.CommitAsync());
110+
});
111+
112+
var sqlEx = ex.InnerException as SqlException;
113+
Assert.That(sqlEx, Is.Not.Null);
114+
Assert.That(sqlEx.Number, Is.EqualTo(8152));
115+
}
116+
}
117+
118+
[TestCase("Name", SqlDbType.NVarChar)]
119+
[TestCase("AnsiName", SqlDbType.VarChar)]
120+
public async Task LinqEqualsShouldUseMappedSizeAsync(string property, SqlDbType expectedDbType, CancellationToken cancellationToken = default(CancellationToken))
121+
{
122+
Driver.ClearCommands();
123+
124+
using (var session = OpenSession())
125+
using (var transaction = session.BeginTransaction())
126+
{
127+
if (property == "Name")
128+
{
129+
await (session.Query<Entity>().Where(x => x.Name == "Bob").ToListAsync(cancellationToken));
130+
}
131+
else
132+
{
133+
await (session.Query<Entity>().Where(x => x.AnsiName == "Bob").ToListAsync(cancellationToken));
134+
}
135+
Assert.That(Driver.LastCommandParameters.First().Size, Is.EqualTo(3));
136+
Assert.That(Driver.LastCommandParameters.First().SqlDbType, Is.EqualTo(expectedDbType));
137+
}
138+
}
139+
140+
[Test]
141+
public async Task MappedAsShouldUseExplicitSizeAsync()
142+
{
143+
Driver.ClearCommands();
144+
145+
using (var session = OpenSession())
146+
using (var transaction = session.BeginTransaction())
147+
{
148+
await (session.Query<Entity>().Where(x => x.Name == "Bob".MappedAs(TypeFactory.Basic("AnsiString(200)"))).ToListAsync());
149+
150+
Assert.That(Driver.LastCommandParameters.First().Size, Is.EqualTo(200));
151+
Assert.That(Driver.LastCommandParameters.First().SqlDbType, Is.EqualTo(SqlDbType.VarChar));
152+
}
153+
}
154+
155+
[Test]
156+
public async Task LongStringCausesClobSizedParameterAsync()
157+
{
158+
Driver.ClearCommands();
159+
160+
using (var session = OpenSession())
161+
using (var transaction = session.BeginTransaction())
162+
{
163+
await (session.Query<Entity>().Where(x => x.Name == new string('x', MsSql2000Dialect.MaxSizeForLengthLimitedString + 1)).ToListAsync());
164+
165+
Assert.That(Driver.LastCommandParameters.First().Size, Is.EqualTo(MsSql2000Dialect.MaxSizeForClob));
166+
Assert.That(Driver.LastCommandParameters.First().SqlDbType, Is.EqualTo(SqlDbType.NVarChar));
167+
168+
await (session.Query<Entity>().Where(x => x.AnsiName == new string('x', MsSql2000Dialect.MaxSizeForLengthLimitedAnsiString + 1)).ToListAsync());
169+
170+
Assert.That(Driver.LastCommandParameters.First().Size, Is.EqualTo(MsSql2000Dialect.MaxSizeForAnsiClob));
171+
Assert.That(Driver.LastCommandParameters.First().SqlDbType, Is.EqualTo(SqlDbType.VarChar));
172+
}
173+
}
174+
175+
[TestCase("Name", SqlDbType.NVarChar)]
176+
[TestCase("AnsiName", SqlDbType.VarChar)]
177+
public async Task HqlLikeShouldUseLargerSizeAsync(string property, SqlDbType expectedDbType, CancellationToken cancellationToken = default(CancellationToken))
178+
{
179+
Driver.ClearCommands();
180+
181+
using (var session = OpenSession())
182+
using (var transaction = session.BeginTransaction())
183+
{
184+
await (session.CreateQuery("from Entity where " + property + " like :name").SetParameter("name", "%Bob%").ListAsync<Entity>(cancellationToken));
185+
186+
Assert.That(Driver.LastCommandParameters.First().Size, Is.GreaterThanOrEqualTo(5));
187+
Assert.That(Driver.LastCommandParameters.First().SqlDbType, Is.EqualTo(expectedDbType));
188+
}
189+
}
190+
191+
[TestCase("Name", SqlDbType.NVarChar)]
192+
[TestCase("AnsiName", SqlDbType.VarChar)]
193+
public async Task CriteriaEqualsShouldUseMappedSizeAsync(string property, SqlDbType expectedDbType, CancellationToken cancellationToken = default(CancellationToken))
194+
{
195+
Driver.ClearCommands();
196+
197+
using (var session = OpenSession())
198+
using (var transaction = session.BeginTransaction())
199+
{
200+
Driver.ClearCommands();
201+
202+
await (session.CreateCriteria<Entity>().Add(Restrictions.Eq(property, "Bob"))
203+
.ListAsync<Entity>(cancellationToken));
204+
205+
Assert.That(Driver.LastCommandParameters.First().Size, Is.GreaterThanOrEqualTo(3));
206+
Assert.That(Driver.LastCommandParameters.First().SqlDbType, Is.EqualTo(expectedDbType));
207+
}
208+
}
209+
210+
[TestCase("Name", SqlDbType.NVarChar)]
211+
[TestCase("AnsiName", SqlDbType.VarChar)]
212+
public async Task CriteriaLikeShouldUseLargerSizeAsync(string property, SqlDbType expectedDbType, CancellationToken cancellationToken = default(CancellationToken))
213+
{
214+
Driver.ClearCommands();
215+
216+
using (var session = OpenSession())
217+
using (var transaction = session.BeginTransaction())
218+
{
219+
await (session.CreateCriteria<Entity>().Add(Restrictions.Like(property, "%Bob%"))
220+
.ListAsync<Entity>(cancellationToken));
221+
222+
Assert.That(Driver.LastCommandParameters.First().Size, Is.GreaterThanOrEqualTo(5));
223+
Assert.That(Driver.LastCommandParameters.First().SqlDbType, Is.EqualTo(expectedDbType));
224+
}
225+
}
226+
private TestSqlClientDriver Driver => Sfi.ConnectionProvider.Driver as TestSqlClientDriver;
227+
}
228+
}
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
namespace NHibernate.Test.NHSpecificTest.GH1300
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+
}

0 commit comments

Comments
 (0)