In this article we will learn basic CRUD operation using Web Api-2, and Stored Procedure with a sample Desktop Application.

Sample Database:
Let’s Create a Sample database named ‘SampleDB’ with SQL Management Studio. Using the ‘SampleDB’ now create a Table name ‘tblCustomer’.
Script:
CREATE TABLE [dbo].[tblCustomer](
[CustID] [bigint] NOT NULL,
[CustName] [nvarchar](50) NULL,
[CustEmail] [nvarchar](50) NOT NULL,
[CustAddress] [nvarchar](256) NULL,
[CustContact] [nvarchar](50) NULL,
CONSTRAINT [PK_tblCustomer] PRIMARY KEY CLUSTERED
(
[CustID] ASC,
[CustEmail] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
Stored Procedure:
Now the step we will go through to perform CRUD operations with stored procedure:
- First we will create a stored procedure (SP) to RETRIVE record from Customer table
- Now we will create a stored procedure( SP) to INSERT record into Customer table
- Now we will create another procedure (SP) to UPDATE existing data in our Customer table.
- The last step we will create a stored procedure to DELETE existing record from customer table.
Stored Procedure to RETRIVE Record:
-- ============================================= -- Author:-- Create date: <05/10/2015,,> -- Description: -- ============================================= ALTER PROCEDURE [dbo].[READ_CUSTOMER] -- Add the parameters for the stored procedure here INT , INT , INT AS BEGIN -- SET NOCOUNT ON added to prevent extra result sets from SET NOCOUNT ON; -- Select statements for procedure here IF( = 0) BEGIN SELECT top* FROM [dbo].[tblCustomer] ORDER BY CustID DESC END IF( = 1) BEGIN DECLARE INT SET = ( - 1) * SELECT * FROM [dbo].[tblCustomer] ORDER BY CustID DESC OFFSET ROWS FETCH NEXT ROWS ONLY END END
Stored Procedure to INSERT Record:
-- ============================================= -- Author:-- Create date: <05/10/2015,,> -- Description: -- ============================================= ALTER PROCEDURE [dbo].[CREATE_CUSTOMER] -- Add the parameters for the stored procedure here ( NVarchar(50) , NVarchar(50) , NVarchar(256) , NVarchar(50) ) AS BEGIN ---- SET NOCOUNT ON added to prevent extra result sets from SET NOCOUNT ON; ---- Try Catch-- BEGIN TRY BEGIN TRANSACTION DECLARE Bigint SET = isnull(((SELECT max(CustID) FROM [dbo].[tblCustomer])+1),'1') -- Insert statements for procedure here INSERT INTO [dbo].[tblCustomer] ([CustID],[CustName],[CustEmail],[CustAddress],[CustContact]) VALUES(,,,,) SELECT 1 COMMIT TRANSACTION END TRY BEGIN CATCH DECLARE NVARCHAR(4000), INT, INT; SELECT = ERROR_MESSAGE(), = ERROR_SEVERITY(), = ERROR_STATE(); RAISERROR (,,); ROLLBACK TRANSACTION END CATCH END
Stored Procedure to UPDATE Record:
-- ============================================= -- Author:-- Create date: <05/10/2015,,> -- Description: -- ============================================= ALTER PROCEDURE [dbo].[UPDATE_CUSTOMER] -- Add the parameters for the stored procedure here BIGINT , NVarchar(50) , NVarchar(50) , NVarchar(256) , NVarchar(50) AS BEGIN ---- SET NOCOUNT ON added to prevent extra result sets from SET NOCOUNT ON; ---- Try Catch-- BEGIN TRY BEGIN TRANSACTION -- Update statements for procedure here UPDATE [dbo].[tblCustomer] SET [CustName] = , [CustAddress] = , [CustContact] = WHERE [CustID] = AND [CustEmail] = SELECT 1 COMMIT TRANSACTION END TRY BEGIN CATCH DECLARE NVARCHAR(4000), INT, INT; SELECT = ERROR_MESSAGE(), = ERROR_SEVERITY(), = ERROR_STATE(); RAISERROR (,,); ROLLBACK TRANSACTION END CATCH END
Stored Procedure to DELETE Record:
-- ============================================= -- Author:-- Create date: <05/10/2015,,> -- Description: -- ============================================= ALTER PROCEDURE [dbo].[DELETE_CUSTOMER] -- Add the parameters for the stored procedure here BIGINT AS BEGIN ---- SET NOCOUNT ON added to prevent extra result sets from SET NOCOUNT ON; ---- Try Catch-- BEGIN TRY BEGIN TRANSACTION -- Delete statements for procedure here DELETE [dbo].[tblCustomer] WHERE [CustID] = SELECT 1 COMMIT TRANSACTION END TRY BEGIN CATCH DECLARE NVARCHAR(4000), INT, INT; SELECT = ERROR_MESSAGE(), = ERROR_SEVERITY(), = ERROR_STATE(); RAISERROR (,,); ROLLBACK TRANSACTION END CATCH END
Stored Procedure to VIEW Single Record Details:
-- ============================================= -- Author:-- Create date: <05/10/2015,,> -- Description: -- ============================================= ALTER PROCEDURE [dbo].[VIEW_CUSTOMER] -- Add the parameters for the stored procedure here BIGINT AS BEGIN -- SET NOCOUNT ON added to prevent extra result sets from SET NOCOUNT ON; -- Select statements for procedure here SELECT * FROM [dbo].[tblCustomer] WHERE [CustID] = END
Let’s Start:
Open Visual Studio 2015, Click File> New > Project. In this window give a name the project and solution.

Click ok and another window will appear with project template, choose Web API:

Click ok and the visual studio will create and load a new ASP.NET application template.
In this app we are going to apply CRUD operation on a single table named Customer. To do first we need to create apiController for the operations. To add a new Controller file we need to click right mouse an option menu will appear Click Add > Controller.

Let’s name it CustomerController. In the controller we will create action methods to perform CRUD operations:

Api Controller for CRUD operations:
namespace CRUD_APi.Controllers.apiController
{
[RoutePrefix("api/Customer")]
public class CustomerController : ApiController
{
// GET: api/Customer?RowCount=5
[HttpGet]
public IEnumerable GetCustomers(int pageSize)
{
try
{
int pageNumber = 0;
int IsPaging = 0;
CrudDataService objCrd = new CrudDataService();
List modelCust = objCrd.GetCustomerList(pageNumber, pageSize, IsPaging);
return modelCust;
}
catch
{
throw;
}
}
// GET: api/Customer/InfinitScroll
[HttpGet]
public IEnumerable GetCustomerScroll(int pageNumber, int pageSize)
{
try
{
int IsPaging = 1;
CrudDataService objCrd = new CrudDataService();
List modelCust = objCrd.GetCustomerList(pageNumber, pageSize, IsPaging);
return modelCust;
}
catch (Exception ex)
{
throw ex;
}
}
// GET: api/Customer/Create
[HttpPost]
[ResponseType(typeof(tblCustomer))]
public string Create(tblCustomer objCust)
{
try
{
CrudDataService objCrd = new CrudDataService();
Int32 message = 0;
if ((objCust.CustName != null) && (objCust.CustEmail != null)) message = objCrd.InsertCustomer(objCust);
else message = -1;
return message.ToString();
}
catch
{
throw;
}
}
// GET: api/Customer/Get
[HttpGet]
public tblCustomer GetCustomer(long? id)
{
try
{
CrudDataService objCrd = new CrudDataService();
tblCustomer modelCust = objCrd.GetCustomerDetails(id);
return modelCust;
}
catch
{
throw;
}
}
// GET: api/Customer/Edit
[HttpPost]
[ResponseType(typeof(tblCustomer))]
public string Edit(tblCustomer objCust)
{
try
{
CrudDataService objCrd = new CrudDataService();
Int32 message = 0;
message = objCrd.UpdateCustomer(objCust);
return message.ToString();
}
catch
{
throw;
}
}
// GET: api/Customer/Delete
[HttpDelete]
public string Delete(long? id)
{
try
{
CrudDataService objCrd = new CrudDataService();
Int32 message = 0;
message = objCrd.DeleteCustomer(id);
return message.ToString();
}
catch
{
throw;
}
}
}
}
Data Service:
As we know earlier that we will use ADO.NET, Stored Procedure so to connect data base we need to modify our config file to add Connection String for database connection:
Now we need to create another class to use connection string and open our database connection, let’s name it dbConnector.
// Database Connection
public class dbConnector
{
private SqlConnection SqlConn = null;
public SqlConnection GetConnection
{
get { return SqlConn; }
set { SqlConn = value; }
}
public dbConnector()
{
string ConnectionString = ConfigurationManager.ConnectionStrings["dbConn"].ConnectionString;
SqlConn = new SqlConnection(ConnectionString);
}
}
To perform CRUD operations we will create a separate class called CrudDataService. In this class we have five methods that will interact with database to perform CRUD operations.
// Database Service
namespace CRUD_DataService
{
// Database Service
public class CrudDataService
{
public List GetCustomerList(int PageNo, int RowCountPerPage, int IsPaging)
{
dbConnector objConn = new dbConnector();
SqlConnection Conn = objConn.GetConnection;
Conn.Open();
try
{
List _listCustomer = new List();
if (Conn.State != System.Data.ConnectionState.Open)
Conn.Open();
SqlCommand objCommand = new SqlCommand("READ_CUSTOMER", Conn);
objCommand.CommandType = CommandType.StoredProcedure;
objCommand.Parameters.AddWithValue("", PageNo);
objCommand.Parameters.AddWithValue("", RowCountPerPage);
objCommand.Parameters.AddWithValue("", IsPaging);
SqlDataReader _Reader = objCommand.ExecuteReader();
while (_Reader.Read())
{
tblCustomer objCust = new tblCustomer();
objCust.CustID = Convert.ToInt32(_Reader["CustID"]);
objCust.CustName = _Reader["CustName"].ToString();
objCust.CustEmail = _Reader["CustEmail"].ToString();
objCust.CustAddress = _Reader["CustAddress"].ToString();
objCust.CustContact = _Reader["CustContact"].ToString();
_listCustomer.Add(objCust);
}
return _listCustomer;
}
catch
{
throw;
}
finally
{
if (Conn != null)
{
if (Conn.State == ConnectionState.Open)
{
Conn.Close();
Conn.Dispose();
}
}
}
}
public tblCustomer GetCustomerDetails(long? id)
{
dbConnector objConn = new dbConnector();
SqlConnection Conn = objConn.GetConnection;
Conn.Open();
try
{
tblCustomer objCust = new tblCustomer();
if (Conn.State != System.Data.ConnectionState.Open)
Conn.Open();
SqlCommand objCommand = new SqlCommand("VIEW_CUSTOMER", Conn);
objCommand.CommandType = CommandType.StoredProcedure;
objCommand.Parameters.AddWithValue("", id);
SqlDataReader _Reader = objCommand.ExecuteReader();
while (_Reader.Read())
{
objCust.CustID = Convert.ToInt32(_Reader["CustID"]);
objCust.CustName = _Reader["CustName"].ToString();
objCust.CustEmail = _Reader["CustEmail"].ToString();
objCust.CustAddress = _Reader["CustAddress"].ToString();
objCust.CustContact = _Reader["CustContact"].ToString();
}
return objCust;
}
catch
{
throw;
}
finally
{
if (Conn != null)
{
if (Conn.State == ConnectionState.Open)
{
Conn.Close();
Conn.Dispose();
}
}
}
}
public Int32 InsertCustomer(tblCustomer objCust)
{
dbConnector objConn = new dbConnector();
SqlConnection Conn = objConn.GetConnection;
Conn.Open();
int result = 0;
try
{
if (Conn.State != System.Data.ConnectionState.Open)
Conn.Open();
SqlCommand objCommand = new SqlCommand("CREATE_CUSTOMER", Conn);
objCommand.CommandType = CommandType.StoredProcedure;
objCommand.Parameters.AddWithValue("", objCust.CustName);
objCommand.Parameters.AddWithValue("", objCust.CustEmail);
objCommand.Parameters.AddWithValue("", objCust.CustAddress);
objCommand.Parameters.AddWithValue("", objCust.CustContact);
result = Convert.ToInt32(objCommand.ExecuteScalar());
if (result > 0)
{
return result;
}
else
{
return 0;
}
}
catch
{
throw;
}
finally
{
if (Conn != null)
{
if (Conn.State == ConnectionState.Open)
{
Conn.Close();
Conn.Dispose();
}
}
}
}
public Int32 UpdateCustomer(tblCustomer objCust)
{
dbConnector objConn = new dbConnector();
SqlConnection Conn = objConn.GetConnection;
Conn.Open();
int result = 0;
try
{
if (Conn.State != System.Data.ConnectionState.Open)
Conn.Open();
SqlCommand objCommand = new SqlCommand("UPDATE_CUSTOMER", Conn);
objCommand.CommandType = CommandType.StoredProcedure;
objCommand.Parameters.AddWithValue("", objCust.CustID);
objCommand.Parameters.AddWithValue("", objCust.CustName);
objCommand.Parameters.AddWithValue("", objCust.CustEmail);
objCommand.Parameters.AddWithValue("", objCust.CustAddress);
objCommand.Parameters.AddWithValue("", objCust.CustContact);
result = Convert.ToInt32(objCommand.ExecuteScalar());
if (result > 0)
{
return result;
}
else
{
return 0;
}
}
catch
{
throw;
}
finally
{
if (Conn != null)
{
if (Conn.State == ConnectionState.Open)
{
Conn.Close();
Conn.Dispose();
}
}
}
}
public Int32 DeleteCustomer(long? id)
{
dbConnector objConn = new dbConnector();
SqlConnection Conn = objConn.GetConnection;
Conn.Open();
int result = 0;
try
{
if (Conn.State != System.Data.ConnectionState.Open)
Conn.Open();
SqlCommand objCommand = new SqlCommand("DELETE_CUSTOMER", Conn);
objCommand.CommandType = CommandType.StoredProcedure;
objCommand.Parameters.AddWithValue("", id);
result = Convert.ToInt32(objCommand.ExecuteScalar());
if (result > 0)
{
return result;
}
else
{
return 0;
}
}
catch
{
throw;
}
finally
{
if (Conn != null)
{
if (Conn.State == ConnectionState.Open)
{
Conn.Close();
Conn.Dispose();
}
}
}
}
}
}
Publish the Site in IIS:

Let’s assign a port to access, In this case the site base url is: http://localhost:8081/

Let’s Create Windows Form Application:
Open Visual Studio 2015, Click File> New > Project. In this window give a name the project and solution. This time we will create a Windows Form Application.

In our new application let’s create a new Form, name it CRUDForm.cs
Our new form will look like this screen:

In CRUD form we have a data grid which will load all data from database through api controller.
Form Submission Code:
namespace CRUD_WF
{
public partial class CRUDForm : Form
{
private int pageNumber = 1;
private int pageSize = 0;
private string baseUrl = string.Empty;
private string url = string.Empty;
public CRUDForm()
{
InitializeComponent();
baseUrl = txtUrl.Text.ToString().Trim();
pageSize = 5;
url = baseUrl + "api/Customer?pageSize=" + pageSize;
}
private void CRUDForm_Load(object sender, EventArgs e)
{
GetCustomer_(url);
}
private async void GetCustomer_(string url)
{
try
{
using (var objClient = new HttpClient())
{
using (var response = await objClient.GetAsync(url))
{
if (response.IsSuccessStatusCode)
{
var productJsonString = await response.Content.ReadAsStringAsync();
dgList.DataSource = JsonConvert.DeserializeObject(productJsonString).ToList();
}
}
}
}
catch
{
pageSize = 5; pageNumber = 1;
MessageBox.Show("Invalid URL!!");
}
}
private void btnSubmit_Click(object sender, EventArgs e)
{
if (btnSubmit.Text != "Update")
{
CreateCustomer();
}
else
{
if (lblCustID.Text == "")
{
MessageBox.Show("Please Select a Customer to Edit");
}
else
{
EditCustomer();
}
}
}
private async void CreateCustomer()
{
try
{
string InsertUrl = baseUrl + "api/Customer/Create";
tblCustomer objCust = new tblCustomer();
objCust.CustName = txtCustName.Text.ToString();
objCust.CustEmail = txtCustEmail.Text.ToString();
objCust.CustAddress = txtCustAddress.Text.ToString();
objCust.CustContact = txtCustContact.Text.ToString();
if ((objCust != null) && (objCust.CustEmail != ""))
{
using (var objClient = new HttpClient())
{
string contentType = "application/json";
var serializedCustomer = JsonConvert.SerializeObject(objCust);
var content = new StringContent(serializedCustomer, Encoding.UTF8, contentType);
var result = await objClient.PostAsync(InsertUrl, content);
GetCustomer_(url);
Clear();
}
}
else
{
MessageBox.Show("Email Id is Must!");
}
}
catch
{
MessageBox.Show("Invalid Customer!!");
}
}
private async void EditCustomer()
{
try
{
string EditUrl = baseUrl + "api/Customer/Edit";
tblCustomer objCust = new tblCustomer();
objCust.CustID = Convert.ToInt32(lblCustID.Text);
objCust.CustName = txtCustName.Text.ToString();
objCust.CustEmail = txtCustEmail.Text.ToString();
objCust.CustAddress = txtCustAddress.Text.ToString();
objCust.CustContact = txtCustContact.Text.ToString();
if ((objCust != null) && (objCust.CustEmail != ""))
{
using (var objClient = new HttpClient())
{
string contentType = "application/json";
var serializedCustomer = JsonConvert.SerializeObject(objCust);
var content = new StringContent(serializedCustomer, Encoding.UTF8, contentType);
var result = await objClient.PostAsync(EditUrl, content);
GetCustomer_(url);
}
}
else
{
MessageBox.Show("Email Id is Must!");
}
}
catch
{
MessageBox.Show("Invalid Customer!!");
}
}
private void btnDelete_Click(object sender, EventArgs e)
{
try
{
if (lblCustID.Text == "")
{
MessageBox.Show("Please Select a Customer to Delete");
}
else
{
DialogResult result = MessageBox.Show("You are about to delete " + txtCustName.Text + " permanently. Are you sure you want to delete this record?", "Delete", MessageBoxButtons.OKCancel, MessageBoxIcon.Information);
if (result.Equals(DialogResult.OK))
{
long CustID = Convert.ToInt64(lblCustID.Text);
DeleteCustomer(CustID);
}
}
}
catch
{
MessageBox.Show("Invalid Customer!!");
}
}
private async void DeleteCustomer(long? id)
{
try
{
string DeleteUrl = baseUrl + "api/Customer/Delete";
using (var objClient = new HttpClient())
{
var result = await objClient.DeleteAsync(String.Format("{0}/{1}", DeleteUrl, id));
}
GetCustomer_(url);
}
catch
{
MessageBox.Show("Invalid Customer!!");
}
}
private void btnNew_Click(object sender, EventArgs e)
{
Clear();
}
private void btnReset_Click(object sender, EventArgs e)
{
Clear();
}
private void Clear()
{
lblCustID.Text = "";
txtCustName.Text = "";
txtCustEmail.Text = "";
txtCustAddress.Text = "";
txtCustContact.Text = "";
btnSubmit.Text = "Submit";
txtCustEmail.ReadOnly = false;
}
private void txtUrl_TextChanged(object sender, EventArgs e)
{
try
{
baseUrl = txtUrl.Text.ToString().Trim();
}
catch
{
MessageBox.Show("Invalid Approach!!");
}
}
private void btnNext_Click(object sender, EventArgs e)
{
try
{
if (pageNumber == 0)
pageNumber = 1;
pageSize = 5; pageNumber++;
string url = baseUrl + "api/Customer?pageNumber=" + pageNumber + "&pageSize=" + pageSize;
GetCustomer_(url);
btnReload.Text = "Page View: " + pageNumber.ToString() + "/Reload..";
}
catch
{
MessageBox.Show("Invalid Approach!!");
}
}
private void btnPrev_Click(object sender, EventArgs e)
{
try
{
pageSize = 5; pageNumber--;
if (pageNumber == 0)
pageNumber = pageNumber + 1;
string url = baseUrl + "api/Customer?pageNumber=" + pageNumber + "&pageSize=" + pageSize;
GetCustomer_(url);
btnReload.Text = "Page View: " + pageNumber.ToString() + "/Reload..";
}
catch
{
MessageBox.Show("Invalid Approach!!");
}
}
private void btnReload_Click(object sender, EventArgs e)
{
pageSize = 5;
pageNumber = 1;
GetCustomer_(url);
btnReload.Text = "Reload..";
}
private void dgList_SelectionChanged(object sender, EventArgs e)
{
try
{
if (dgList.SelectedCells.Count > 0)
{
int selectedrowindex = dgList.SelectedCells[0].RowIndex;
DataGridViewRow selectedRow = dgList.Rows[selectedrowindex];
lblCustID.Text = Convert.ToString(selectedRow.Cells[0].Value);
txtCustName.Text = Convert.ToString(selectedRow.Cells[1].Value);
txtCustEmail.Text = Convert.ToString(selectedRow.Cells[2].Value);
txtCustAddress.Text = Convert.ToString(selectedRow.Cells[3].Value);
txtCustContact.Text = Convert.ToString(selectedRow.Cells[4].Value);
btnSubmit.Text = "Update";
txtCustEmail.ReadOnly = true;
}
}
catch
{
MessageBox.Show("Invalid Customer!!");
}
}
}
}
Desktop Application:

In this stage we need to input the HTTP Url to perform CRUD Operation through api controller.
Web Application:

OUTPUT:
Finally displaying data in both Web & Desktop Application at the same time using Web API.
Hope this will help someone …Thanks.
says:
A very detailed and good explanation on the topic. Keep writing more articles. Thanks for sharing.
Shashangka Shekhar says:
Thanks a lot 🙂