2013-02-19 11 views
6

Sto tentando di accedere a una stored procedure su Oracle 11g tramite Entity Framework. Posso accedere alle stored procedure che restituiscono scalari e restituiscono il valore corretto. Tuttavia, quando si utilizza SYS_REFCURSOR per restituire un set di risultati, il parametro OUT non viene rilevato sulla funzione import.Cant Map SYS_REFCURSOR in Entity Framework

mio stored procedure è la seguente

create or replace PROCEDURE "GetAllClientNames" (
    "ID" IN NUMBER, 
    "SAL" IN NUMBER, 
    "EMP_CURSOR" OUT SYS_REFCURSOR) IS 

BEGIN 


    OPEN EMP_CURSOR FOR SELECT FIRSTNAME FROM CLIENTS; 

END; 

Ma quando si aggiorna l'entità e fa la funzione di importazione, il parametro SYS_REFCURSOR OUT non viene rilevato nella funzione importate per recuperare set di risultati.

This is the image of imported function

ti prego di aiutarmi a this.Without Uscire parametro non posso accedere al set di risultati recuperato da stored procedure

+0

Qual è il tuo processo per "importare" la stored procedure? –

+1

@TomHalladay La stored procedure deve essere importata come funzione in modo che possa essere richiamata da Entity Framework. –

risposta

3

Ora provider di dati Oracle consente questo tipo di operazioni senza molto hustle.Its troppo elaborato per rispondere qui. Viene aggiunta una lettura veloce. Si prega di seguire il link sottostante per informazioni dettagliate.

ODP.NET 11g Release 2 (11.2.0.3.0), e superiore, consente alle applicazioni per eseguire stored procedure con parametri REF cursore senza usare esplicito legame per questi parametri nel codice NET.

Per una sola lettura del set di risultati, come ad esempio un cursore REF utilizzando OracleDataReader, REF informazioni sullo schema cursore viene recuperata automaticamente.

Per alcuni scenari, come ad esempio quando si utilizza cursori REF aggiornabili o Entity Framework , gli sviluppatori hanno bisogno di definire il REF CURSOR schema informazioni in modo che l'applicazione può legare il CURSOR REF implicita. Le applicazioni Entity Framework utilizzano il binding REF CURSOR implicito per e creano istanze di tipi complessi dai dati REF CURSOR. Le applicazioni devono specificare le informazioni di binding e metadati REF CURSOR nel file app.config, web.config o machine.config .NET.

Gli attributi forniti nel file di configurazione .NET vengono anche utilizzati quando l'applicazione richiede informazioni sullo schema dall'oggetto OracleDataReader che rappresenta un CURSORE DI RIF. Ciò significa che per REF CURSOR creati utilizzando una SELECT da una singola tabella, , l'applicazione può aggiornare quella tabella tramite l'utilizzo di OracleDataAdapter e OracleCommandBuilder.

Quando si utilizza Entity Framework, le importazioni delle funzioni possono restituire un REF CURSOR con implicito legame . REF CURSOR può essere restituito come una raccolta di tipi complessi o tipi di entità. Per restituire una raccolta di tipo complesso , il file di configurazione .NET deve definire le informazioni di binding e metadati REF CURSOR . Per restituire una raccolta di tipo entità, , è necessario definire solo le informazioni di bind nel file di configurazione .NET .

trovare tutte le informazioni here

2

Ho avuto un problema simile.

Dopo una lunga ricerca ho scoperto che il supporto Oracle per il framework di entità non è ancora stato sviluppato per l'utilizzo di tipi di dati complessi come tipo di ritorno da stored procedure. Si può fare; ma è come toccare il naso intorno alla tua testa. Pertanto, se si utilizza EF per maggiore facilità, è meglio evitarlo e utilizzare invece le stored procedure direttamente.

Infine ho deciso di andare con EF per creare, aggiornare ed eliminare (poiché devo implementare il controllo di audit) e stored procedure per la restituzione dei set di risultati.

+0

