У меня есть DataSet
заполненный из листа Excel. Я хотел использовать SQLBulk Copy для вставки записей в Lead_Hdr
таблице , где LeadId
является PK.
При выполнении кода ниже возникает ошибка:
Данная ColumnMapping не соответствует ни одному столбцу в источнике или назначении
string ConStr=ConfigurationManager.ConnectionStrings["ConStr"].ToString();
using (SqlBulkCopy s = new SqlBulkCopy(ConStr,SqlBulkCopyOptions.KeepIdentity))
{
if (MySql.State==ConnectionState.Closed)
{
MySql.Open();
}
s.DestinationTableName = "PCRM_Lead_Hdr";
s.NotifyAfter = 10000;
#region Comment
s.ColumnMappings.Clear();
#region ColumnMapping
s.ColumnMappings.Add("ClientID", "ClientID");
s.ColumnMappings.Add("LeadID", "LeadID");
s.ColumnMappings.Add("Company_Name", "Company_Name");
s.ColumnMappings.Add("Website", "Website");
s.ColumnMappings.Add("EmployeeCount", "EmployeeCount");
s.ColumnMappings.Add("Revenue", "Revenue");
s.ColumnMappings.Add("Address", "Address");
s.ColumnMappings.Add("City", "City");
s.ColumnMappings.Add("State", "State");
s.ColumnMappings.Add("ZipCode", "ZipCode");
s.ColumnMappings.Add("CountryId", "CountryId");
s.ColumnMappings.Add("Phone", "Phone");
s.ColumnMappings.Add("Fax", "Fax");
s.ColumnMappings.Add("TimeZone", "TimeZone");
s.ColumnMappings.Add("SicNo", "SicNo");
s.ColumnMappings.Add("SicDesc", "SicDesc");
s.ColumnMappings.Add("SourceID", "SourceID");
s.ColumnMappings.Add("ResearchAnalysis", "ResearchAnalysis");
s.ColumnMappings.Add("BasketID", "BasketID");
s.ColumnMappings.Add("PipeLineStatusId", "PipeLineStatusId");
s.ColumnMappings.Add("SurveyId", "SurveyId");
s.ColumnMappings.Add("NextCallDate", "NextCallDate");
s.ColumnMappings.Add("CurrentRecStatus", "CurrentRecStatus");
s.ColumnMappings.Add("AssignedUserId", "AssignedUserId");
s.ColumnMappings.Add("AssignedDate", "AssignedDate");
s.ColumnMappings.Add("ToValueAmt", "ToValueAmt");
s.ColumnMappings.Add("Remove", "Remove");
s.ColumnMappings.Add("Release", "Release");
s.ColumnMappings.Add("Insert_Date", "Insert_Date");
s.ColumnMappings.Add("Insert_By", "Insert_By");
s.ColumnMappings.Add("Updated_Date", "Updated_Date");
s.ColumnMappings.Add("Updated_By", "Updated_By");
#endregion
#endregion
s.WriteToServer(sourceTable);
s.Close();
MySql.Close();
}
Ну, правильно? Существуют ли названия столбцов с обеих сторон?
Честно говоря, я никогда не беспокоился о сопоставлениях. Мне нравится держать вещи простыми - я имею тенденцию иметь промежуточную таблицу, которая выглядит как вход на сервере, затем I SqlBulkCopy
в промежуточную таблицу и, наконец, запускает хранимую процедуру для перемещения таблицы из промежуточной таблицы в фактическую таблицу; преимущества:
В качестве последней мысли - если вы имеете дело с объемными данными, вы можете получить более высокую пропускную способность с помощью IDataReader
(поскольку это потоковый API, где - как DataTable
- это буферный API). Например, я склонен привязывать импорт CSV с использованием CsvReader в качестве источника для SqlBulkCopy. Кроме того, я написал прокладки вокруг XmlReader
чтобы представить каждый элемент первого уровня в виде строки в IDataReader
- очень быстро.
Я столкнулся с такой же проблемой при копировании данных из доступа к SQLSERVER 2005, и обнаружил, что сопоставления столбцов чувствительны к регистру в обоих источниках данных независимо от чувствительности баз данных.