Skip to content

Commit 04c4d52

Browse files
authored
Fix incorrect parameter length for char types in MicrosoftDataSqlClientDriver (nhibernate#3360)
* Run tests for MicrosoftDataSqlClientDriver * Fix character parameter lengths for MicrosoftDataSqlClientDriver
1 parent 5e1ff9f commit 04c4d52

File tree

7 files changed

+49
-4
lines changed

7 files changed

+49
-4
lines changed

.github/workflows/NetCoreTests.yml

+4
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,10 @@ jobs:
1212
CONNECTION_STRING: "Server=localhost;initial catalog=nhibernate;User Id=sa;Password=P@ssw0rd;packet size=4096;"
1313
DB_INIT: |
1414
docker run -e "ACCEPT_EULA=Y" -e "SA_PASSWORD=P@ssw0rd" -e "MSSQL_PID=Express" -p 1433:1433 -d --name sqlexpress mcr.microsoft.com/mssql/server:2019-latest;
15+
- DB: SqlServer2008-MicrosoftDataSqlClientDriver
16+
CONNECTION_STRING: "Server=localhost;initial catalog=nhibernate;User Id=sa;Password=P@ssw0rd;packet size=4096;"
17+
DB_INIT: |
18+
docker run -e "ACCEPT_EULA=Y" -e "SA_PASSWORD=P@ssw0rd" -e "MSSQL_PID=Express" -p 1433:1433 -d --name sqlexpress mcr.microsoft.com/mssql/server:2019-latest;
1519
- DB: PostgreSQL
1620
CONNECTION_STRING: "Host=localhost;Username=nhibernate;Password=nhibernate;Database=nhibernate;Enlist=true;"
1721
DB_INIT: |

appveyor.yml

+4
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@ environment:
44
matrix:
55
- DB: SqlServer2008
66
CONNECTION_STRING: Server=(local)\SQL2017;User ID=sa;Password=Password12!;initial catalog=nhibernate;
7+
- DB: SqlServer2008-MicrosoftDataSqlClientDriver
8+
CONNECTION_STRING: Server=(local)\SQL2017;User ID=sa;Password=Password12!;initial catalog=nhibernate;
79
- DB: PostgreSQL
810
CONNECTION_STRING: Host=localhost;Port=5432;Username=postgres;Password=Password12!;Database=nhibernate;Enlist=true;
911
- DB: Firebird
@@ -73,7 +75,9 @@ before_test:
7375
Start-Service 'postgresql-x64-10'
7476
}
7577
'SqlServer2008' { Start-Service 'MSSQL$SQL2017' }
78+
'SqlServer2008-MicrosoftDataSqlClientDriver' { Start-Service 'MSSQL$SQL2017' }
7679
'SqlServer2012' { Start-Service 'MSSQL$SQL2017' }
80+
'SqlServer2012-MicrosoftDataSqlClientDriver' { Start-Service 'MSSQL$SQL2017' }
7781
'SQLite' { }
7882
}
7983
test_script:

psake.ps1

