Question

Je suis un développeur c # SQL Server nouveau à la programmation Oracle . Le code ci-dessous fonctionne pour la mise à cmdText: "select * from myTable". Je voudrais maintenant mettre cela dans une procédure stockée, J'ai besoin d'aide avec la façon d'écrire cette procédure stockée Oracle et obtenir les résultats dans un DataTable dans mon code c # . Merci. Code:

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;
    }

Note:. ConnectionString, providerInvariantName sont définis précédemment dans le code

Aussi des conseils sur refactorisation mon code est apprécié c'est l'approche que j'ai pris pour soutenir ODP.net et aussi des connexions ODBC à Oracle qui est nécessaire sur le site.

Mise à jour

Je peux obtenir ce à travailler en utilisant:

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

semble que je ne peux cependant pas d'obtenir une solution générique au travail en utilisant DbParameter ou IDataParameter Comment puis-je faire pour ODBC support et ODP.net ?

Était-ce utile?

La solution

Avez-vous vraiment soutenir ODBC. Sinon, il suffit d'utiliser seulement ODP.Net, il a optimisé l'accès à Oracle. La façon la plus efficace pour obtenir des données d'Oracle utilise des curseurs ref, vous devez apprendre à l'utiliser.

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;

Autres conseils

Définir la propriété CommandType,

dbCmd.CommandType=StoredProcedure;

Méthode de remplissage et ouvre la connexion de base de données à proximité implicitement donc pas besoin d'ouvrir et connexion à la base étroite.

Utilisation cmd.Parameter.AddWithValue () Méthode pour pousser les deux, et la valeur paramètre.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top