[Feature] ODBC connections ora utilizzano solo query custom, nascosto discovery tabelle

- Modificato OnDatabaseCredentialChanged per rilevare connessioni ODBC e forzare useCustomQuery = true
- Aggiunto metodo helper IsOdbcConnection() per verificare tipo credenziale
- Modificata UI DataCoupler.razor:
  * Nascosto pulsante 'Connetti e Scopri Schema' per ODBC
  * Mostrato messaggio esplicativo per ODBC
  * Resa sezione Query Custom sempre visibile per ODBC (senza discovery)
  * Nascosta sezione Lista Tabelle per ODBC
- Modificato ValidateCustomQuery per creare temporaneamente DatabaseManager per ODBC
- ODBC ora bypassa completamente il discovery e va diretto a query custom
This commit is contained in:
Alessio Dal Santo
2026-02-03 09:26:00 +01:00
parent f270a4a434
commit 8a8ccec170
2 changed files with 198 additions and 16 deletions
@@ -67,6 +67,19 @@ public partial class DataCoupler : ComponentBase
// ===== METODI DATABASE =====
/// <summary>
/// Verifica se la credenziale database selezionata è di tipo ODBC
/// </summary>
/// <returns>True se la credenziale è ODBC, altrimenti False</returns>
protected bool IsOdbcConnection()
{
if (string.IsNullOrEmpty(selectedDatabaseCredential))
return false;
var credential = databaseCredentials.FirstOrDefault(c => c.Name == selectedDatabaseCredential);
return credential?.DatabaseType == DatabaseType.Odbc;
}
/// <summary>
/// Gestisce il cambio di credenziale database selezionata
/// </summary>
@@ -74,6 +87,12 @@ public partial class DataCoupler : ComponentBase
{
selectedDatabaseCredential = e.Value?.ToString() ?? "";
ResetDatabaseState();
// Se è una connessione ODBC, forza l'uso di query custom
if (IsOdbcConnection())
{
useCustomQuery = true;
}
}
/// <summary>
@@ -571,14 +590,15 @@ public partial class DataCoupler : ComponentBase
/// </summary>
protected async Task ValidateCustomQuery()
{
if (string.IsNullOrWhiteSpace(customQuery) || currentDatabaseManager == null)
if (string.IsNullOrWhiteSpace(customQuery))
{
isQueryValid = false;
queryValidationMessage = "Query vuota o manager database non disponibile";
queryValidationMessage = "Query vuota";
return;
}
isValidatingQuery = true;
IDatabaseManager? tempManager = null;
try
{
@@ -601,13 +621,30 @@ public partial class DataCoupler : ComponentBase
return;
}
// Per ODBC, crea un database manager temporaneo se non esiste
var managerToUse = currentDatabaseManager;
if (managerToUse == null && IsOdbcConnection())
{
Logger.LogInformation("Creando database manager temporaneo per validazione query ODBC");
tempManager = await ConnectionFactory.CreateDatabaseManagerAsync(selectedDatabaseCredential);
managerToUse = tempManager;
}
// Se ancora non abbiamo un manager, errore
if (managerToUse == null)
{
isQueryValid = false;
queryValidationMessage = "Manager database non disponibile. Connettersi prima di validare la query.";
return;
}
// Crea una query di test con sintassi appropriata per il tipo di database
var testQuery = CreateLimitedQuery(cleanQuery, credential.DatabaseType, 1);
Logger.LogInformation("Validando query: {Query}", testQuery);
// Prova a eseguire la query per validarla
var testResults = await currentDatabaseManager.ExecuteRawQueryAsync(testQuery);
var testResults = await managerToUse.ExecuteRawQueryAsync(testQuery);
if (testResults != null && testResults.Any())
{
@@ -623,6 +660,13 @@ public partial class DataCoupler : ComponentBase
TryAutoSelectKeyForQuery(queryColumns);
Logger.LogInformation("Query validata con successo: {ColumnCount} colonne", queryColumns.Count);
// Per ODBC, salva il manager se non era già presente
if (IsOdbcConnection() && currentDatabaseManager == null && tempManager != null)
{
currentDatabaseManager = tempManager;
tempManager = null; // Non distruggerlo nel finally
}
}
else
{
@@ -639,6 +683,13 @@ public partial class DataCoupler : ComponentBase
finally
{
isValidatingQuery = false;
// Pulisci il manager temporaneo se non è stato salvato
if (tempManager != null)
{
try { tempManager.Dispose(); } catch { /* Ignora errori di dispose */ }
}
StateHasChanged();
}
}