I'm learning how to program the database connection in ASP.NET Core MVC using C#. I am definitely not familiar, I can see stuff online but I don't understand it.
Here is my code - this is what my appsettings.json looks like:
"ConnectionStrings": {
"DBConn": "Data Source=(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=HOSTSERVER) (PORT=0001))(CONNECT_DATA=(SERVICE_NAME=TEST.TEST.TEST)));User Id=Test_ID;Password=PassID;"
}
Now in my program.cs, I saw online something like this so I tried it:
builder.Services.AddTransient<IDbConnection>((sp) =>
new OracleConnection(builder.Configuration.GetConnectionString("DBConn")));
In my controller where I'm going to test if I have connection to the Oracle database:
using Oracle.ManagedDataAccess.Client;
public class HomeController : Controller
{
private readonly ILogger<HomeController> _logger;
private static Logger _nlogger = LogManager.GetCurrentClassLogger();
protected IDbConnection _connection;
public HomeController(ILogger<HomeController> logger, Logger nlogger, IDbConnection connection)
{
_logger = logger;
_nlogger = nlogger;
_connection = connection;
}
public IActionResult Index()
{
try
{
using (_connection)
{
OracleCommand cmd = new OracleCommand();
cmd.Connection = _connection.;
cmd.CommandText = "pkgTest.TestSP";
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.Add("pi_app_cd", OracleDbType.Varchar2).Value = cID.APP_CODE;
cmd.Parameters.Add("po_refcsr", OracleDbType.RefCursor).Direction = ParameterDirection.Output;
conn.Open();
using (OracleDataReader reader = objCmd.ExecuteReader())
{
while (reader.Read())
{
rowCNT++;
}
reader.Close();
reader.Dispose();
}
objCmd.Dispose();
conn.Close();
conn.Dispose();
}
ViewData["Title"] = "Home";
}
catch (Exception ex)
{
_logger.LogError(ex.Message);
}
return View();
}
}
My code wouldn't build because the connection is definitely wrong. I need an oracle connection but the one I'm trying to put is an IDbConnection. I don't know how use the dependency injection (if that's the right term). Maybe someone has input about this on how can I proceed? Thank you!
IDbConnectionFactoryis a better choice. Second, the point of DI is to be agnostic to the implementation, but you're usingOracleDbType.RefCursorwhich binds you quite tightly you to Oracle's provider, anyway. Forget about injecting the connection. I suggest looking into an OR/M for data access instead of using ODP.NET directly if you want a good abstraction.