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 unSqlDataReader
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#.
Curs de Programació en F#
Mòdul 1: Introducció a F#
Mòdul 2: Conceptes Bàsics
- Tipus de Dades i Variables
- Funcions i Immutabilitat
- Coincidència de Patrons
- Col·leccions: Llistes, Matrius i Seqüències
Mòdul 3: Programació Funcional
Mòdul 4: Estructures de Dades Avançades
Mòdul 5: Programació Orientada a Objectes en F#
- Classes i Objectes
- Herència i Interfícies
- Barreja de Programació Funcional i Orientada a Objectes
- Mòduls i Espais de Noms
Mòdul 6: Programació Asíncrona i Paral·lela
- Fluxos de Treball Asíncrons
- Biblioteca de Tasques Paral·leles
- MailboxProcessor i Agents
- Patrons de Concurrència
Mòdul 7: Accés i Manipulació de Dades
Mòdul 8: Proves i Depuració
- Proves Unitàries amb NUnit
- Proves Basades en Propietats amb FsCheck
- Tècniques de Depuració
- Perfilat de Rendiment