来自数据源的字符串类型值无法转换为指定目标列的bigint类型。

4

这是我的代码:

protected void SendToServer_Click(object sender, EventArgs e)
{
    DataTable Values = Session["valuesdt"] as DataTable;

    if (Values.Rows.Count > 0)
    {
        //Fix up default values
        for (int i = 0; i < Values.Rows.Count; i++)
        {
            Values.Rows[i]["Mobile1"] = Values.Rows[i]["Mobile1"].ToString() == "" ? 0 : double.Parse(Values.Rows[i]["Mobile1"].ToString());
            Values.Rows[i]["Mobile2"] = Values.Rows[i]["Mobile2"].ToString() == "" ? 0 : double.Parse(Values.Rows[i]["Mobile2"].ToString());
            Values.Rows[i]["Tel"] = Values.Rows[i]["Tel"].ToString() == "" ? 0 : double.Parse(Values.Rows[i]["Tel"].ToString());
            Values.Rows[i]["Category"] = Values.Rows[i]["Category"].ToString();
        }

        DataTable dv = Values.DefaultView.ToTable(true, "Mobile1", "Mobile2", "Tel", "Category");
        BulckCopyDataTable(dv, "client", 1000);
    }
}

public void BulckCopyDataTable(DataTable dt,string DestinationTable,int batchSize)
{
    connection.Open();

    using (SqlBulkCopy copy = new SqlBulkCopy(connection))
    {
        copy.BatchSize = batchSize;
        copy.DestinationTableName = DestinationTable;
        copy.WriteToServer(dt);
        connection.Close();
    }
}

我不知道为什么在数据库中会出现这个错误:

Mobile1 bigint, Mobile2 bigint, Tel bigint, Category nvarchar(MAX)

1
在“Values”数据表中检查“Mobile1”、“Mobile2”和“Tel”的数据类型。 - Andrey Gordeev
1
就像@AndreyGordeev所说的那样。此外,我认为以数字格式存储电话号码不是个好主意。一些(大多数?)号码以零开头,如果您将其转换为数字,则会丢失它。大多数人会将其分组写下(+12 (3456) 789 654 432),他们希望以完全相同的格式获得回复。 - Corak
非常感谢,我已经将我的SQL表中列的数据类型更改为nvarchar,并且它正常工作。 - Sora
1个回答

7
我在这个bytes.com帖子中找到了一个答案。
您只需使用SqlBulkCopyColumnMapping将源列映射到目标表即可。
bulkCopy.ColumnMappings.Add(new SqlBulkCopyColumnMapping(0, 1));
bulkCopy.ColumnMappings.Add(new SqlBulkCopyColumnMapping(1, 2));
bulkCopy.ColumnMappings.Add(new SqlBulkCopyColumnMapping(2, 3));
bulkCopy.ColumnMappings.Add(new SqlBulkCopyColumnMapping(3, 6)); //look here, index is different
bulkCopy.ColumnMappings.Add(new SqlBulkCopyColumnMapping(4, 8)); //and again
bulkCopy.ColumnMappings.Add(new SqlBulkCopyColumnMapping(5, 9));

在发现上面的解决方案之前,我也在这里找到了相同的解决方案,但在我的情况下,源数据缺少一些字段。虽然这些字段的顺序是正确的,但它们参考的是实际字段的索引/顺序。如果我没有缺失的字段,它本来可以正常工作。


我也遇到了DateTime数据类型的相同问题,但令人惊讶的是,当我上传Excel文件时,第一次会停在这个错误上,但下一次上传相同的Excel文件时,它会成功上传而没有任何错误。我不知道为什么会发生这种情况,请建议。 - RSB

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接