C# массовая копия для SQL Server

Надеюсь, кто-то может помочь мне понять, что я здесь не так. Я подтвердил, что данные находятся в базе данных, и что соединение с SQL Server работает. Но я не могу выдвинуть данные во временную таблицу (или, по крайней мере, не вижу их, как только у меня есть).

Я просматривал различные посты об использовании функции массового копирования, но я должен что-то упустить, так как это, похоже, не работает.

Сценарий выполняется без ошибок, но я не вижу временную таблицу в БД после выполнения сценария.

Любая помощь в разработке, где я ошибся, очень ценится.

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");
         }
     }
}

2 ответа

Я сталкивался с подобной проблемой во время программирования WPF... Вам необходимо создать отображение между столбцами исходного источника данных и столбцами таблицы назначения. Я не знаю точно, почему это нужно сделать после упоминания имени таблицы назначения, которого должно быть достаточно... однако следующий код работал для меня...

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();

 }

Надеюсь это поможет...:)

Если вы закроете соединение, то никогда не найдете таблицы Has (#) в базе данных. Если вы хотите, чтобы ваши данные были на сервере sql, вам нужно открыть соединение и не закрывать его, пока вы используете ## temptable. После того, как вы закончите работу с ## temptable, закройте соединение. ## tepmtable автоматически удаляется из базы данных.

Спасибо,

Другие вопросы по тегам