C # bulkcopy su SQL Server

c# sql sqlbulkcopy sql-server

Domanda

Sperando che qualcuno possa aiutarmi a capire cosa ho sbagliato qui. Ho confermato che i dati sono nel datatable e che la connessione di SQL Server funziona. Ma non riesco a spingere i dati nella tabella temporanea (o almeno non riesco a vederlo una volta).

Ho esaminato vari post sull'utilizzo della funzione bulkcopy, ma mi manca qualcosa in quanto non sembra funzionare.

Lo script viene eseguito senza errori, ma non riesco a vedere la tabella temporanea nel DB dopo l'esecuzione dello script.

È molto apprezzato qualsiasi aiuto nell'elaborare dove sono andato male.

DataTable dt = new DataTable("Employees");
dt.Columns.Add("Name");
dt.Columns.Add("LastName");

foreach (var employee in context.Employees.AsEnumerable())
{
    dt.Rows.Add(employee.Name, employee.LastName);
}

Console.WriteLine(dt.Rows[0]["Name"]);

Console.WriteLine("Loading data into SQL");

using (SqlConnection conn = new SqlConnection("user id=<ID>;" +
                                              "password=<Password>;server=<Server>;" +
                                              "Trusted_Connection=yes;" +
                                              "database=<DB>; " +
                                              "connection timeout=30"))
{
    using (SqlCommand command = new SqlCommand("", conn))
    {
        try
        {
             conn.Open();

             // Creating temp table on database
             command.CommandText = "CREATE TABLE ##TmpTable(...)";
             command.ExecuteNonQuery();

             // Bulk insert into temp table
             using (SqlBulkCopy bulkcopy = new SqlBulkCopy(conn))
             {
                 bulkcopy.BulkCopyTimeout = 660;
                 bulkcopy.DestinationTableName = "##TmpTable";
                 bulkcopy.WriteToServer(dt);
                 bulkcopy.Close();
             }
         }
         catch (Exception ex)
         {
             Console.WriteLine("Bulk load to SQL failed");// Handle exception properly
         }
         finally
         {
             conn.Close();
             Console.WriteLine("table loaded into SQL");
         }
     }
}

Risposta popolare

Ho affrontato il problema simile durante la programmazione WPF ... È necessario creare un mapping tra le colonne del datatable e le colonne della tabella di destinazione. Non so esattamente perché debba essere fatto dopo aver menzionato il nome della tabella della destinazione che dovrebbe essere sufficiente ... tuttavia il codice seguente ha funzionato per me ...

using (var command = new SqlCommand("SELECT COUNT(*) FROM Device_GameDevice", sqlConn, transaction) { CommandType = CommandType.Text })
                                {
 SqlBulkCopyColumnMapping mapstep = new SqlBulkCopyColumnMapping("Message", "Message");
  SqlBulkCopyColumnMapping maptran = new SqlBulkCopyColumnMapping("DeviceName", "DeviceName");
 SqlBulkCopyColumnMapping mapstt = new SqlBulkCopyColumnMapping("dt_datetime", "dt_datetime");
 SqlBulkCopyColumnMapping mapfunc = new SqlBulkCopyColumnMapping("GameName", "GameName");

 sqlBulk.ColumnMappings.Add(mapstep);
 sqlBulk.ColumnMappings.Add(maptran);
 sqlBulk.ColumnMappings.Add(mapstt);
 sqlBulk.ColumnMappings.Add(mapfunc);

 sqlBulk.DestinationTableName ="Device_GameDevice";

sqlBulk.WriteToServer(resultantDataTableForMaxDate);
command.ExecuteNonQuery();

transaction.Commit();

 }

Spero che questo ti aiuti...:)



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