2012-08-12 24 views
5

Tôi nhận được mã lỗi trên khi cố gắng để làm một SqlBulkInsert của "thành phố" sau DataTable:SqlBulkCopy Giá trị nhất định của loại DateTime từ nguồn dữ liệu không thể được chuyển đổi sang loại int của cột mục tiêu quy định

DataTable cityTable = new DataTable(City.TABLE_NAME); 
cityTable.Columns.Add("id", typeof(int)); 
cityTable.Columns.Add("name", typeof(string)); 
cityTable.Columns.Add("ascii_name", typeof(string)); 
cityTable.Columns.Add("alternate_names", typeof(string)); 
cityTable.Columns.Add("latitude", typeof(double)); 
cityTable.Columns.Add("longitude", typeof(double)); 
cityTable.Columns.Add("feature_class", typeof(char)); 
cityTable.Columns.Add("feature_code", typeof(string)); 
cityTable.Columns.Add("country_code", typeof(string)); 
cityTable.Columns.Add("country_code2", typeof(string)); 
cityTable.Columns.Add("population", typeof(long)); 
cityTable.Columns.Add("elevation", typeof(int)); 
cityTable.Columns.Add("modification_date", typeof(DateTime)); 
cityTable.Columns.Add("admin1code", typeof(string)); 
cityTable.Columns.Add("admin2code", typeof(string)); 
cityTable.Columns.Add("admin3code", typeof(string)); 
cityTable.Columns.Add("admin4code", typeof(string)); 
cityTable.Columns.Add("gtopo30", typeof(int)); 
cityTable.Columns.Add("timezone_name", typeof(string)); 
cityTable.Columns.Add("version", typeof(Binary)); 

sau đây là đoạn code mà thêm từng đối tượng vào DataTable:

object id = EvaluateNullity(parsedCity.Id); 
object name = EvaluateNullity(parsedCity.Name); 
object asciiName = EvaluateNullity(parsedCity.AsciiName); 
object alternateNames = EvaluateNullity(parsedCity.AlternateNames); 
object latitude = EvaluateNullity(parsedCity.Latitude); 
object longitude = EvaluateNullity(parsedCity.Longitude); 
object featureClass = EvaluateNullity(parsedCity.FeatureClass); 
object featureCode = EvaluateNullity(parsedCity.FeatureCode); 
object countryCode = EvaluateNullity(parsedCity.CountryCode); 
object countryCode2 = EvaluateNullity(parsedCity.CountryCode2); 
object population = EvaluateNullity(parsedCity.Population); 
object elevation = EvaluateNullity(parsedCity.Elevation); 
object modificationDate = EvaluateNullity(parsedCity.ModificationDate); 
object admin1Code = EvaluateNullity(parsedCity.Admin1Code); 
object admin2Code = EvaluateNullity(parsedCity.Admin2Code); 
object admin3Code = EvaluateNullity(parsedCity.Admin3Code); 
object admin4Code = EvaluateNullity(parsedCity.Admin4Code); 
object gtopo30 = EvaluateNullity(parsedCity.Gtopo30); 
object timeZoneName = EvaluateNullity(parsedCity.TimeZoneName); 
object version = EvaluateNullity(parsedCity.Version); 

cityRow["id"] = id; 
cityRow["name"] = name; 
cityRow["ascii_name"] = asciiName; 
cityRow["alternate_names"] = alternateNames; 
cityRow["latitude"] = latitude; 
cityRow["longitude"] = longitude; 
cityRow["feature_class"] = featureClass; 
cityRow["feature_code"] = featureCode; 
cityRow["country_code"] = countryCode; 
cityRow["country_code2"] = countryCode2; 
cityRow["population"] = population; 
cityRow["elevation"] = elevation; 
cityRow["modification_date"] = modificationDate; 
cityRow["admin1code"] = admin1Code; 
cityRow["admin2code"] = admin2Code; 
cityRow["admin3code"] = admin3Code; 
cityRow["admin4code"] = admin4Code; 
cityRow["gtopo30"] = gtopo30; 
cityRow["timezone_name"] = timeZoneName; 
cityRow["version"] = version; 

Và mã cho EvaluateNullity:

public object EvaluateNullity(object entity) 
    { 
     return entity ?? DBNull.Value; 
    } 

Sự hiểu biết của tôi từ thông báo lỗi này là giá trị ngày giờ được đặt trong một trong các cột int bên trên. Tuy nhiên, một sửa lỗi có điều kiện nhanh chóng sau đó, và kiểm tra trong cửa sổ ngay lập tức tiết lộ rằng không có cột int nào có kiểu DateTime được đặt trong chúng. http://desmond.imageshack.us/Himg42/scaled.php?server=42&filename=mod1rm.jpg&res=landing http://desmond.imageshack.us/Himg37/scaled.php?server=37&filename=modyf.jpg&res=landing

Tôi thực sự bối rối.

+9

Kiểm tra kỹ xem thứ tự của các cột được xác định trong cityTable có khớp với thứ tự các cột trong bảng cơ sở dữ liệu hay không. –

+0

Cảm ơn bạn David Andres !!!!!!!! Đã dành cả ngày hôm qua để cố gắng gỡ lỗi vấn đề này, tôi KHÔNG có ý tưởng rằng thứ tự bạn đã xác định các cột thực sự ảnh hưởng đến điều này! Tôi muốn đánh dấu giải pháp của bạn là câu trả lời nhưng có vẻ như bạn đã viết nó làm nhận xét thay vì trả lời ... –

+3

Điều đó có hơi ngớ ngẩn không? Khuôn khổ cần phải quan tâm đến điều đó. – Filip

Trả lời

19

Từ David Andres:

đúp kiểm tra rằng thứ tự của các cột được định nghĩa trong cityTable phù hợp với thứ tự của cột trong bảng cơ sở dữ liệu riêng của mình.

+1

Tôi đã giải thích điều này nhiều hơn một chút [ở đây] (http://stackoverflow.com/questions/16892702/the-given-value-of-type-string-from-the-data-source-cannot-be-converted- đến loại/20542022 # 20542022). Trong thực tế, nó không chỉ là thứ tự, mà chỉ số của các cột đích sẽ được ánh xạ tới các cột của bảng nguồn. Bạn có thể làm điều đó với SqlBulkCopyColumnMapping. – Sabo

+0

@David Andres Tôi cũng có cùng một vấn đề với datatype DateTime, nhưng đáng ngạc nhiên khi tôi tải lên tập tin excel, lần đầu tiên nó dừng lại ở lỗi này, nhưng lần sau khi tôi tải lên cùng một tệp excel, nó được tải lên thành công mà không có bất kỳ lỗi nào. Tôi không biết tại sao điều này lại xảy ra. Xin đề nghị – RSB

4

Một nguyên nhân không rõ ràng của lỗi này là bạn phải có thuộc tính đại diện cho cột nhận dạng, mặc dù bạn không thể đặt chúng.

Các vấn đề liên quan