Salve, quindi come chiami l'SP da EF? In questo modo: var result = db.Database.SqlQuery ("chiama OWI_ADMIN.S_LANDEN()"); ?? –

2

Non credo che andare in modo Oracle con Entity Framework sia un buon modo se si desidera eseguire stored procedure e funzioni con tipi di ritorno e campi binari complessi.

+3

Grazie per la risposta. Per aiutare ulteriormente l'interrogante, sarebbe utile non solo commentare ciò che è una cattiva pratica, ma anche su quale sarebbe una via costruttiva. Quale sarebbe un modo buono o migliore in questo caso? – Bex

3

Un tipo complesso come un cursore di riferimento può essere restituito da una stored procedure Oracle utilizzando Entity Framework; richiede solo un po 'di configurazione extra. È necessario aggiungere l'XML corretto al file di configurazione per identificare il refcursor che viene restituito e i tipi di dati delle colonne.

Esempio:

<oracle.dataaccess.client> 
<settings> 
    <add name="schema.storedproc.RefCursor.ref_cursor_param_name" value="implicitRefCursor bindinfo='mode=Output'" /> 
    <add name="schema.storedproc.RefCursorMetaData.OUT_REF_CUR.Column.0" value="implicitRefCursor metadata='ColumnName=<column_name_here>;BaseColumnName=<column_name_here>;NATIVEDATATYPE=Varchar2;ProviderType=Varchar2'" /> 
    <add name="schema.storedproc.RefCursorMetaData.OUT_REF_CUR.Column.1" value="implicitRefCursor metadata='ColumnName=<column_name_here>;NATIVEDATATYPE=Date;ProviderType=Date'" /> 
    <add name="schema.storedproc.RefCursorMetaData.OUT_REF_CUR.Column.2" value="implicitRefCursor metadata='ColumnName=<column_name_here>;NATIVEDATATYPE=Number;ProviderType=Int32'" /> 
</settings> 
</oracle.dataaccess.client> 

basta sostituire il valore dischema.storedproc con la vostra. Ad esempio ACCOUNTING.GET_EMPLOYEES. E sostituire la colonna column_name_here con la colonna. Come EMP_ID. Rimuovere anche le parentesi angolari.

Ecco un articolo completo per riferimento: http://www.oracle.com/webfolder/technetwork/tutorials/obe/db/dotnet/EntityFrameworkOBE/EntityFrameworkOBE.htm#t3

documentazione su voci XML: http://docs.oracle.com/cd/E11882_01/win.112/e18754/featImplRefCursor.htm#ODPNT319

+0

Non è più necessario creare quel file di configurazione con i metadati a mano, né lo si vorrebbe mai. La procedura guidata "Esegui procedura memorizzata" lo fa per te. Il link per "l'articolo" è molto obsoleto.Utilizzare questo invece https://apex.oracle.com/pls/apex/f?p=44785:24:6479673193812:::::2424_CONTENT_ID,P24_PROD_SECTION_GRP_ID,P24_PREV_PAGE:10068,,24 Vedere la mia risposta altrove su questa pagina. –

3

Per utilizzare la funzione di importazione con EF è necessario effettuare le seguenti operazioni:

1) La prima OUT SYS_REFCURSOR incontrato nella tua lista di parametri diventerà l'uscita del Entity Funzione. Quindi potrebbe essere necessario avvolgere SP o Funzione con un nuovo SP contenente questo OUT SYS_REFCURSOR

2) È necessario impostare alcuni metadati relativi a questo cursore all'interno di app.config o web.config. Questo è automatizzato dalla finestra di dialogo Esegui stored procedure in Esplora server.

È possibile visualizzare un passo per passo procedura dettagliata di questo qui: https://apex.oracle.com/pls/apex/f?p=44785:24:6479673193812:::24:P24_CONTENT_ID,P24_PROD_SECTION_GRP_ID,P24_PREV_PAGE:10068,,24

Per maggiore documentazione su questo argomento, vedere la sezione Entity Framework dei Developer Tools Oracle per Guida di Visual Studio in linea.