I am trying to read values from xml file and then use the bulkcopy to insert the data into my database.
I am using a custom class which is:
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; }
}
and I read the data like this:
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();
Then I insert that customersList
to a datatabe like this:
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);
}
then I insert the data to my database like this:
but I got this exception
using (SqlBulkCopy sbc = new SqlBulkCopy(GetConnectionString()))
{
sbc.DestinationTableName = XMLReader.databaseTable;
sbc.WriteToServer(dataTable);
}
The given value of type String from the data source cannot be converted to type int of the specified target column.
as you see, when I extract the data from my xml, I already use the cast to int
and to string
and it is working. so why when inserting to the database I got that exception?
In order to give you the whole code, this is the 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;
}
You need to specify the column as integer while defining the datatable
. Like this:-
dataTable.Columns.Add("customerID", typeof(int));
Edit:
The other reason i suspect is probably the way you are binding your datatable (I mean the order of columns) doesn't match with that of database table. Reason being I think default mapping is not Name to Name rather its Index to Index in SqlBulkCopy
. So Kindly re-check your database table order, It should look like:-
CustomerID (INT)
FirstName (VARCHAR\NVARCHAR)
LastName (VARCHAR\NVARCHAR)
ShowsNumber (INT)
VisitNumber (INT)
Cancellation (INT)