En aquest tema, aprendrem com interactuar amb bases de dades utilitzant F#. Explorarem com connectar-nos a una base de dades, executar consultes i manipular dades. Utilitzarem SQL i també veurem com utilitzar proveïdors de tipus per a una interacció més segura i eficient.

Continguts

Configuració de la Connexió a la Base de Dades

Abans de poder interactuar amb una base de dades, necessitem configurar la connexió. Utilitzarem la biblioteca System.Data.SqlClient per a aquest propòsit.

Exemple de Connexió

open System.Data.SqlClient

let connectionString = "Server=myServerAddress;Database=myDataBase;User Id=myUsername;Password=myPassword;"

let connectToDatabase () =
    use connection = new SqlConnection(connectionString)
    connection.Open()
    printfn "Connexió establerta amb èxit"
    connection.Close()

Explicació

  • connectionString: Cadena de connexió que conté la informació necessària per connectar-se a la base de dades.
  • SqlConnection: Classe que representa una connexió a una base de dades SQL.
  • connection.Open(): Obre la connexió a la base de dades.
  • connection.Close(): Tanca la connexió a la base de dades.

Execució de Consultes SQL

Un cop establerta la connexió, podem executar consultes SQL per recuperar dades.

Exemple de Consulta SQL

let executeQuery () =
    use connection = new SqlConnection(connectionString)
    connection.Open()
    
    let query = "SELECT * FROM Employees"
    use command = new SqlCommand(query, connection)
    use reader = command.ExecuteReader()
    
    while reader.Read() do
        printfn "ID: %d, Name: %s" (reader.GetInt32(0)) (reader.GetString(1))
    
    connection.Close()

Explicació

  • SqlCommand: Classe que representa una instrucció SQL que s'executarà contra una base de dades.
  • ExecuteReader(): Executa la consulta i retorna un SqlDataReader per llegir les dades.
  • reader.Read(): Llegeix la següent fila de resultats.

Manipulació de Dades

Podem inserir, actualitzar i eliminar dades utilitzant instruccions SQL.

Exemple d'Inserció de Dades

let insertData () =
    use connection = new SqlConnection(connectionString)
    connection.Open()
    
    let query = "INSERT INTO Employees (Name, Age) VALUES (@name, @age)"
    use command = new SqlCommand(query, connection)
    command.Parameters.AddWithValue("@name", "John Doe")
    command.Parameters.AddWithValue("@age", 30)
    
    let rowsAffected = command.ExecuteNonQuery()
    printfn "Files afectades: %d" rowsAffected
    
    connection.Close()

Explicació

  • Parameters.AddWithValue(): Afegeix un paràmetre a la instrucció SQL per evitar injeccions SQL.
  • ExecuteNonQuery(): Executa una instrucció SQL que no retorna cap resultat (inserció, actualització, eliminació).

Ús de Proveïdors de Tipus

Els proveïdors de tipus permeten una interacció més segura amb la base de dades, proporcionant tipus forts i verificació en temps de compilació.

Exemple amb FSharp.Data.SqlClient

#r "nuget: FSharp.Data.SqlClient"

open FSharp.Data

type GetEmployees = SqlCommandProvider<"SELECT * FROM Employees", connectionString>

let getEmployees () =
    use cmd = new GetEmployees()
    let results = cmd.Execute()
    for row in results do
        printfn "ID: %d, Name: %s" row.EmployeeID row.Name

Explicació

  • SqlCommandProvider: Proveïdor de tipus que genera tipus forts per a la consulta SQL especificada.
  • cmd.Execute(): Executa la consulta i retorna els resultats com a tipus forts.

Exercicis Pràctics

Exercici 1: Recuperar Dades

Escriu una funció que recuperi tots els registres de la taula Departments i imprimeixi el nom de cada departament.

Exercici 2: Inserir Dades

Escriu una funció que insereixi un nou registre a la taula Departments amb els camps Name i Location.

Exercici 3: Actualitzar Dades

Escriu una funció que actualitzi el camp Location d'un departament existent identificat pel seu DepartmentID.

Exercici 4: Eliminar Dades

Escriu una funció que elimini un registre de la taula Departments identificat pel seu DepartmentID.

Solucions

Solució Exercici 1

let getDepartments () =
    use connection = new SqlConnection(connectionString)
    connection.Open()
    
    let query = "SELECT Name FROM Departments"
    use command = new SqlCommand(query, connection)
    use reader = command.ExecuteReader()
    
    while reader.Read() do
        printfn "Department Name: %s" (reader.GetString(0))
    
    connection.Close()

Solució Exercici 2

let insertDepartment () =
    use connection = new SqlConnection(connectionString)
    connection.Open()
    
    let query = "INSERT INTO Departments (Name, Location) VALUES (@name, @location)"
    use command = new SqlCommand(query, connection)
    command.Parameters.AddWithValue("@name", "HR")
    command.Parameters.AddWithValue("@location", "New York")
    
    let rowsAffected = command.ExecuteNonQuery()
    printfn "Files afectades: %d" rowsAffected
    
    connection.Close()

Solució Exercici 3

let updateDepartmentLocation departmentID newLocation =
    use connection = new SqlConnection(connectionString)
    connection.Open()
    
    let query = "UPDATE Departments SET Location = @location WHERE DepartmentID = @id"
    use command = new SqlCommand(query, connection)
    command.Parameters.AddWithValue("@location", newLocation)
    command.Parameters.AddWithValue("@id", departmentID)
    
    let rowsAffected = command.ExecuteNonQuery()
    printfn "Files afectades: %d" rowsAffected
    
    connection.Close()

Solució Exercici 4

let deleteDepartment departmentID =
    use connection = new SqlConnection(connectionString)
    connection.Open()
    
    let query = "DELETE FROM Departments WHERE DepartmentID = @id"
    use command = new SqlCommand(query, connection)
    command.Parameters.AddWithValue("@id", departmentID)
    
    let rowsAffected = command.ExecuteNonQuery()
    printfn "Files afectades: %d" rowsAffected
    
    connection.Close()

Conclusió

En aquesta secció, hem après com configurar una connexió a una base de dades, executar consultes SQL, manipular dades i utilitzar proveïdors de tipus per a una interacció més segura. Els exercicis pràctics proporcionen una oportunitat per aplicar aquests conceptes i reforçar el teu coneixement. En el següent tema, explorarem com treballar amb JSON en F#.

© Copyright 2024. Tots els drets reservats