BulkCopy WriteToServer() вставляет в неправильный столбец

Я пытаюсь записать DataTable в свою целевую таблицу на сервере Sql. DataTable dt содержит только один столбец и называется Email. Моя таблица назначения содержит tpid, lastname, age, date и email. Это код, который я использую для массового копирования:

using (SqlConnection sqlConn = new SqlConnection(sqlCs))
{
    sqlConn.Open();
    using (SqlBulkCopy bulkCopy = new SqlBulkCopy(sqlConn.ConnectionString, SqlBulkCopyOptions.KeepIdentity | SqlBulkCopyOptions.UseInternalTransaction))
    {
        bulkCopy.DestinationTableName = destinationTableName;
        bulkCopy.WriteToServer(dt);
    }
}

Что я вижу, так это то, что в моей таблице назначения я получаю значение электронной почты из моего DataTable, вставляемого в столбец tpid вместо email. Я не использую здесь сопоставление столбцов, но не должно ли массовое копирование автоматически сопоставлять электронную почту с электронной почтой?


person disasterkid    schedule 23.01.2015    source источник


Ответы (2)


Подумайте о том, чтобы попробовать это сопоставление:

SqlBulkCopyColumnMapping mapMAIL = new SqlBulkCopyColumnMapping("Email", "email");
bulkCopy.ColumnMappings.Add(mapMAIL);

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

person João Miguel Brandão    schedule 23.01.2015
comment
но имена столбцов каждый раз меняются. Это был просто пример проблемы. - person disasterkid; 23.01.2015
comment
@Pedram, поведение SqlBulkCopy по умолчанию — сопоставление по порядковому номеру. Вам нужно будет использовать SqlBulkCopyMappings, если вы хотите сопоставить по имени. - person Dan Guzman; 23.01.2015
comment
Может быть, вы можете сделать запрос типа SHOW COLUMNS FROM _tablename_ как к исходной, так и к целевой таблицам, а затем автоматически сгенерировать сопоставления без учета регистра? Что-то еще, что вы могли бы попробовать (чего я не знаю, есть ли у вас), это посмотреть, автоматически ли он сопоставляет электронную почту с электронной почтой (с учетом регистра). - person João Miguel Brandão; 23.01.2015

нет не совпадет. вы должны добавить сопоставления:

 myBulkCopy.ColumnMappings.Add(new SqlBulkCopyColumnMapping("Email", "email"));

или источник и место назначения имеют одни и те же столбцы в одном и том же порядке. если вам нужно больше гибкости, я бы порекомендовал реализовать IDataReader и передать его методу WriteToServer.

person busytools    schedule 23.01.2015