[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:
@@ -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();
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user