@@ -19,7 +19,7 @@ namespace NHibernate.Impl
1919 /// <summary>
2020 /// Abstract implementation of the IQuery interface.
2121 /// </summary>
22- public abstract partial class AbstractQueryImpl : IQuery
22+ public abstract partial class AbstractQueryImpl : IQuery , IQueryNextVer
2323 {
2424 private readonly string queryString ;
2525 protected readonly ISessionImplementor session ;
@@ -242,17 +242,33 @@ public IQuery SetParameter(int position, object val, IType type)
242242
243243 public IQuery SetParameter ( string name , object val , IType type )
244244 {
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 ) )
254252 return this ;
253+
254+ if ( type == null || preferMetadataType )
255+ {
256+ type = parameterMetadata . GetNamedParameterExpectedType ( name ) ?? type ?? ParameterHelper . GuessType ( val , session . Factory ) ;
255257 }
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 + "]" ) ;
256272 }
257273
258274 public IQuery SetParameter < T > ( int position , T val )
@@ -289,29 +305,7 @@ public IQuery SetParameter<T>(string name, T val)
289305
290306 public IQuery SetParameter ( string name , object val )
291307 {
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 ) ;
315309 }
316310
317311 public IQuery SetParameter ( int position , object val )
0 commit comments