我是c#SQL Server开发人员 Oracle编程新手。下面的代码适用于将cmdText设置为:“select * from myTable”。我现在想把它放在一个存储过程中,我需要帮助来编写这个Oracle存储过程并将结果放入我的c#代码中的DataTable中。谢谢。代码:
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的方法,也是现场需要的与Oracle的ODBC连接。
更新
我可以使用以下方式使用:
new Oracle.DataAccess.Client.OracleParameter("result", Oracle.DataAccess.Client.OracleDbType.RefCursor, ParameterDirection.Output);
但是我似乎无法使用 DbParameter或IDataParameter 来获得通用解决方案如何执行此操作支持ODBC和ODP.net ?
答案 0 :(得分:1)
设置CommandType属性,
dbCmd.CommandType=StoredProcedure;
填充方法隐式打开和关闭数据库连接,因此无需打开&关闭数据库连接。
使用 cmd.Parameter.AddWithValue()方法推送参数和值。
答案 1 :(得分:1)
你真的必须支持ODBC吗?否则只使用ODP.Net,它已经优化了对Oracle的访问。从Oracle获取数据的最有效方法是使用ref游标,你应该学会使用它。
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;