+13
Original file line numberDiff line numberDiff line change
@@ -63,9 +63,22 @@ Task Set-Configuration {
6363
};
6464
'SqlServer2008' = @{
6565
'connection.connection_string' = 'Server=(local)\SQL2017;User ID=sa;Password=Password12!;initial catalog=nhibernate;'
66+
'connection.driver_class' = 'NHibernate.Driver.Sql2008ClientDriver';
67+
'dialect' = 'NHibernate.Dialect.MsSql2008Dialect'
6668
};
6769
'SqlServer2012' = @{
6870
'connection.connection_string' = 'Server=(local)\SQL2017;User ID=sa;Password=Password12!;initial catalog=nhibernate;';
71+
'connection.driver_class' = 'NHibernate.Driver.Sql2008ClientDriver';
72+
'dialect' = 'NHibernate.Dialect.MsSql2012Dialect'
73+
};
74+
'SqlServer2008-MicrosoftDataSqlClientDriver' = @{
75+
'connection.connection_string' = 'Server=(local)\SQL2017;User ID=sa;Password=Password12!;initial catalog=nhibernate;'
76+
'connection.driver_class' = 'NHibernate.Driver.MicrosoftDataSqlClientDriver';
77+
'dialect' = 'NHibernate.Dialect.MsSql2008Dialect'
78+
};
79+
'SqlServer2012-MicrosoftDataSqlClientDriver' = @{
80+
'connection.connection_string' = 'Server=(local)\SQL2017;User ID=sa;Password=Password12!;initial catalog=nhibernate;';
81+
'connection.driver_class' = 'NHibernate.Driver.MicrosoftDataSqlClientDriver';
6982
'dialect' = 'NHibernate.Dialect.MsSql2012Dialect'
7083
};
7184
'Oracle' = @{

src/NHibernate.TestDatabaseSetup/TestDatabaseSetup.cs

+1
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ public class DatabaseSetup
2323
{
2424
{"NHibernate.Driver.SqlClientDriver", SetupSqlServer},
2525
{"NHibernate.Driver.Sql2008ClientDriver", SetupSqlServer},
26+
{"NHibernate.Driver.MicrosoftDataSqlClientDriver", SetupSqlServer},
2627
{"NHibernate.Driver.FirebirdClientDriver", SetupFirebird},
2728
{"NHibernate.Driver.NpgsqlDriver", SetupNpgsql},
2829
{"NHibernate.Driver.OracleDataClientDriver", SetupOracle},

src/NHibernate/Driver/MicrosoftDataSqlClientDriver.cs

+14-2
Original file line numberDiff line numberDiff line change
@@ -112,7 +112,7 @@ protected override void InitializeParameter(DbParameter dbParam, string name, Sq
112112
case DbType.AnsiStringFixedLength:
113113
dbParam.Size = IsAnsiText(dbParam, sqlType)
114114
? MsSql2000Dialect.MaxSizeForAnsiClob
115-
: MsSql2000Dialect.MaxSizeForLengthLimitedAnsiString;
115+
: IsChar(dbParam, sqlType) ? sqlType.Length : MsSql2000Dialect.MaxSizeForLengthLimitedAnsiString;
116116
break;
117117
case DbType.Binary:
118118
dbParam.Size = IsBlob(dbParam, sqlType)
@@ -130,7 +130,7 @@ protected override void InitializeParameter(DbParameter dbParam, string name, Sq
130130
case DbType.StringFixedLength:
131131
dbParam.Size = IsText(dbParam, sqlType)
132132
? MsSql2000Dialect.MaxSizeForClob
133-
: MsSql2000Dialect.MaxSizeForLengthLimitedString;
133+
: IsChar(dbParam, sqlType) ? sqlType.Length : MsSql2000Dialect.MaxSizeForLengthLimitedString;
134134
break;
135135
case DbType.DateTime2:
136136
dbParam.Size = MsSql2000Dialect.MaxDateTime2;
@@ -199,6 +199,18 @@ protected static bool IsBlob(DbParameter dbParam, SqlType sqlType)
199199
return sqlType is BinaryBlobSqlType || DbType.Binary == dbParam.DbType && sqlType.LengthDefined &&
200200
sqlType.Length > MsSql2000Dialect.MaxSizeForLengthLimitedBinary;
201201
}
202+
203+
/// <summary>
204+
/// Interprets if a parameter is a character (for the purposes of setting its default size)
205+
/// </summary>
206+
/// <param name="dbParam">The parameter</param>
207+
/// <param name="sqlType">The <see cref="SqlType" /> of the parameter</param>
208+
/// <returns>True, if the parameter should be interpreted as a character, otherwise False</returns>
209+
protected static bool IsChar(DbParameter dbParam, SqlType sqlType)
210+
{
211+
return sqlType.LengthDefined && sqlType.Length == 1 &&
212+
(dbParam.DbType == DbType.StringFixedLength || dbParam.DbType == DbType.AnsiStringFixedLength);
213+
}
202214

203215
/// <inheritdoc />
204216
public override IResultSetsCommand GetResultSetsCommand(ISessionImplementor session)

src/NHibernate/Driver/SqlClientDriver.cs

+2-2
Original file line numberDiff line numberDiff line change
@@ -295,8 +295,8 @@ protected static bool IsBlob(DbParameter dbParam, SqlType sqlType)
295295
/// <returns>True, if the parameter should be interpreted as a character, otherwise False</returns>
296296
protected static bool IsChar(DbParameter dbParam, SqlType sqlType)
297297
{
298-
return (DbType.StringFixedLength == dbParam.DbType || DbType.AnsiStringFixedLength == dbParam.DbType) &&
299-
sqlType.LengthDefined && sqlType.Length == 1;
298+
return sqlType.LengthDefined && sqlType.Length == 1 &&
299+
(dbParam.DbType == DbType.StringFixedLength || dbParam.DbType == DbType.AnsiStringFixedLength);
300300
}
301301

302302
public override IResultSetsCommand GetResultSetsCommand(ISessionImplementor session)

teamcity.build

+11
Original file line numberDiff line numberDiff line change
@@ -67,11 +67,22 @@
6767
<property name="nhibernate.connection.driver_class" value="NHibernate.Driver.Sql2008ClientDriver" />
6868
</target>
6969

70+
<target name="setup-teamcity-sqlServer-MicrosoftDataSqlClientDriver">
71+
<property name="db-service" value="MSSQL$SQLEXPRESS" />
72+
<property name="nhibernate.connection.driver_class" value="NHibernate.Driver.MicrosoftDataSqlClientDriver" />
73+
</target>
74+
7075
<target name="setup-teamcity-sqlServer2012">
7176
<property name="db-service" value="MSSQL$SQLEXPRESS" />
7277
<property name="nhibernate.dialect" value="NHibernate.Dialect.MsSql2012Dialect" />
7378
</target>
7479

80+
<target name="setup-teamcity-sqlServer2012-MicrosoftDataSqlClientDriver">
81+
<property name="db-service" value="MSSQL$SQLEXPRESS" />
82+
<property name="nhibernate.dialect" value="NHibernate.Dialect.MsSql2012Dialect" />
83+
<property name="nhibernate.connection.driver_class" value="NHibernate.Driver.MicrosoftDataSqlClientDriver" />
84+
</target>
85+
7586
<target name="setup-teamcity-sqlServerCe32">
7687
<property name="nhibernate.connection.driver_class" value="NHibernate.Driver.SqlServerCeDriver" />
7788
<property name="nhibernate.dialect" value="NHibernate.Dialect.MsSqlCe40Dialect" />

0 commit comments

Comments
 (0)