1. ADO.NET Overview
- ADO.NET is a set of classes for interacting with SQL Server and other databases.
- Key components:
SqlConnection → Connects to databaseSqlCommand → Executes queries or stored proceduresSqlDataReader → Reads data in forward-only modeSqlDataAdapter → Fills DataSet/DataTable
2. SqlConnection, SqlCommand, SqlDataReader, SqlDataAdapter
2.1 SqlConnection
using System.Data.SqlClient;
string connectionString = @"Server=.;Database=TestDB;Trusted_Connection=True;";
using (SqlConnection conn = new SqlConnection(connectionString))
{
conn.Open();
Console.WriteLine("Database connected!");
}
2.2 SqlCommand
string query = "SELECT * FROM Students";
using (SqlCommand cmd = new SqlCommand(query, conn))
{
using (SqlDataReader reader = cmd.ExecuteReader())
{
while (reader.Read())
{
Console.WriteLine(reader["Name"] + " - " + reader["Age"]);
}
}
}
2.3 SqlDataAdapter
using System.Data;
SqlDataAdapter adapter = new SqlDataAdapter("SELECT * FROM Students", conn);
DataTable dt = new DataTable();
adapter.Fill(dt);
foreach (DataRow row in dt.Rows)
{
Console.WriteLine(row["Name"] + " - " + row["Age"]);
}
3. Parameters and Stored Procedures
Using parameters prevents SQL Injection.
string query = "INSERT INTO Students (Name, Age) VALUES (@Name, @Age)";
using (SqlCommand cmd = new SqlCommand(query, conn))
{
cmd.Parameters.AddWithValue("@Name", "John");
cmd.Parameters.AddWithValue("@Age", 25);
cmd.ExecuteNonQuery();
}
Stored Procedure
CREATE PROCEDURE GetStudentById
@Id INT
AS
BEGIN
SELECT * FROM Students WHERE Id = @Id
END
using (SqlCommand cmd = new SqlCommand("GetStudentById", conn))
{
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.AddWithValue("@Id", 1);
using (SqlDataReader reader = cmd.ExecuteReader())
{
if (reader.Read())
Console.WriteLine(reader["Name"] + " - " + reader["Age"]);
}
}
4. Transactions
Ensure all-or-nothing execution of multiple commands.
using (SqlTransaction transaction = conn.BeginTransaction())
{
try
{
SqlCommand cmd1 = new SqlCommand("INSERT INTO Students(Name, Age) VALUES('Alice', 22)", conn, transaction);
SqlCommand cmd2 = new SqlCommand("INSERT INTO Students(Name, Age) VALUES('Bob', 23)", conn, transaction);
cmd1.ExecuteNonQuery();
cmd2.ExecuteNonQuery();
transaction.Commit();
Console.WriteLine("Transaction committed!");
}
catch
{
transaction.Rollback();
Console.WriteLine("Transaction rolled back!");
}
}
5. Entity Framework Core
- EF Core is an ORM that maps C# classes to database tables.
- Install via NuGet:
dotnet add package Microsoft.EntityFrameworkCore.SqlServer
dotnet add package Microsoft.EntityFrameworkCore.Tools
5.1 DbContext & Models
using Microsoft.EntityFrameworkCore;
public class Student
{
public int Id { get; set; }
public string Name { get; set; }
public int Age { get; set; }
}
public class SchoolContext : DbContext
{
public DbSet<Student> Students { get; set; }
protected override void OnConfiguring(DbContextOptionsBuilder options)
=> options.UseSqlServer(@"Server=.;Database=TestDB;Trusted_Connection=True;");
}
6. CRUD Operations with EF Core
6.1 Create
using (var context = new SchoolContext())
{
var student = new Student { Name = "John", Age = 25 };
context.Students.Add(student);
context.SaveChanges();
}
6.2 Read
using (var context = new SchoolContext())
{
var students = context.Students.ToList();
foreach (var s in students)
Console.WriteLine($"{s.Name} - {s.Age}");
}
6.3 Update
using (var context = new SchoolContext())
{
var student = context.Students.First();
student.Age = 26;
context.SaveChanges();
}
6.4 Delete
using (var context = new SchoolContext())
{
var student = context.Students.First();
context.Students.Remove(student);
context.SaveChanges();
}
7. LINQ with EF Core
EF Core supports LINQ queries to retrieve data.
using (var context = new SchoolContext())
{
var teenStudents = context.Students
.Where(s => s.Age >= 13 && s.Age <= 19)
.OrderBy(s => s.Name)
.ToList();
foreach (var s in teenStudents)
Console.WriteLine($"{s.Name} - {s.Age}");
}
Summary of Chapter 13:
- ADO.NET: Low-level database access using
SqlConnection, SqlCommand, SqlDataReader. - Parameters & Stored Procedures: Prevent SQL injection and reuse logic.
- Transactions: Ensure atomic operations.
- EF Core: High-level ORM for CRUD operations and LINQ queries.
- LINQ with EF Core: Write readable and type-safe database queries.