Files
Data-Coupler/FOXPRO_CONNECTION.md
T
Alessio e70abcdcb1 [Feature] Supporto Visual FoxPro / dBase come sorgente dati (managed, sola lettura)
Aggiunge un connettore completamente managed per database Visual FoxPro e dBase,
utilizzabile come sorgente dati in tutti i flussi dell'applicazione (discovery manuale,
esecuzione schedulata, hash/change-detection, backup/restore).

## Motivazione

Il provider OLE DB ufficiale (VFPOLEDB.1) è solo a 32-bit, deprecato e richiede
installazione separata. Il connettore managed usa DbfDataReader 1.0.0 (MIT), legge
direttamente i file .dbf/.fpt/.dbc a 64-bit senza dipendenze esterne e con streaming
efficiente (tabelle da centinaia di MB con uso di memoria contenuto).

## Nuovi file

- DataConnection/DB/FoxPro/FoxProConnectionInfo.cs
  Classe sealed con le informazioni di connessione risolte (cartella, percorso .dbc,
  encoding, flag IncludeDeleted). Proprietà di convenienza IsContainer e DisplayName.

- DataConnection/DB/FoxPro/FoxProReader.cs
  Helper statico che registra CodePagesEncodingProvider, risolve la connection string
  (path diretto, stile OLE DB con Provider=vfpoledb, chiave=valore), verifica l'accesso
  al filesystem, legge il catalogo .dbc (il file .dbc è esso stesso un DBF; filtro su
  OBJECTTYPE='Table' + cross-check esistenza fisica .dbf), enumera le tabelle free,
  mappa i tipi VFP (Character, Memo, Numeric, Float, Double, Integer, Currency, Date,
  DateTime, Logical, General) in descrizioni leggibili, esegue streaming dei record via
  DbfDataReader, auto-rileva l'encoding dall'header DBF (language driver byte) con
  fallback a code page 1252, e analizza query SELECT [TOP n] * FROM tabella.

- DataConnection/DB/FoxProDatabaseManager.cs
  Implementa IDatabaseManager. Lettura: TestConnectionAsync, GetTableNamesAsync,
  GetTableSchemaAsync, GetDatabaseSchemaAsync, GetAllRecordsAsync, ExecuteRawQueryAsync,
  GetPrimaryKeyFieldAsync (ritorna null, selezione manuale chiave), GetAvailableDatabasesAsync,
  ChangeDatabaseAsync (no-op per sorgenti file-based).
  Scrittura: tutti i metodi di modifica (Insert/Update/Delete/Upsert/BulkInsert/
  ExecuteCommand/ExecuteNonQuery) lanciano NotSupportedException con messaggio esplicito.

- DataConnection/DB/EF/SchemaProviders/FoxProSchemaProvider.cs
  Implementa IDatabaseSchemaProvider delegando a FoxProReader. Gestione errori per tabella
  in GetDatabaseSchemaAsync (una tabella non apribile non blocca la discovery).

- FOXPRO_CONNECTION.md
  Guida utente: passo-passo per creare la credenziale, formato connection string,
  tabella tipi VFP supportati, note su sola lettura e limitazioni query, tabella
  risoluzione problemi (caratteri accentati, tabelle mancanti, ecc.).

## File modificati

- DataConnection/DataConnection.csproj
  Aggiunto DbfDataReader 1.0.0 (porta transitivamente System.Text.Encoding.CodePages
  >= 10.0.3; rimossa dipendenza esplicita alla versione 9.0.3 che causava NU1605).

- DataConnection/DB/Enums/DatabaseType.cs
  Aggiunto valore Foxpro in fondo all'enum (preserva valori già persistiti).

- CredentialManager/Models/CredentialModels.cs
  Aggiunto DatabaseType.Foxpro all'enum e metodo BuildFoxproConnectionString che genera
  "Data Source=percorso[;CodePage=n][;IncludeDeleted=true]".

- DataConnection/CredentialManagement/Models/CredentialExtensions.cs
  Mappatura bidirezionale Foxpro tra enum CredentialManager e DataConnection.

- DataConnection/CredentialManagement/Services/DataConnectionCredentialService.cs
  Aggiunto TestFoxproConnection: verifica percorso accessibile, legge nomi tabelle,
  restituisce messaggio con conteggio tabelle, encoding rilevato e nota sola lettura.

- DataConnection/DB/EF/DatabaseSchemaProviderFactory.cs
  Caso Foxpro => new FoxProSchemaProvider().

- Data_Coupler/Services/DataConnectionFactory.cs
  Branch Foxpro => new FoxProDatabaseManager(connectionString).

- Data_Coupler/Extensions/DataCoupler/DatabaseMethod.cs
  Aggiunto IsFoxproConnection() e caso Foxpro in CreateLimitedQuery
  (SELECT TOP n * FROM (query) AS subquery).

- CredentialManager/Integration/DataConnectionHelper.cs
  ValidateDatabaseCredential: introdotto flag isFileBased (Sqlite || Foxpro) per
  esonerare host/utente/password/porta; messaggio di errore specifico per il campo
  percorso FoxPro.

- Data_Coupler/Pages/CredentialManagement.razor
  Aggiunta opzione "Visual FoxPro (.dbc / .dbf)" nel selettore tipo database.
  Sezione di configurazione dedicata: banner sola lettura, campo percorso con esempi
  (.dbc e cartella), dropdown code page (Auto/1252/1250/1251/850/437/65001), checkbox
  record cancellati, pannello tipi supportati, anteprima connection string.
  Fix validazione form test-connessione: branch Foxpro che verifica solo DatabaseName
  (non Host/Username/Password), eliminando il falso errore "Il campo Host è obbligatorio".

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-06 19:34:21 +02:00

