C# 无法将数据源中给定的字符串类型值转换为指定目标列的bigint类型
这是我的密码:C# 无法将数据源中给定的字符串类型值转换为指定目标列的bigint类型,c#,sql,C#,Sql,这是我的密码: 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
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();
}
}
我从中找到了答案
您所要做的就是使用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));
在找到上述内容之前,我也找到了相同的解决方案,但在我的例子中,源代码中缺少了一些字段。字段的顺序正确,尽管它引用了字段的实际索引/顺序。如果我没有缺少的字段,它就会工作。检查
Mobile1
,Mobile2
,Tel
在值中的数据类型。此外,我认为以数字格式存储电话号码不是一个好主意。有些(大多数?)数字以零开头,如果将其转换为数字,则会丢失该数字。大多数人把它分组写下来(+12(3456)789 654 432
),他们希望能把它恢复到原来的格式。非常感谢,我在sqql表中将我列的数据类型改为nvarchar,它工作正常。我对DateTime数据类型也有同样的问题,但令人惊讶的是,当我上传excel文件时,第一次它在这个错误处停止,但下一次当我上传同一个excel文件时,它成功上传,没有任何错误。我不知道为什么会这样。请建议。
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));