@@ -19,7 +19,7 @@ namespace NHibernate.Impl
19
19
/// <summary>
20
20
/// Abstract implementation of the IQuery interface.
21
21
/// </summary>
22
- public abstract partial class AbstractQueryImpl : IQuery
22
+ public abstract partial class AbstractQueryImpl : IQuery , IQueryNextVer
23
23
{
24
24
private readonly string queryString ;
25
25
protected readonly ISessionImplementor session ;
@@ -242,17 +242,33 @@ public IQuery SetParameter(int position, object val, IType type)
242
242
243
243
public IQuery SetParameter ( string name , object val , IType type )
244
244
{
245
- if ( ! parameterMetadata . NamedParameterNames . Contains ( name ) )
246
- {
247
- if ( shouldIgnoredUnknownNamedParameters ) //just ignore it
248
- return this ;
249
- throw new ArgumentException ( "Parameter " + name + " does not exist as a named parameter in [" + QueryString + "]" ) ;
250
- }
251
- else
252
- {
253
- namedParameters [ name ] = new TypedValue ( type , val , false ) ;
245
+ return SetParameter ( name , val , type , false ) ;
246
+ }
247
+
248
+ //TODO 6.0: Add to IQuery interface
249
+ public IQuery SetParameter ( string name , object val , IType type , bool preferMetadataType )
250
+ {
251
+ if ( CheckParameterIgnored ( name ) )
254
252
return this ;
253
+
254
+ if ( type == null || preferMetadataType )
255
+ {
256
+ type = parameterMetadata . GetNamedParameterExpectedType ( name ) ?? type ?? ParameterHelper . GuessType ( val , session . Factory ) ;
255
257
}
258
+
259
+ namedParameters [ name ] = new TypedValue ( type , val , false ) ;
260
+ return this ;
261
+ }
262
+
263
+ private bool CheckParameterIgnored ( string name )
264
+ {
265
+ if ( parameterMetadata . NamedParameterNames . Contains ( name ) )
266
+ return false ;
267
+
268
+ if ( shouldIgnoredUnknownNamedParameters ) //just ignore it
269
+ return true ;
270
+
271
+ throw new ArgumentException ( "Parameter " + name + " does not exist as a named parameter in [" + QueryString + "]" ) ;
256
272
}
257
273
258
274
public IQuery SetParameter < T > ( int position , T val )
@@ -289,29 +305,7 @@ public IQuery SetParameter<T>(string name, T val)
289
305
290
306
public IQuery SetParameter ( string name , object val )
291
307
{
292
- if ( ! parameterMetadata . NamedParameterNames . Contains ( name ) )
293
- {
294
- if ( shouldIgnoredUnknownNamedParameters ) //just ignore it
295
- return this ;
296
- }
297
-
298
- if ( val == null )
299
- {
300
- IType type = parameterMetadata . GetNamedParameterExpectedType ( name ) ;
301
- if ( type == null )
302
- {
303
- throw new ArgumentNullException ( "val" ,
304
- "A type specific Set(name, val) should be called because the Type can not be guessed from a null value." ) ;
305
- }
306
-
307
- SetParameter ( name , val , type ) ;
308
- }
309
- else
310
- {
311
- SetParameter ( name , val , DetermineType ( name , val ) ) ;
312
- }
313
-
314
- return this ;
308
+ return SetParameter ( name , val , null , true ) ;
315
309
}
316
310
317
311
public IQuery SetParameter ( int position , object val )
0 commit comments