[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
+144 -13
View File
@@ -70,19 +70,32 @@
@if (!string.IsNullOrEmpty(selectedDatabaseCredential))
{
<div class="mb-3">
<button class="btn btn-success btn-sm" @onclick="ConnectToDatabase" disabled="@isConnectingDatabase">
@if (isConnectingDatabase)
<!-- Per ODBC: mostra messaggio esplicativo, niente discovery -->
@if (IsOdbcConnection())
{
<div class="alert alert-info" role="alert">
<i class="oi oi-info"></i> <strong>Connessione ODBC rilevata</strong><br>
Per le connessioni ODBC, il discovery automatico delle tabelle non è disponibile.<br>
Procedi direttamente con l'inserimento di una <strong>query SQL custom</strong> nella sezione sottostante.
</div>
}
else
{
<!-- Per database standard: mostra pulsante di connessione -->
<div class="mb-3">
<button class="btn btn-success btn-sm" @onclick="ConnectToDatabase" disabled="@isConnectingDatabase">
@if (isConnectingDatabase)
{
<span class="spinner-border spinner-border-sm me-2"></span>
}
<i class="fas fa-plug"></i> Connetti e Scopri Schema
</button>
@if (isDatabaseConnected)
{
<span class="spinner-border spinner-border-sm me-2"></span>
<span class="badge bg-success ms-2">Connesso</span>
}
<i class="fas fa-plug"></i> Connetti e Scopri Schema
</button>
@if (isDatabaseConnected)
{
<span class="badge bg-success ms-2">Connesso</span>
}
</div>
</div>
}
} @if (!string.IsNullOrEmpty(databaseErrorMessage))
{
<div class="alert alert-danger" role="alert">
@@ -90,8 +103,126 @@
</div>
}
<!-- Lista Tabelle -->
@if (isDatabaseConnected)
<!-- Per ODBC: mostra direttamente la sezione Query Custom -->
@if (IsOdbcConnection())
{
<!-- Sezione Query Custom per ODBC -->
<div class="mb-3">
<h6>Query SQL Custom:</h6>
<div class="mb-2">
<label class="form-label">Scrivi la tua query SELECT:</label>
<textarea class="form-control" rows="6" placeholder="SELECT * FROM your_table WHERE condition..."
@bind="customQuery" @bind:event="oninput"></textarea>
<div class="mt-2">
<div class="alert alert-warning d-flex align-items-start" role="alert">
<i class="fas fa-shield-alt me-2 mt-1"></i>
<div>
<strong>Controlli di Sicurezza Attivi:</strong><br>
<small>
• Solo query <strong>SELECT</strong> sono permesse<br>
• Operazioni come INSERT, UPDATE, DELETE, DROP sono bloccate<br>
• Query multiple separate da ; non sono consentite<br>
• La query verrà automaticamente ottimizzata per il trasferimento dati
</small>
</div>
</div>
</div>
</div>
<div class="mb-2">
<button class="btn btn-primary btn-sm me-2" @onclick="ValidateCustomQuery"
disabled="@(isValidatingQuery || string.IsNullOrWhiteSpace(customQuery))">
@if (isValidatingQuery)
{
<span class="spinner-border spinner-border-sm me-2"></span>
}
<i class="fas fa-check-circle"></i> Valida Query
</button>
@if (isQueryValid)
{
<button class="btn btn-info btn-sm me-2" @onclick="LoadQueryPreview"
disabled="@isLoadingPreview">
@if (isLoadingPreview)
{
<span class="spinner-border spinner-border-sm me-2"></span>
}
<i class="fas fa-eye"></i> Anteprima Risultati
</button>
@if (showQueryPreview)
{
<button class="btn btn-outline-secondary btn-sm" @onclick="HideQueryPreview">
<i class="fas fa-eye-slash"></i> Nascondi Anteprima
</button>
}
}
</div>
@if (!string.IsNullOrEmpty(queryValidationMessage))
{
@if (isQueryValid)
{
<div class="alert alert-success" role="alert">
<i class="fas fa-check-circle"></i>
@queryValidationMessage
</div>
}
else
{
<div class="alert alert-danger" role="alert">
<i class="fas fa-exclamation-triangle"></i>
@queryValidationMessage
</div>
}
}
<!-- Anteprima risultati query -->
@if (showQueryPreview && queryPreviewData.Any())
{
<div class="card mt-3">
<div class="card-header">
<h6 class="mb-0">
<i class="fas fa-table"></i> Anteprima Risultati Query
<span class="badge bg-info ms-2">@queryPreviewData.Count righe</span>
</h6>
</div>
<div class="card-body p-0">
<div class="table-responsive" style="max-height: 400px;">
<table class="table table-striped table-hover mb-0">
<thead class="table-dark sticky-top">
<tr>
@if (queryColumns.Any())
{
@foreach (var col in queryColumns)
{
<th>@col</th>
}
}
</tr>
</thead>
<tbody>
@foreach (var row in queryPreviewData)
{
<tr>
@foreach (var col in queryColumns)
{
<td>@row.GetValueOrDefault(col)?.ToString()</td>
}
</tr>
}
</tbody>
</table>
</div>
</div>
</div>
}
</div>
}
<!-- Lista Tabelle (solo per database NON ODBC) -->
@if (isDatabaseConnected && !IsOdbcConnection())
{
<!-- Selezione modalità: Tabelle o Query Custom -->
<div class="mb-3">