c # возвращает результирующий набор из процедуры Oracle store и заполняет таблицу данных
-
19-09-2019 - |
Вопрос
Я разработчик c # SQL Server новичок в программировании Oracle.Приведенный ниже код работает для установки cmdText в:"выберите * из моей таблицы".Теперь я хотел бы поместить это в хранимую процедуру, Мне нужна помощь с тем, как написать эту хранимую процедуру Oracle и получить результаты в DataTable в моем коде c #.Спасибо.Код:
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;
}
Примечание:ConnectionString, providerInvariantName задаются ранее в коде.
Также приветствую любые советы по рефакторингу моего кода это подход, который я использовал для поддержки ODP.net а также ODBC-соединений с Oracle, которые требуются на сайте.
Обновить
Я могу заставить это работать, используя:
new Oracle.DataAccess.Client.OracleParameter("result", Oracle.DataAccess.Client.OracleDbType.RefCursor, ParameterDirection.Output);
Однако, похоже, я не могу получить универсальное решение для работы с использованием DbParameter или IDataParameter - параметр базы данных как мне это сделать, чтобы поддержка ODBC и ODP.net ?
Решение
Вам действительно нужно поддерживать ODBC?В противном случае просто используйте only ODP.Net , он оптимизировал доступ к Oracle.Самый эффективный способ получения данных из Oracle - это использование ref cursors, вы должны научиться им пользоваться.
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;
Другие советы
Установить свойство CommandType,
dbCmd.CommandType=StoredProcedure;
Метод Fill открывает и закрывает соединение с базой данных неявно, поэтому нет необходимости открывать и закрывать соединение с базой данных.
Использование cmd.Параметр.Добавить значение() метод для передачи обоих параметров и значения.