diff --git a/Data_Coupler/Extensions/DataCoupler/DatabaseMethod.cs b/Data_Coupler/Extensions/DataCoupler/DatabaseMethod.cs index ff77da6..92d8efb 100644 --- a/Data_Coupler/Extensions/DataCoupler/DatabaseMethod.cs +++ b/Data_Coupler/Extensions/DataCoupler/DatabaseMethod.cs @@ -67,6 +67,19 @@ public partial class DataCoupler : ComponentBase // ===== METODI DATABASE ===== + /// + /// Verifica se la credenziale database selezionata è di tipo ODBC + /// + /// True se la credenziale è ODBC, altrimenti False + protected bool IsOdbcConnection() + { + if (string.IsNullOrEmpty(selectedDatabaseCredential)) + return false; + + var credential = databaseCredentials.FirstOrDefault(c => c.Name == selectedDatabaseCredential); + return credential?.DatabaseType == DatabaseType.Odbc; + } + /// /// Gestisce il cambio di credenziale database selezionata /// @@ -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; + } } /// @@ -571,14 +590,15 @@ public partial class DataCoupler : ComponentBase /// 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(); } } diff --git a/Data_Coupler/Pages/DataCoupler.razor b/Data_Coupler/Pages/DataCoupler.razor index 1d4633d..aeb5630 100644 --- a/Data_Coupler/Pages/DataCoupler.razor +++ b/Data_Coupler/Pages/DataCoupler.razor @@ -70,19 +70,32 @@ @if (!string.IsNullOrEmpty(selectedDatabaseCredential)) { -
- + @if (isDatabaseConnected) { - + Connesso } - Connetti e Scopri Schema - - @if (isDatabaseConnected) - { - Connesso - } -
+ + } } @if (!string.IsNullOrEmpty(databaseErrorMessage)) { } - - @if (isDatabaseConnected) + + @if (IsOdbcConnection()) + { + +
+
Query SQL Custom:
+ +
+ + +
+ +
+
+ +
+ + + @if (isQueryValid) + { + + + @if (showQueryPreview) + { + + } + } +
+ + @if (!string.IsNullOrEmpty(queryValidationMessage)) + { + @if (isQueryValid) + { + + } + else + { + + } + } + + + @if (showQueryPreview && queryPreviewData.Any()) + { +
+
+
+ Anteprima Risultati Query + @queryPreviewData.Count righe +
+
+
+
+ + + + @if (queryColumns.Any()) + { + @foreach (var col in queryColumns) + { + + } + } + + + + @foreach (var row in queryPreviewData) + { + + @foreach (var col in queryColumns) + { + + } + + } + +
@col
@row.GetValueOrDefault(col)?.ToString()
+
+
+
+ } +
+ } + + + @if (isDatabaseConnected && !IsOdbcConnection()) {