2010-09-01 3 views
4

Je dois appeler une procédure stockée via nhibernate, mais je ne sais pas comment. je procédure stockée simple:Appelez la procédure stockée via nhibernate

CREATE PROCEDURE InsertDoc 
    @Name nvarchar(50), 
    @Author nvarchar(50), 
    @Link nvarchar(50) 
AS 
    INSERT INTO documents(name, date, author, doclink) 
    VALUES(@Name, CURRENT_TIMESTAMP, @Author, @Link) 

J'ai essayé dans mon code:

public class documents 
{ 
    public int id; 
    public string name; 
    public DateTime date; 
    public string author; 
    public string doclink; 

    public void CreateDocuments(String n,String l,String u) 
    { 
     documents exSample = new documents(); 
     exSample.name = n; 
     exSample.date = DateTime.Now; 
     exSample.author = u; 
     exSample.doclink = l; 

     using (ISession session = OpenSession()) 
     using (ITransaction transaction = session.BeginTransaction()) 
     { 
      //Session.CreateSQLQuery("EXEC :sp_name :start_date :end_date").SetString("sp_name", <>;) 
      session.CreateSQLQuery("EXEC InsertDoc @Name = N'" + exSample.name + "',@Author = N'" + exSample.author + "',@Link = N'" + exSample.doclink + "'"); 
      // session.Save(exSample); 
      transaction.Commit(); 
     } 
    } 

    public ISessionFactory factory; 

    public ISession OpenSession() 
    { 
     if (factory == null) 
     { 
      Configuration conf = new Configuration(); 
      conf.AddAssembly(Assembly.GetCallingAssembly()); 
      factory = conf.BuildSessionFactory(); 
     } 
     return factory.OpenSession(); 
    } 
} 

j'appelle la procédure stockée

session.CreateSQLQuery("EXEC InsertDoc @Name = N'" + exSample.name + "',@Author = N'" + exSample.author + "',@Link = N'" + exSample.doclink + "'"); 

Dans mon fichier de mappage Je ces paramètres:

<?xml version="1.0" encoding="utf-8" ?> 
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" auto-import="true" namespace="WebApplication1" assembly="WebApplication1"> 
    <class name="WebApplication1.documents" table="documents" lazy="false"> 
    <id name="id" access="field"> 
     <generator class="native" /> 
    </id> 
    <property name="name" access="field" column="name" type="String"/> 
    <property name="date" access="field" column="date" type="date"/> 
    <property name="author" access="field" column="author" type="String"/> 
    <property name="doclink" access="field" column="doclink" type="String"/> 
    </class> 
</hibernate-mapping> 

Aidez-moi à résoudre ce problème ou reliez-moi à quelque chose d'utile.

+0

Quelle est l'erreur que vous obtenez? –

+0

Je pense que vous manquez le point de NHibernate étant un ORM. Vous pouvez juste instancier un 'documents' et appeler le' Save() 'comme sur la ligne que vous avez commentée. – Michael

Répondre

2

Semble vous manque un Query.executeUpdate() pour un, donc

session.CreateSQLQuery("EXEC InsertDoc @Name = N'" + exSample.name + "',@Author = N'" + exSample.author + "',@Link = N'" + exSample.doclink + "'").executeUpdate(); 

devrait fonctionner, mais il est beaucoup plus agréable de lier vos variables programaticly

+7

Cela me semble être une recette pour une attaque par injection SQL ... –

+0

Cela ne devrait pas être upvoted ... Construire des chaînes SQL dynamiques isn ' t une bonne réponse. – Jansky

2

Voici un exemple d'une cartographie de l'entité qui utilise des procédures stockées pour insérer, mettre à jour et supprimer des lignes de base de données:

<?xml version="1.0" encoding="utf-8" ?> 
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" schema="dbo" 
       assembly="MyAssembly" 
       namespace="MyAssembly.MyNamespace"> 

    <class name="MyEntity" table="my_entity" lazy="false"> 
    <id name="MyId" column="my_id" type="Int64"> 
     <generator class="native" /> 
    </id> 
    <property name="Name" type="string" column="name" /> 
    <property name="Comment" type="string" column="comment" /> 

    <sql-insert xml:space="preserve"> 
     DECLARE @my_id bigint 
     EXECUTE dbo.InsertMyEntity @name = ?, @comment = ?, @my_id = @my_id OUT 
     SELECT @my_id 
    </sql-insert> 
    <sql-update xml:space="preserve"> 
     EXECUTE dbo.UpdateMyEntity @name = ?, @comment = ?, @my_id = ? 
    </sql-update> 
    <sql-delete xml:space="preserve"> 
     EXECUTE dbo.DeleteMyEntity @my_id = ? 
    </sql-delete> 
    </class> 
</hibernate-mapping> 

Avec cette cartographie vous pouvez utiliser les méthodes ISession.Save, ISession.Update et ISession.Delete pour gérer vos entités et maintenir le cache d'entité de premier niveau NHibernate en synchronisation avec la base de données.

Cheers, Gerke.

Questions connexes