2009-08-20 9 views
2

Ich bin ein C# SQL Server Entwickler neu in Oracle Programmierung. Der folgende Code dient zum Einstellen von cmdText zu: "select * from myTable". Ich möchte jetzt dies in eine gespeicherte Prozedur setzen, Ich brauche Hilfe mit, wie diese gespeicherte Oracle-Prozedur schreiben und die Ergebnisse in eine DataTable in meinem C# Code erhalten. Vielen Dank. Code:C# Ergebnismenge aus Oracle-Store-Prozedur zurückgeben und eine DataTable füllen

private DbProviderFactory DbFactory 
    { 
     get 
     { 
      dbProviderFactory = dbProviderFactory ?? DbProviderFactories.GetFactory(providerInvariantName); 
      return dbProviderFactory; 
     } 
    } 

public DataTable ExecDataTable(string cmdText, params IDataParameter[] cmdParams) 
    { 
     DataTable resultDT = new DataTable(); 

     using (DbConnection dbConn = DbFactory.CreateConnection()) 
     { 
      dbConn.ConnectionString = connectionString; 
      using (DbCommand dbCmd = DbFactory.CreateCommand()) 
      { 
       dbCmd.CommandText = cmdText; 
       dbCmd.Connection = dbConn; 

       try 
       { 
        dbConn.Open(); 

        if (cmdParams != null) 
        { 
         dbCmd.Parameters.AddRange(cmdParams); 
        } 

        using (DbDataAdapter dbDA = DbFactory.CreateDataAdapter()) 
        { 
         dbDA.SelectCommand = dbCmd; 
         dbDA.Fill(resultDT); 
        } 
       } 
       finally 
       { 
        dbConn.Close(); 
       } 
      } 
     } 
     return resultDT; 
    } 

Hinweis: connectionString, providerInvariantName sind zuvor im Code festgelegt.

Auch ein Ratschlag zum Refactoring meines Codes wird geschätzt Dies ist der Ansatz, den ich habe, um ODP.net und ODBC-Verbindungen zu Oracle zu unterstützen, die vor Ort erforderlich ist.

aktualisieren

Das kann ich bekommen zu arbeiten mit:

new Oracle.DataAccess.Client.OracleParameter("result", Oracle.DataAccess.Client.OracleDbType.RefCursor, ParameterDirection.Output); 

aber ich kann nicht eine generische Lösung zu erhalten, scheint zu funktionieren mit DbParameter oder IDataParameter wie kann ich dies tun zu Unterstützung ODBC und ODP.net?

Antwort

1

Müssen Sie wirklich ODBC unterstützen? Ansonsten benutze nur ODP.Net, es hat den Zugriff auf Oracle optimiert. Der effizienteste Weg, Daten von Oracle zu erhalten, ist die Verwendung von Ref-Cursorn. Sie sollten lernen, sie zu verwenden.

create or replace 
PROCEDURE SP_GET_TBL (o_rc OUT sys_refcursor) AS 
    open o_rc for 
     select Col1, Col2, Col3 from Tbl;  
END SP_GET_TBL; 
+0

Danke und wie nehme ich das in C# auf? und füllen Sie die DataTable? – m3ntat

1

Set Commandtype-Eigenschaft,

dbCmd.CommandType=StoredProcedure; 

Fill-Methode öffnet und schließt Datenbankverbindung implizit so dass keine Notwendigkeit & schließt Datenbankverbindung zu öffnen.

Verwenden Sie cmd.Parameter.AddWithValue() Methode, um sowohl Parameter und Wert zu drücken.

+0

Richtig und wie Sie die gespeicherte Oracle-Prozedur korrigieren, um eine Ergebnismenge zurückzugeben. – m3ntat