SqlBulkCopy ha esito negativo sulle colonne con spazi al loro interno

c# columnmappings datatable sqlbulkcopy sql-server

Domanda

So che ho bisogno di avvolgere qualsiasi nome di colonna con spazi tra parentesi quadre [] . Lo faccio quando DataTable colonne DataTable .

for (int i = 0; i < columns.Count; i++)
{
   string colname = columns[i].ToString();

   if (colname.Contains(" "))
   {
      colname = "[" + colname + "]";
   }

   dt.Columns.Add(colname);
}

Quindi, dopo aver aggiunto tutti i dati come righe nel mio DataTable , chiamo una funzione di inserimento, che utilizza il codice seguente per mappare le colonne. I nomi delle colonne sono identici sia nel DataTable sia nella tabella del database.

using (var connection = new SqlConnection(ConnectionString))
{
    SqlTransaction transaction = null;
    connection.Open();

    try
    {
        transaction = connection.BeginTransaction();

        using (var sqlBulkCopy = new SqlBulkCopy(connection, SqlBulkCopyOptions.TableLock, transaction))
        {
            sqlBulkCopy.DestinationTableName = "DBTableName";

            foreach (DataColumn col in dataTable.Columns)
            {
                sqlBulkCopy.ColumnMappings.Add(col.ColumnName, col.ColumnName);
            }

            sqlBulkCopy.WriteToServer(dataTable);
        }

        transaction.Commit();
    }
    catch (Exception)
    {
        transaction.Rollback();
    }
}

Se si imposta un punto di interruzione quando si esegue il ColumnMapping , col.ColumName contiene correttamente le parentesi quadre attorno ai nomi con spazi al loro interno.

Tuttavia, quando tenta di chiamare il metodo WriteToServer , fallisce e l'eccezione dice

Il Nome colonna con nome "Spazio con spazio" non corrisponde a nessuna colonna nell'origine dati.

Perché / dove si estrapolano le parentesi quadre e come posso risolvere questo problema?

Risposta accettata

Non sono sicuro se questo abbia a che fare con la versione del server .net o sql che sto colpendo, ma ho sbagliato e non ho bisogno di aggiungere le parentesi quadre attorno ai nomi delle mie colonne. Gestisce comunque correttamente gli spazi in loro.


Risposta popolare

Se si desidera inserire tutte le colonne, non è necessario disporre di mapping. Puoi rimuovere questo:

    foreach (DataColumn col in dataTable.Columns)
    {
            sqlBulkCopy.ColumnMappings.Add(col.ColumnName, col.ColumnName);
    }


Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow