【问题标题】:The given value of type String from the data source cannot be converted to type int of the specified target column来自数据源的 String 类型的给定值无法转换为指定目标列的 int 类型
【发布时间】:2015-01-19 11:18:33
【问题描述】:

我正在尝试从 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 插入到这样的数据表中:

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 中提取数据时,我已经使用了 int 和 string 的转换,并且它正在工作。那么为什么在插入数据库时​​出现异常?

注意

为了给你完整的代码,这是getBasicDataTable函数

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;
        }

【问题讨论】:

    标签: c# linq linq-to-xml sqlbulkcopy


    【解决方案1】:

    您需要在定义datatable 时将列指定为整数。像这样:-

    dataTable.Columns.Add("customerID", typeof(int));
    

    编辑:
    我怀疑的另一个原因可能是您绑定数据表的方式(我的意思是列的顺序)与数据库表的不匹配。原因是我认为默认映射不是名称到名称,而是SqlBulkCopy 中的索引到索引。所以请重新检查您的数据库表顺序,它应该如下所示:-

    CustomerID (INT)
    FirstName (VARCHAR\NVARCHAR)
    LastName (VARCHAR\NVARCHAR)
    ShowsNumber (INT)
    VisitNumber (INT)
    Cancellation (INT)
    

    【讨论】:

    • 我仍然遇到同样的异常
    • @MarcoDinatsoli - 您确定数据库中的所有列都是INT 类型吗?我的意思是您在类型定义中定义的那些,例如CustomerID,ShowsNumber 等?
    • @MarcoDinatsoli - 请检查我的编辑,看看是否有帮助。
    • 我问了另一个关于同一问题的问题,stackoverflow.com/questions/27060852/…
    • @MarcoDinatsoli - 哎呀,我想的完全一样:D Column Mapping 正如我在编辑中提到的那样。我去喝茶,没能帮到你。道歉:)
    【解决方案2】:

    据我所知,您需要在数据表上设置列的类型,否则它将假定为字符串(因为几乎所有内容都可以这样转换)。

    在设置值之前,请尝试:

    dataTable.Columns[2].Type = typeof (int);
    

    或者,您可以在定义列时指定它:

    dataTable.Columns.Add("ShowsNumber", typeof(int));
    

    【讨论】:

    • 更新您的帖子以包含更新后的代码,我们可以看看。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-29
    相关资源
    最近更新 更多