Я пытаюсь прочитать значения из xml-файла, а затем использовать объемную копию для вставки данных в мою базу данных.
Я использую пользовательский класс, который:
class Customer
{
public int CustomerID { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
public int ShowsNumber { get; set; }
public int VisitNumber { get; set; }
public int Cancellation { get; set; }
}
и я прочитал следующие данные:
List<Customer> customersList =
(
from e in XDocument.Load(file).Root.Elements("cust")
select new Customer
{
CustomerID = (int)e.Attribute("custid"),
FirstName = (string)e.Attribute("fname"),
LastName = (string)e.Attribute("lname"),
ShowsNumber = (int)e.Attribute("count_noshow"),
VisitNumber = (int)e.Attribute("count_resos"),
Cancellation = (int)e.Attribute("count_cancel"),
}).ToList();
Затем я ввожу , что customersList
к datatabe , как это:
DataTable dataTable = getBasicDataTable();
for (int i = 0; i < customersList.Count; i++)
{
DataRow datarows = dataTable.NewRow();
datarows[0] = customersList[i].CustomerID;
datarows[1] = customersList[i].FirstName;
datarows[2] = customersList[i].LastName;
datarows[3] = customersList[i].ShowsNumber;
datarows[4] = customersList[i].VisitNumber;
datarows[5] = customersList[i].Cancellation;
dataTable.Rows.Add(datarows);
}
то я вставляю данные в свою базу данных следующим образом:
но я получил это исключение
using (SqlBulkCopy sbc = new SqlBulkCopy(GetConnectionString()))
{
sbc.DestinationTableName = XMLReader.databaseTable;
sbc.WriteToServer(dataTable);
}
Данное значение типа String из источника данных не может быть преобразовано в тип int указанного целевого столбца.
как вы видите, когда я извлекаю данные из моего xml, я уже использую cast to int
и string
и он работает. так почему при вставке в базу данных я получил это исключение?
Чтобы дать вам весь код, это getBasicDataTable
fuction
private DataTable getBasicDataTable()
{
DataTable dataTable = new DataTable();
dataTable.Clear();
dataTable.Columns.Add("customerID");
dataTable.Columns.Add("firstName");
dataTable.Columns.Add("lastName");
dataTable.Columns.Add("showsNumber");
dataTable.Columns.Add("visitNumber");
dataTable.Columns.Add("cancellation");
return dataTable;
}
Вы должны указать столбец как целое, определяя datatable
. Как это:-
dataTable.Columns.Add("customerID", typeof(int));
Редактировать:
Другая причина, по которой я подозреваю, вероятно, связана с тем, как вы привязываете свой datatable (я имею в виду порядок столбцов), не совпадает с таблицей базы данных. Причина в том, что я считаю, что отображение по умолчанию - это не имя для имени, а его индекс для индекса в SqlBulkCopy
. Так что не забудьте проверить свой порядок в таблице базы данных, он должен выглядеть так:
CustomerID (INT)
FirstName (VARCHAR\NVARCHAR)
LastName (VARCHAR\NVARCHAR)
ShowsNumber (INT)
VisitNumber (INT)
Cancellation (INT)
Насколько мне известно, вам нужно установить тип столбца в datatable, иначе он будет предполагать строку (потому что почти все может быть преобразовано как таковое).
Прежде чем устанавливать значения, попробуйте:
dataTable.Columns[2].Type = typeof (int);
или, альтернативно, вы можете указать его при определении столбцов:
dataTable.Columns.Add("ShowsNumber", typeof(int));