Reference
Original logic and concept adapted from https://www.c-sharpcorner.com/blogs/crud-operation-in-asp-net-web-forms-with-oracle-database.
Overview
In this blog, we’ll explore how to implement full CRUD operations (Create, Read, Update, Delete) in ASP.NET Web Forms using Oracle Database by leveraging stored procedures. While many tutorials perform direct SQL queries in code-behind, this guide shows you a cleaner, modular, and more secure way of using PL/SQL procedures.
Why Use Stored Procedures?
- Better performance with precompiled SQL.
- Enhanced security.
- Centralized logic for easier maintenance.
Environment Setup
- IDE: Visual Studio 2015/2022
- Database: Oracle
1. Bind Grid with Oracle Stored Procedure
We fetch records based on dynamic input filters like name, email, PAN, date range, etc.
public void BindGrid()
{
loader.Visible = true;
string name = txtName.Text;
string email = txtemail.Text;
string pan = txtPAN.Text;
string ucc = txtUCC.Text;
string dpid = txtdematid.Text;
// Parse date strings
if (DateTime.TryParseExact(fdate, "dd MMM yyyy", null, System.Globalization.DateTimeStyles.None, out var startDate) &&
DateTime.TryParseExact(sdate, "dd MMM yyyy", null, System.Globalization.DateTimeStyles.None, out var endDate))
{
fdate = startDate.ToString("yyyy-MM-dd");
sdate = endDate.ToString("yyyy-MM-dd");
}
try
{
using (OracleConnection con = new OracleConnection(ConfigurationManager.ConnectionStrings["OracleCon"].ConnectionString))
using (OracleCommand cmd = new OracleCommand("GET_USER_DETAILS_SIMPLE", con))
{
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.Add("p_name", OracleDbType.Varchar2).Value = (object)name ?? DBNull.Value;
cmd.Parameters.Add("p_email", OracleDbType.Varchar2).Value = (object)email ?? DBNull.Value;
cmd.Parameters.Add("p_pan", OracleDbType.Varchar2).Value = (object)pan ?? DBNull.Value;
cmd.Parameters.Add("p_ucc", OracleDbType.Varchar2).Value = (object)ucc ?? DBNull.Value;
cmd.Parameters.Add("p_dpid", OracleDbType.Varchar2).Value = (object)dpid ?? DBNull.Value;
cmd.Parameters.Add("p_start_date", OracleDbType.Varchar2).Value = (object)fdate ?? DBNull.Value;
cmd.Parameters.Add("p_end_date", OracleDbType.Varchar2).Value = (object)sdate ?? DBNull.Value;
cmd.Parameters.Add("p_result", OracleDbType.RefCursor).Direction = ParameterDirection.Output;
con.Open();
using (OracleDataAdapter da = new OracleDataAdapter(cmd))
{
ds = new DataSet();
da.Fill(ds);
}
}
GridView1.DataSource = ds;
GridView1.DataBind();
}
catch (Exception ex)
{
// log exception
}
finally
{
loader.Visible = false;
}
}
2. Delete User by IDs
Supports deletion of multiple users via comma-separated IDs passed to procedure.
protected void Deletebtn_Click(object sender, ImageClickEventArgs e)
{
string chkUserId = Request["chkSelect"]?.ToString()?.Trim() ?? "";
if (string.IsNullOrEmpty(chkUserId))
{
ScriptManager.RegisterStartupScript(this.Page, typeof(string), "alert", "alert('No Items Selected.');", true);
return;
}
try
{
OracleParameter param = new OracleParameter("p_ids", OracleDbType.Varchar2)
{
Value = chkUserId
};
OracleHelper.ExecuteNonQuery(con, CommandType.StoredProcedure, "Delete_User_By_CommaIds", param);
ScriptManager.RegisterStartupScript(this.Page, typeof(string), "alert", "alert('Record deleted successfully');", true);
}
catch (Exception ex)
{
ScriptManager.RegisterStartupScript(this.Page, typeof(string), "alert", $"alert('Error: {ex.Message}');", true);
}
BindGrid();
}
3. Update User Data (Insert or Update)
This handles both add and update operations via the manage_user stored procedure.
protected void btnUpdate_Click(object sender, EventArgs e)
{
using (OracleConnection con = new OracleConnection(OracleCon))
{
con.Open();
using (OracleTransaction transaction = con.BeginTransaction())
{
try
{
string srno = Request.QueryString["data"] ?? "";
string dematId = (drpdpid.Value == "CDSL") ? txtcdslnum.Text : txtnsdlalpha.Text + txtnsdlnum.Text;
using (OracleCommand cmd = new OracleCommand("manage_user", con))
{
cmd.CommandType = CommandType.StoredProcedure;
cmd.Transaction = transaction;
cmd.Parameters.Add("p_action", OracleDbType.Varchar2).Value = "SAVE";
cmd.Parameters.Add("p_srno", OracleDbType.Varchar2).Value = srno;
cmd.Parameters.Add("p_username", OracleDbType.Varchar2).Value = txtclientname.Text;
cmd.Parameters.Add("p_pan", OracleDbType.Varchar2).Value = txtPAN.Text;
cmd.Parameters.Add("p_email", OracleDbType.Varchar2).Value = txtemail.Text;
cmd.Parameters.Add("p_phone", OracleDbType.Varchar2).Value = txtmobile.Text;
cmd.Parameters.Add("p_demat_id", OracleDbType.Varchar2).Value = dematId;
cmd.Parameters.Add("p_demat_type", OracleDbType.Varchar2).Value = drpdpid.Value;
cmd.Parameters.Add("p_family", OracleDbType.Varchar2).Value = txtfamily.Text;
cmd.Parameters.Add("p_isfamily", OracleDbType.Int32).Value = chkfamily.Checked ? 1 : 0;
cmd.Parameters.Add("p_result", OracleDbType.Int32).Direction = ParameterDirection.Output;
cmd.Parameters.Add("p_cursor", OracleDbType.RefCursor).Direction = ParameterDirection.Output;
cmd.ExecuteNonQuery();
int result = Convert.ToInt32(cmd.Parameters["p_result"].Value);
if (result == 1)
{
transaction.Commit();
ScriptManager.RegisterStartupScript(
this.Page,
typeof(string),
"showalert",
"alert('Client data updated successfully'); window.location='/OracleDB/OracleCRUDOperationWithParameter/CRUDOperation.aspx';",
true
);
}
else if (result == -1)
{
ScriptManager.RegisterStartupScript(
this,
this.GetType(),
"checkuser",
"alert('Client PAN already exists');",
true
);
}
else if (result == -2)
{
ScriptManager.RegisterStartupScript(
this,
this.GetType(),
"checkfamilyhead",
"alert('Family head already exists');",
true
);
}
else
{
ScriptManager.RegisterStartupScript(
this,
this.GetType(),
"error",
"alert('Unexpected error occurred');",
true
);
}
}
}
catch (Exception ex)
{
transaction.Rollback();
ScriptManager.RegisterStartupScript(
this,
this.GetType(),
"dberror",
$"alert('Error: {ex.Message}');",
true
);
}
}
}
}
Join the conversation! Your thoughts help the community grow.