Ora il campo è mappato così:
Map(x => x.Description)
.SetAttributes(new Attributes { { "type", "System.String" },
{ "length", "20" } });
ma questo è il risultato purtroppo è questo:
exec sp_executesql N'select municipali0_.Description as x0_0_ from
municipalities municipali0_ where (municipali0_.Description like
@p0 )',N'@p0 nvarchar(4)',@p0=N'aos%'
exec sp_executesql N'select municipali0_.Description as x0_0_ from
municipalities municipali0_ where (municipali0_.Description like
@p0 )',N'@p0 nvarchar(5)',@p0=N'geno%'
Qualcuno ha una soluzione a questo problema ?
Grazie
claudio
> Ora il campo è mappato così:
> Map(x => x.Description)
> .SetAttributes(new Attributes { { "type", "System.String" },
> { "length", "20" } });
> ma questo è il risultato purtroppo è questo:
> exec sp_executesql N'select municipali0_.Description as x0_0_ from
> municipalities municipali0_ where (municipali0_.Description like
> @p0 )',N'@p0 nvarchar(4)',@p0=N'aos%'
> exec sp_executesql N'select municipali0_.Description as x0_0_ from
> municipalities municipali0_ where (municipali0_.Description like
> @p0 )',N'@p0 nvarchar(5)',@p0=N'geno%'
> Qualcuno ha una soluzione a questo problema ?
> Grazie
> claudio
*********** Applicazione ***********
using System;
using NHibernate;
using NHibernate.Cfg;
namespace demo
{
class Program
{
static void Main(string[] args)
{
var configuration = new Configuration();
configuration.Configure("hibernate.cfg.xml");
ISessionFactory factory = configuration.BuildSessionFactory
();
using (ISession session = factory.OpenSession())
{
IQuery q1 = session.CreateQuery("from Region r where
r.Description like :desc");
q1.SetParameter("desc", "zon%");
q1.List();
IQuery q2 = session.CreateQuery("from Region r where
r.Description like :desc");
q2.SetParameter("desc", "zone%");
q2.List();
}
Console.Read();
}
}
public class Region
{
public virtual int Id { get; set; }
public virtual string Description { get; set; }
}
}
Le query eseguite sono:
exec sp_executesql N'select region0_.RegionId as RegionId0_,
region0_.RegionDescription as RegionDe2_0_ from Region region0_ where
(region0_.RegionDescription like @p0 )',N'@p0 nvarchar(4)',@p0=N'zon%'
exec sp_executesql N'select region0_.RegionId as RegionId0_,
region0_.RegionDescription as RegionDe2_0_ from Region region0_ where
(region0_.RegionDescription like @p0 )',N'@p0 nvarchar(5)',@p0=N'zone
%'
C'è qlc di sbagliato nel mio mapping ?
Grazie
Claudio
> *********** Applicazione ***********
> using System;
> using NHibernate;
> using NHibernate.Cfg;
> namespace demo
> {
> class Program
> {
> static void Main(string[] args)
> {
> var configuration = new Configuration();
> configuration.Configure("hibernate.cfg.xml");
> ISessionFactory factory = configuration.BuildSessionFactory
> ();
> using (ISession session = factory.OpenSession())
> {
> IQuery q1 = session.CreateQuery("from Region r where
> r.Description like :desc");
> q1.SetParameter("desc", "zon%");
> q1.List();
> IQuery q2 = session.CreateQuery("from Region r where
> r.Description like :desc");
> q2.SetParameter("desc", "zone%");
> q2.List();
> }
> Console.Read();
> }
> }
> public class Region
> {
> public virtual int Id { get; set; }
> public virtual string Description { get; set; }
> }
> }
> Le query eseguite sono:
> exec sp_executesql N'select region0_.RegionId as RegionId0_,
> region0_.RegionDescription as RegionDe2_0_ from Region region0_ where
> (region0_.RegionDescription like @p0 )',N'@p0 nvarchar(4)',@p0=N'zon%'
> exec sp_executesql N'select region0_.RegionId as RegionId0_,
> region0_.RegionDescription as RegionDe2_0_ from Region region0_ where
> (region0_.RegionDescription like @p0 )',N'@p0 nvarchar(5)',@p0=N'zone
> %'
> C'è qlc di sbagliato nel mio mapping ?
> Grazie
> Claudio
Ora il mapping è semplicemente
<property name="Description" length="50" column="RegionDescription" />
Purtropppo il risultato sempre
exec sp_executesql N'select region0_.RegionId as RegionId0_,
region0_.RegionDescription as RegionDe2_0_ from Region region0_ where
(region0_.RegionDescription like @p0 )',N'@p0 nvarchar(4)',@p0=N'zon%'
exec sp_executesql N'select region0_.RegionId as RegionId0_,
region0_.RegionDescription as RegionDe2_0_ from Region region0_ where
(region0_.RegionDescription like @p0 )',N'@p0 nvarchar(5)',@p0=N'zone
%'
> Ora il mapping è semplicemente
> <property name="Description" length="50" column="RegionDescription" />
> Purtropppo il risultato sempre
> exec sp_executesql N'select region0_.RegionId as RegionId0_,
> region0_.RegionDescription as RegionDe2_0_ from Region region0_ where
> (region0_.RegionDescription like @p0 )',N'@p0 nvarchar(4)',@p0=N'zon%'
> exec sp_executesql N'select region0_.RegionId as RegionId0_,
> region0_.RegionDescription as RegionDe2_0_ from Region region0_ where
> (region0_.RegionDescription like @p0 )',N'@p0 nvarchar(5)',@p0=N'zone
> %'
>> Ora il mapping è semplicemente
>> <property name="Description" length="50" column="RegionDescription" />
>> Purtropppo il risultato sempre
>> exec sp_executesql N'select region0_.RegionId as RegionId0_,
>> region0_.RegionDescription as RegionDe2_0_ from Region region0_ where
>> (region0_.RegionDescription like @p0 )',N'@p0 nvarchar(4)',@p0=N'zon%'
>> exec sp_executesql N'select region0_.RegionId as RegionId0_,
>> region0_.RegionDescription as RegionDe2_0_ from Region region0_ where
>> (region0_.RegionDescription like @p0 )',N'@p0 nvarchar(5)',@p0=N'zone
>> %'
Anche se in questo caso non riconosce automaticamente la lunghezza del
parametro perché non la configura a secondo della propietá.Hai un overload
che ti permette passare un IType e in quel caso la lunghezza del parametro é
specificata e quindi la usa.
La lunghezza dei parametri é usata da NH quando genera le query di Insert e
Update. Nelle query dovresti usare un IType... potrei sbagliarmi ma mi sa
che é cosí.
Prima non avevo letto bene tutto il thread e siccome só che da quando sono
stati scritti i nuovi Binders su NH1.2.0 si sono introdotti una serie di
problemi poco conosciuti, pensavo che mostrassi l'esecuzione delle query
autogenerate.
Scusa per il disguido.
>>> Ora il mapping è semplicemente
>>> <property name="Description" length="50" column="RegionDescription" />
>>> Purtropppo il risultato sempre
>>> exec sp_executesql N'select region0_.RegionId as RegionId0_,
>>> region0_.RegionDescription as RegionDe2_0_ from Region region0_ where
>>> (region0_.RegionDescription like @p0 )',N'@p0 nvarchar(4)',@p0=N'zon%'
>>> exec sp_executesql N'select region0_.RegionId as RegionId0_,
>>> region0_.RegionDescription as RegionDe2_0_ from Region region0_ where
>>> (region0_.RegionDescription like @p0 )',N'@p0 nvarchar(5)',@p0=N'zone
>>> %'
Fabio,
andando di debug ho scoperto che SqlClientDriver ha la proprietà
IsPrepareSqlEnabled
(da abilitare con <property name="prepare_sql">true</property> nel
file di config)
Impostando questo parametro ho il seguente comportamento
la sintassi
session.CreateQuery("from Region r where r.Description like :desc")
.SetString("desc", "zon%")
.List();
usa un parametro di tipo
nvarchar(4000)
la sintassi
session.CreateQuery("from Region r where r.Description like :desc")
.SetParameter("desc", "zone%")
.List();
usa un parametro di tipo
nvarchar(4000)
la sintassi
session.CreateQuery("from Region r where r.Description like :desc")
.SetParameter("desc", "zoneh%", TypeFactory.GetStringType(50))
.List();
usa un parametro di tipo
nvarchar(50)
la sintassi
session.CreateQuery("from Region r where r.Description like :desc")
.SetParameter("desc", "z%", TypeFactory.GetAnsiStringType(50))
.List();
usa un parametro di tipo
varchar(50)
Mi confermi che IsPrepareSqlEnabled non serve ad altro e quindi lo
posso lasciare abilitato senza problemi ?
Grazie mille
Claudio
> Fabio,
> andando di debug ho scoperto che SqlClientDriver ha la proprietà
> IsPrepareSqlEnabled
> (da abilitare con <property name="prepare_sql">true</property> nel
> file di config)
> Impostando questo parametro ho il seguente comportamento
> la sintassi
> session.CreateQuery("from Region r where r.Description like :desc")
> .SetString("desc", "zon%")
> .List();
> usa un parametro di tipo
> nvarchar(4000)
> la sintassi
> session.CreateQuery("from Region r where r.Description like :desc")
> .SetParameter("desc", "zone%")
> .List();
> usa un parametro di tipo
> nvarchar(4000)
> la sintassi
> session.CreateQuery("from Region r where r.Description like :desc")
> .SetParameter("desc", "zoneh%", TypeFactory.GetStringType(50))
> .List();
> usa un parametro di tipo
> nvarchar(50)
> la sintassi
> session.CreateQuery("from Region r where r.Description like :desc")
> .SetParameter("desc", "z%", TypeFactory.GetAnsiStringType(50))
> .List();
> usa un parametro di tipo
> varchar(50)
> Mi confermi che IsPrepareSqlEnabled non serve ad altro e quindi lo
> posso lasciare abilitato senza problemi ?
> Grazie mille
> Claudio
Allora...é quella cosa lí che hai trovato peró
DefaultProperties[Environment.PrepareSql] = "false";
questo stá nel dialect di MsSQL ossia che esplicitamente é messo a false di
default...
>> Fabio,
>> andando di debug ho scoperto che SqlClientDriver ha la proprietà
>> IsPrepareSqlEnabled
>> (da abilitare con <property name="prepare_sql">true</property> nel
>> file di config)
>> Impostando questo parametro ho il seguente comportamento
>> la sintassi
>> session.CreateQuery("from Region r where r.Description like :desc")
>> .SetString("desc", "zon%")
>> .List();
>> usa un parametro di tipo
>> nvarchar(4000)
>> la sintassi
>> session.CreateQuery("from Region r where r.Description like :desc")
>> .SetParameter("desc", "zone%")
>> .List();
>> usa un parametro di tipo
>> nvarchar(4000)
>> la sintassi
>> session.CreateQuery("from Region r where r.Description like :desc")
>> .SetParameter("desc", "zoneh%", TypeFactory.GetStringType(50))
>> .List();
>> usa un parametro di tipo
>> nvarchar(50)
>> la sintassi
>> session.CreateQuery("from Region r where r.Description like :desc")
>> .SetParameter("desc", "z%", TypeFactory.GetAnsiStringType(50))
>> .List();
>> usa un parametro di tipo
>> varchar(50)
>> Mi confermi che IsPrepareSqlEnabled non serve ad altro e quindi lo
>> posso lasciare abilitato senza problemi ?
>> Grazie mille
>> Claudio
Strano che sia false visto che viene solo usato
da DriverBase.IsPrepareSqlEnabled che poi viene utilizzato solo in
SqlClientDriver
nel metodo SetParameterSizes
Un domanda però. Perchè il valore di lenght non viene usato dal metodo
SetParameterSizes ?
Nel mio esempio ho questo mapping
<property name="Description" length="50" column="RegionDescription" />
se uso la sintassi
session.CreateQuery("from Region r where r.Description like :desc")
.SetParameter("desc", "zone%")
.List();
usa un parametro di tipo nvarchar(4000)
A cosa serve l'attributo lenght ?
il primo é il length della propietá e viene sempre usato correttamente nei
INSERT e UPDATE.Il secondo é il length che potrebbe essere associato a
qualchier cosa...
from Region r where r.Description like :pStart + :desc + :pEnd
Che lunghezza dobrebbe avere ogni parametro ?
Beh lí trovi il motivo.
> Strano che sia false visto che viene solo usato
> da DriverBase.IsPrepareSqlEnabled che poi viene utilizzato solo in
> SqlClientDriver
> nel metodo SetParameterSizes
> Un domanda però. Perchè il valore di lenght non viene usato dal metodo
> SetParameterSizes ?
> Nel mio esempio ho questo mapping
> <property name="Description" length="50" column="RegionDescription" />
> se uso la sintassi
> session.CreateQuery("from Region r where r.Description like :desc")
> .SetParameter("desc", "zone%")
> .List();
> usa un parametro di tipo nvarchar(4000)
> A cosa serve l'attributo lenght ?
Io vedo che l'istruzione
using (ISession session = factory.OpenSession())
{
Region region = new Region { Id = 6, Description =
"Insert" };
session.Save(region);
session.Flush();
}
genera il comando SQL:
exec sp_executesql N'INSERT INTO Region (RegionDescription, RegionId)
VALUES (@p0, @p1)',N'@p0 nvarchar(6),@p1 int',@p0=N'Insert',@p1=6
quindi INSERT NON USA il lenght del mapping
Io vedo che l'istruzione
using (ISession session = factory.OpenSession())
{
Region region = new Region { Id = 6, Description =
"Item updated with a new value" };
session.Update(region);
session.Flush();
}
genera il comando SQL:
exec sp_executesql N'UPDATE Region SET RegionDescription = @p0 WHERE
RegionId = @p1',N'@p0 nvarchar(29),@p1 int',@p0=N'Item updated with a
new value',@p1=6
ero convito che funzionasse.. qualcuno havrá messo quel "false" nel dialect
per qualche motivo..e pensare che in NH c'é tutta na storia solo per tipare
y parametri.... bah?!??
> Io vedo che l'istruzione
> using (ISession session = factory.OpenSession())
> {
> Region region = new Region { Id = 6, Description =
> "Insert" };
> session.Save(region);
> session.Flush();
> }
> genera il comando SQL:
> exec sp_executesql N'INSERT INTO Region (RegionDescription, RegionId)
> VALUES (@p0, @p1)',N'@p0 nvarchar(6),@p1 int',@p0=N'Insert',@p1=6
> quindi INSERT NON USA il lenght del mapping
> Io vedo che l'istruzione
> using (ISession session = factory.OpenSession())
> {
> Region region = new Region { Id = 6, Description =
> "Item updated with a new value" };
> session.Update(region);
> session.Flush();
> }
> genera il comando SQL:
> exec sp_executesql N'UPDATE Region SET RegionDescription = @p0 WHERE
> RegionId = @p1',N'@p0 nvarchar(29),@p1 int',@p0=N'Item updated with a
> new value',@p1=6
Claudio, visto che giá c'é il post nel blogpuoi, per favore, aggiungere un
"How to" wiki qui
http://nhforge.org/wikis/howtonh/default.aspx e, visto che ci sei, anche un JIRA per rimettere prepare_sql a true di
default per MsSQL dialect ?
> ero convito che funzionasse.. qualcuno havrá messo quel "false" nel dialect
> per qualche motivo..e pensare che in NH c'é tutta na storia solo per
> tipare y parametri.... bah?!??
>> Io vedo che l'istruzione
>> using (ISession session = factory.OpenSession())
>> {
>> Region region = new Region { Id = 6, Description =
>> "Insert" };
>> session.Save(region);
>> session.Flush();
>> }
>> genera il comando SQL:
>> exec sp_executesql N'INSERT INTO Region (RegionDescription, RegionId)
>> VALUES (@p0, @p1)',N'@p0 nvarchar(6),@p1 int',@p0=N'Insert',@p1=6
>> quindi INSERT NON USA il lenght del mapping
>> Io vedo che l'istruzione
>> using (ISession session = factory.OpenSession())
>> {
>> Region region = new Region { Id = 6, Description =
>> "Item updated with a new value" };
>> session.Update(region);
>> session.Flush();
>> }
>> genera il comando SQL:
>> exec sp_executesql N'UPDATE Region SET RegionDescription = @p0 WHERE
>> RegionId = @p1',N'@p0 nvarchar(29),@p1 int',@p0=N'Item updated with a
>> new value',@p1=6