Hi Julian
I have downloaded and built the latest trunk and have found the issue
is still there.
The issue is slightly different than bug 2893, which is talking about
when the assigned parameter names are ?. In this case the Advantage
DBMS the parameter name is :p0 in SQL and p0 in the parameter
collection. RemoveUnusedCommandParameters does not take into account
that the SQL and parameter collection names can differ. So any query
with a parameter, such as
Session.CreateQuery("from WebUser u where u.Inactive
= :inactive").SetParameter("inactive", false).List<WebUser>();
fails with the exception
Advantage.Data.Provider.AdsException : Error 7200: AQE Error: State
= 07002; NativeError = 2141; [iAnywhere Solutions][Advantage SQL
Engine]Parameter missing AdsCommand query execution failed.
Would it be best if I created a bug report for this issue?
Regards
Michael
On Dec 28, 2:15 am, Julian Maughan <[email protected]> wrote:
> Thanks for raising this. I believe it is fixed in the upcoming NHibernate
> release. Have a look at this bug report:
>
> https://nhibernate.jira.com/browse/NH-2893
>
> If you can't wait for an official release, you can download
> (https://github.com/nhibernate/nhibernate-core) and compile the source code.
>
> Regards
> Julian
>
> On 27 December 2011 03:34, Mike Charalambous <[email protected]
>
>
>
>
>
>
>
> > wrote:
> > Hi
>
> > I have recently written a NHibernate driver for the Sybase Advantage
> > Database Server (ADS), and have across a bug in the function
> > RemoveUnusedCommandParameters when running queries with parameters in
> > them. This bug means that all parameters are removed by
> > RemoveUnusedCommandParameters instead of just the ones which are
> > unused. Please see the bottom of my post for the driver code.
>
> > The heart of the issue is that ADS requires a prefix to be used when
> > referring to parameters in SQL, but not when the parameter is in the
> > parameter collection. The RemoveUnusedCommandParameters function does
> > not take into account that the parameter name can have a prefix in the
> > SQL and not in the parameter collection and so removes all parameters
> > from the command object.
>
> > I think the fix for this issue is straightforward and as far as I can
> > tell will not cause any issues with existing drivers. The code:
>
> > .Select(p => p.ParameterName)
>
> > should be changed to:
>
> > .Select(p => FormatNameForSql(p.ParameterName))
>
> > I have created a unit test for this issue but it requires binaries for
> > the Advantage Database Server. Is this okay?
>
> > Thanks
>
> > Mike Charalambous
>
> > public class SybaseAdsClientDriver :
> > NHibernate.Driver.ReflectionBasedDriver
> > {
> > public SybaseAdsClientDriver()
> > : base("Advantage.Data.Provider",
> > "Advantage.Data.Provider.AdsConnection",
> > "Advantage.Data.Provider.AdsCommand")
> > {
> > }
>
> > public override bool UseNamedPrefixInSql
> > { get { return true; } }
>
> > public override bool UseNamedPrefixInParameter
> > { get { return false; } }
>
> > public override string NamedPrefix
> > { get { return ":"; } }
> > }