Skip to content

Commit 65750bd

Browse files
gliljasfredericDelaporte
authored andcommitted
Adjust string parameter sizes for MSSQL (#1844)
1 parent 3dc082f commit 65750bd

File tree

9 files changed

+520
-2
lines changed

9 files changed

+520
-2
lines changed
Lines changed: 212 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,212 @@
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 = "1", AnsiName = "2", FullText = "3", AnsiFullText = "4" };
86+
await (session.SaveAsync(e1));
87+
await (transaction.CommitAsync());
88+
Assert.That(Driver.LastCommandParameters.Single(x => (string) x.Value == "1").SqlDbType, Is.EqualTo(SqlDbType.NVarChar));
89+
Assert.That(Driver.LastCommandParameters.Single(x => (string) x.Value == "1").Size, Is.EqualTo(3));
90+
Assert.That(Driver.LastCommandParameters.Single(x => (string) x.Value == "2").SqlDbType, Is.EqualTo(SqlDbType.VarChar));
91+
Assert.That(Driver.LastCommandParameters.Single(x => (string) x.Value == "2").Size, Is.EqualTo(3));
92+
Assert.That(Driver.LastCommandParameters.Single(x => (string) x.Value == "3").SqlDbType, Is.EqualTo(SqlDbType.NVarChar));
93+
Assert.That(Driver.LastCommandParameters.Single(x => (string) x.Value == "3").Size, Is.EqualTo(MsSql2000Dialect.MaxSizeForClob));
94+
Assert.That(Driver.LastCommandParameters.Single(x => (string) x.Value == "4").SqlDbType, Is.EqualTo(SqlDbType.VarChar));
95+
Assert.That(Driver.LastCommandParameters.Single(x => (string) x.Value == "4").Size, Is.EqualTo(MsSql2000Dialect.MaxSizeForAnsiClob));
96+
}
97+
}
98+
99+
[Test]
100+
public void InsertWithTooLongValuesShouldThrowAsync()
101+
{
102+
Driver.ClearCommands();
103+
104+
using (var session = OpenSession())
105+
using (var transaction = session.BeginTransaction())
106+
{
107+
var e1 = new Entity { Name = "Alal", AnsiName = "Alal" };
108+
109+
var ex = Assert.ThrowsAsync<GenericADOException>(
110+
async () =>
111+
{
112+
await (session.SaveAsync(e1));
113+
await (transaction.CommitAsync());
114+
});
115+
116+
var sqlEx = ex.InnerException as SqlException;
117+
Assert.That(sqlEx, Is.Not.Null);
118+
Assert.That(sqlEx.Number, Is.EqualTo(8152));
119+
}
120+
}
121+
122+
[TestCase("Name", SqlDbType.NVarChar)]
123+
[TestCase("AnsiName", SqlDbType.VarChar)]
124+
public async Task LinqEqualsShouldUseMappedSizeAsync(string property, SqlDbType expectedDbType, CancellationToken cancellationToken = default(CancellationToken))
125+
{
126+
Driver.ClearCommands();
127+
128+
using (var session = OpenSession())
129+
using (var transaction = session.BeginTransaction())
130+
{
131+
if (property == "Name")
132+
{
133+
await (session.Query<Entity>().Where(x => x.Name == "Bob").ToListAsync(cancellationToken));
134+
}
135+
else
136+
{
137+
await (session.Query<Entity>().Where(x => x.AnsiName == "Bob").ToListAsync(cancellationToken));
138+
}
139+
Assert.That(Driver.LastCommandParameters.First().Size, Is.EqualTo(3));
140+
Assert.That(Driver.LastCommandParameters.First().SqlDbType, Is.EqualTo(expectedDbType));
141+
}
142+
}
143+
144+
[Test]
145+
public async Task MappedAsShouldUseExplicitSizeAsync()
146+
{
147+
Driver.ClearCommands();
148+
149+
using (var session = OpenSession())
150+
using (var transaction = session.BeginTransaction())
151+
{
152+
await (session.Query<Entity>().Where(x => x.Name == "Bob".MappedAs(TypeFactory.Basic("AnsiString(200)"))).ToListAsync());
153+
154+
Assert.That(Driver.LastCommandParameters.First().Size, Is.EqualTo(200));
155+
Assert.That(Driver.LastCommandParameters.First().SqlDbType, Is.EqualTo(SqlDbType.VarChar));
156+
}
157+
}
158+
159+
[TestCase("Name", SqlDbType.NVarChar)]
160+
[TestCase("AnsiName", SqlDbType.VarChar)]
161+
public async Task HqlLikeShouldUseLargerSizeAsync(string property, SqlDbType expectedDbType, CancellationToken cancellationToken = default(CancellationToken))
162+
{
163+
Driver.ClearCommands();
164+
165+
using (var session = OpenSession())
166+
using (var transaction = session.BeginTransaction())
167+
{
168+
await (session.CreateQuery("from Entity where " + property + " like :name").SetParameter("name", "%Bob%").ListAsync<Entity>(cancellationToken));
169+
170+
Assert.That(Driver.LastCommandParameters.First().Size, Is.GreaterThanOrEqualTo(5));
171+
Assert.That(Driver.LastCommandParameters.First().SqlDbType, Is.EqualTo(expectedDbType));
172+
}
173+
}
174+
175+
[TestCase("Name", SqlDbType.NVarChar)]
176+
[TestCase("AnsiName", SqlDbType.VarChar)]
177+
public async Task CriteriaEqualsShouldUseMappedSizeAsync(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+
Driver.ClearCommands();
185+
186+
await (session.CreateCriteria<Entity>().Add(Restrictions.Eq(property, "Bob"))
187+
.ListAsync<Entity>(cancellationToken));
188+
189+
Assert.That(Driver.LastCommandParameters.First().Size, Is.GreaterThanOrEqualTo(3));
190+
Assert.That(Driver.LastCommandParameters.First().SqlDbType, Is.EqualTo(expectedDbType));
191+
}
192+
}
193+
194+
[TestCase("Name", SqlDbType.NVarChar)]
195+
[TestCase("AnsiName", SqlDbType.VarChar)]
196+
public async Task CriteriaLikeShouldUseLargerSizeAsync(string property, SqlDbType expectedDbType, CancellationToken cancellationToken = default(CancellationToken))
197+
{
198+
Driver.ClearCommands();
199+
200+
using (var session = OpenSession())
201+
using (var transaction = session.BeginTransaction())
202+
{
203+
await (session.CreateCriteria<Entity>().Add(Restrictions.Like(property, "%Bob%"))
204+
.ListAsync<Entity>(cancellationToken));
205+
206+
Assert.That(Driver.LastCommandParameters.First().Size, Is.GreaterThanOrEqualTo(5));
207+
Assert.That(Driver.LastCommandParameters.First().SqlDbType, Is.EqualTo(expectedDbType));
208+
}
209+
}
210+
private TestSqlClientDriver Driver => Sfi.ConnectionProvider.Driver as TestSqlClientDriver;
211+
}
212+
}
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
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+
public virtual string FullText { get; set; }
9+
public virtual string AnsiFullText { get; set; }
10+
}
11+
}

0 commit comments

Comments
 (0)