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 (isConnectingDatabase)
+
+ @if (IsOdbcConnection())
+ {
+
+ Connessione ODBC rilevata
+ Per le connessioni ODBC, il discovery automatico delle tabelle non è disponibile.
+ Procedi direttamente con l'inserimento di una query SQL custom nella sezione sottostante.
+
+ }
+ else
+ {
+
+
+
+ @if (isConnectingDatabase)
+ {
+
+ }
+ Connetti e Scopri Schema
+
+ @if (isDatabaseConnected)
{
-
+ Connesso
}
- Connetti e Scopri Schema
-
- @if (isDatabaseConnected)
- {
- Connesso
- }
-
+
+ }
} @if (!string.IsNullOrEmpty(databaseErrorMessage))
{
@@ -90,8 +103,126 @@
}
-
- @if (isDatabaseConnected)
+
+ @if (IsOdbcConnection())
+ {
+
+
+
Query SQL Custom:
+
+
+
Scrivi la tua query SELECT:
+
+
+
+
+
+ Controlli di Sicurezza Attivi:
+
+ • Solo query SELECT sono permesse
+ • Operazioni come INSERT, UPDATE, DELETE, DROP sono bloccate
+ • Query multiple separate da ; non sono consentite
+ • La query verrà automaticamente ottimizzata per il trasferimento dati
+
+
+
+
+
+
+
+
+ @if (isValidatingQuery)
+ {
+
+ }
+ Valida Query
+
+
+ @if (isQueryValid)
+ {
+
+ @if (isLoadingPreview)
+ {
+
+ }
+ Anteprima Risultati
+
+
+ @if (showQueryPreview)
+ {
+
+ Nascondi Anteprima
+
+ }
+ }
+
+
+ @if (!string.IsNullOrEmpty(queryValidationMessage))
+ {
+ @if (isQueryValid)
+ {
+
+
+ @queryValidationMessage
+
+ }
+ else
+ {
+
+
+ @queryValidationMessage
+
+ }
+ }
+
+
+ @if (showQueryPreview && queryPreviewData.Any())
+ {
+
+
+
+
+
+
+
+ @if (queryColumns.Any())
+ {
+ @foreach (var col in queryColumns)
+ {
+ @col
+ }
+ }
+
+
+
+ @foreach (var row in queryPreviewData)
+ {
+
+ @foreach (var col in queryColumns)
+ {
+ @row.GetValueOrDefault(col)?.ToString()
+ }
+
+ }
+
+
+
+
+
+ }
+
+ }
+
+
+ @if (isDatabaseConnected && !IsOdbcConnection())
{