107 lines
4.5 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Connessione a database Visual FoxPro
Data-Coupler supporta i database **Visual FoxPro / dBase** come **sorgente dati** (sola lettura)
tramite un lettore **completamente managed**: legge direttamente i file `.dbf` (tabelle),
`.fpt` (campi memo) e `.dbc` (database container) **senza installare alcun provider OLE DB/ODBC**
e funzionando a **64-bit**.
> ️ **Perché managed e non OLE DB?** Il provider `VFPOLEDB.1` di Microsoft è **solo a 32-bit**,
> deprecato e va installato a parte. Il lettore managed non ha questi vincoli e funziona ovunque
> giri l'applicazione (anche in container Linux/Windows a 64-bit).
---
## 1. Come connettersi (esempio)
La "connessione" FoxPro è semplicemente un **percorso**. Non serve host, utente o password.
### Passo passo nell'interfaccia
1. Vai su **Credenziali****Aggiungi credenziale database**.
2. **Nome**: un nome a piacere (es. `Gestionale FoxPro`).
3. **Tipo Database**: seleziona **Visual FoxPro (.dbc / .dbf)**.
4. **Percorso Database FoxPro**: inserisci uno dei due:
| Caso | Cosa inserire | Esempio |
|---|---|---|
| **Database container** | percorso completo al file `.dbc` | `C:\Users\aless\Desktop\data\Data.dbc` |
| **Tabelle libere** (free tables) | percorso della **cartella** con i `.dbf` | `C:\Users\aless\Desktop\data` |
5. (Opzionale) **Code Page**: lascia `1252` per dati italiani/europei occidentali.
6. (Opzionale) **Record cancellati**: lascia deselezionato per escludere i record marcati come cancellati.
7. Premi **Test connessione**: deve mostrare il numero di tabelle rilevate.
8. **Salva**.
A questo punto la credenziale è utilizzabile come **sorgente** nella pagina **Data Coupler**:
selezionala, attendi la discovery delle tabelle, scegli la tabella e procedi con il mapping.
---
## 2. Formato della connection string
Internamente la credenziale viene tradotta in una stringa interpretata dal lettore FoxPro.
Sono accettate tutte queste forme (utile se incolli un percorso o una stringa esistente):
```
C:\Users\aless\Desktop\data\Data.dbc
C:\Users\aless\Desktop\data
Data Source=C:\Users\aless\Desktop\data\Data.dbc;CodePage=1252;IncludeDeleted=false
Provider=vfpoledb;Data Source=C:\Users\aless\Desktop\data\Data.dbc;Collating Sequence=machine;
```
> Le stringhe stile **OLE DB** (`Provider=vfpoledb;Data Source=...`) sono accettate per comodità:
> viene estratto automaticamente il valore di `Data Source`. `Provider` e `Collating Sequence`
> vengono ignorati (il lettore è managed).
Opzioni riconosciute:
| Chiave | Significato | Default |
|---|---|---|
| `Data Source` | percorso al `.dbc` o alla cartella di `.dbf` | — (obbligatorio) |
| `CodePage` / `Encoding` | code page per i campi carattere/memo | auto-rilevata dall'header, fallback **1252** |
| `IncludeDeleted` | includere i record marcati come cancellati | `false` |
---
## 3. Tipi di dato supportati
| Tipo VFP | Mappato come |
|---|---|
| Character (`C`) | testo |
| Varchar (`V`) | testo |
| Memo (`M`, file `.fpt`) | testo |
| Numeric (`N`) | decimale |
| Float (`F`) | decimale |
| Double (`B`) | double |
| Integer (`I`) | intero |
| Currency (`Y`) | decimale |
| Date (`D`) | data |
| DateTime (`T`) | data/ora |
| Logical (`L`) | booleano |
I file memo (`.fpt`) e gli indici (`.cdx`) vengono individuati **automaticamente** accanto al `.dbf`.
---
## 4. Note e limitazioni
- **Sola lettura**: FoxPro è utilizzabile solo come **sorgente**. La scrittura sui `.dbf` non è
supportata (eviterebbe il rischio di corrompere indici `.cdx` e memo `.fpt` di gestionali legacy in uso).
- **Elenco tabelle**: con un `.dbc` viene letto il catalogo del container (solo le tabelle effettivamente
presenti come file `.dbf`); con una cartella vengono elencati tutti i `.dbf` presenti.
- **Query**: la sorgente lavora in modalità "tabella" (estrazione completa della tabella selezionata).
Le eventuali query custom supportano solo `SELECT [TOP n] * FROM <tabella>` (niente JOIN/WHERE evoluti).
- **Performance**: la lettura è in **streaming**; anche tabelle da centinaia di MB vengono elaborate
con un uso di memoria contenuto.
---
## 5. Risoluzione problemi
| Sintomo | Causa probabile | Soluzione |
|---|---|---|
| "Cartella del database FoxPro non trovata" | percorso errato | verifica il percorso del `.dbc` o della cartella |
| "nessuna tabella .dbf trovata" | cartella senza `.dbf` | indica la cartella giusta o il file `.dbc` |
| Caratteri accentati errati | code page diversa | imposta la **Code Page** corretta (es. 1250, 65001) |
| Una tabella non compare | `.dbf` referenziato nel `.dbc` ma file assente | ripristina il file `.dbf` mancante |