使用NHibernate执行多个SQL语句
本文关键字:SQL 语句 NHibernate 执行 使用 | 更新日期: 2023-09-27 17:51:12
尝试在NHibernate
中执行以下SQL
语句时出现错误。它们在TOAD
中工作良好。环境为Oracle
, C#
, .NET 4
和NHibernate
StringBuilder sb = new StringBuilder();
//some logic to select data from table1 in the where
//clause of the following statement
sb.Append(" insert into temp_table select * from table1 where ....; ");
sb.Append(" select t1.col1, t2.col2 from temp_table t1 join table2 t2 on t1.col1 = t2.col2 ");
IQuery query = Session.GetISession().CreateSQLQuery(sb.ToString()).SetResultTransformer(Transformers.AliasToBean(typeof(Class1)));
return query.List<Class1>();
我得到的错误。
ORA-00911: invalid character
[GenericADOException: could not execute query....
如果我复制NHibernate
在toad
中生成的sql
,则相同的查询工作
恐怕你不能在nhibernate中这样做:
你应该先插入:
Session.GetISession().CreateSQLQuery("insert ....").ExecuteUpdate();
然后执行select:
IQuery query = Session.GetISession().CreateSQLQuery("select ...".SetResultTransformer(Transformers.AliasToBean(typeof(Class1)));
query.List<Class1>();
或者最好使用storedprocedure
如果您创建两个不同的方法,每个方法独立地打开和关闭会话,并一个接一个地调用,则可以做到这一点。但是在这个特定的示例中,当您选择并插入到临时表中时,我认为如果您直接在DB(在存储过程中)上执行该操作会更容易
因此,您可以使用存储过程并从DAO层调用它,其中存储过程具有插入和选择…在DAO层中,按如下方式调用存储过程:
session.CreateSQLQuery("exec [dbo].[MY_STORED_PROCEDURE] :param1, :param2")
.setParameter("param1", p1, NHibernateUtil.(dataType of p1)
.setParameter("param2", p2, NHibernateUtil.(dataType of p2)
.setResultTransformer...
您的存储过程看起来像这样:(只是一个例子):
declare @table table(col1 int, col2 datetime, col3 nvarchar(50)...)
--here u add whatever columns you will be selecting...
然后简单地做:
insert into @table
select * from table1
然后执行select:
select t1.col1, t2.col2 from @table t1
join table2 t2 on t2.col1 = t2.col2
,然后保存存储过程,并像我的示例中那样调用它。希望对大家有所帮助