BColumnBind - Esempi
Mapping tra colonne
using B.BData;
BColumnBind[] bindings = new BColumnBind[]
{
new BColumnBind("ExternalCode", "Codice"),
new BColumnBind("ExternalDescription", "Descrizione"),
new BColumnBind("IsEnabled", "Attivo")
};
ColumnSource identifica la colonna della DataTable sorgente; ColumnDestination identifica la colonna della tabella database destinazione.
Utilizzo con InsertDT
using B.BData;
using System.Data;
using System.Linq;
DataTable source = new DataTable();
source.Columns.Add("ExternalCode", typeof(string));
source.Columns.Add("ExternalDescription", typeof(string));
source.Columns.Add("IsEnabled", typeof(bool));
source.Rows.Add("SYS", "Sistema", true);
using BConnection connection = new BConnection(GetDatabaseSetting());
bool inserted = connection.InsertDT(
source,
"sysSistemiImport",
bindings);
if (!inserted)
{
Exception? error = connection.ExceptionList.LastOrDefault();
throw new InvalidOperationException("Importazione massiva non riuscita.", error);
}
InsertDTmodifica il database e deve essere eseguito soltanto con una connessione e una tabella destinazione controllate.
InsertDT usa SqlBulkCopy ed è quindi destinato a SQL Server. Copia soltanto le righe della DataTable che hanno stato DataRowState.Added. Se la tabella proviene da una lettura o è stato chiamato AcceptChanges, impostare intenzionalmente lo stato delle righe da importare prima dell'operazione.
Conservazione dei valori identity
connection.InsertDTTimeout = 120;
bool inserted = connection.InsertDT(
source,
"sysSistemiImport",
DisabledIdentityInsert: true,
bindings);
Nonostante il nome del parametro, DisabledIdentityInsert: true attiva internamente SqlBulkCopyOptions.KeepIdentity: i valori identity presenti nella sorgente vengono conservati nella tabella destinazione. Usare questo overload soltanto quando il trasferimento deve mantenere esplicitamente le chiavi originali.
InsertDTTimeout, espresso in secondi, viene applicato al BulkCopyTimeout; il valore predefinito è 30.
Inserimento nella transazione della connessione
using BConnection connection = new BConnection(GetDatabaseSetting());
connection.ApriDatabase();
connection.BeginTrans();
try
{
bool inserted = connection.InsertDT(
source,
"sysSistemiImport",
connection.Transaction!,
bindings);
if (!inserted)
{
Exception? error = connection.ExceptionList.LastOrDefault();
throw new InvalidOperationException("Importazione massiva non riuscita.", error);
}
connection.CommitTrans();
}
catch
{
connection.RollBackTrans();
throw;
}
finally
{
connection.EndTrans();
connection.ChiudiDatabase();
}
L'overload transazionale richiede concretamente una connessione SQL Server aperta e una SqlTransaction associata alla stessa connessione. La proprietà BConnection.Transaction soddisfa questo requisito dopo BeginTrans() quando il provider configurato è SQL_OLEDB_PROVIDER.
