用SqlBulkCopy批量插入数据时提示来自数据源的 String 类型的给定值不能转换为指定目标列的类型 int。

狼王_ 2013-04-17 10:38:08
DataTable dt = new DataTable();
dt.Columns.Add("greouparea", typeof(System.Int32));
dt.Columns.Add("grouptype", typeof(System.Int32));
dt.Columns.Add("name", typeof(System.String));
dt.Columns.Add("mainperson", typeof(System.String));
dt.Columns.Add("groupform", typeof(System.String));
dt.Columns.Add("scale", typeof(System.String));
dt.Columns.Add("nature", typeof(System.Int32));
dt.Columns.Add("description", typeof(System.String));
dt.Columns.Add("level", typeof(System.Int32));
dt.Columns.Add("groupuser", typeof(System.String));
dt.Columns.Add("reportedsource", typeof(System.Int32));
dt.Columns.Add("localid", typeof(System.Int32));
dt.Columns.Add("userid", typeof(System.Int32));
dt.Columns.Add("remark", typeof(System.String));
DataRow dr = dt.NewRow();
for (int i = 0; i < ds.Tables[0].Rows.Count; i++)
{
dr = dt.NewRow();
dr["name"] = ds.Tables[0].Rows[i]["组织名称"].ToString();
dr["nature"] = param.id;
dr["reportedsource"] = local.id;
dr["localid"] = local.id;
dr["level"] = Model.id;
dr["scale"] = ds.Tables[0].Rows[i]["组织规模"].ToString();
dr["greouparea"] = ds.Tables[0].Rows[i]["组织地域"].ToString() == "境内组织" ? 10 : 11;
dr["grouptype"] = ds.Tables[0].Rows[i]["组织类型"].ToString() == "网络组织 " ? 0 : 1;
dr["mainperson"] = ds.Tables[0].Rows[i]["组织负责人"].ToString();
dr["groupform"] = ds.Tables[0].Rows[i]["组织形式"].ToString();
dr["description"] = ds.Tables[0].Rows[i]["组织描述"].ToString();
dr["groupuser"] = ds.Tables[0].Rows[i]["组织成员"].ToString();
dr["userid"] = AMSession.LoginUser.id;
dr["remark"] = ds.Tables[0].Rows[i]["备注信息"].ToString();
dt.Rows.Add(dr);
}

Stopwatch stopwatch = new Stopwatch();
stopwatch.Start();
SqlBulkCopy sqlBulkCopy = new SqlBulkCopy(AMCommon.DBUtility.DbHelperSQL.connectionString);
sqlBulkCopy.DestinationTableName = "groupinfo";
sqlBulkCopy.BatchSize = dt.Rows.Count;

SqlConnection sqlConnection = new SqlConnection(AMCommon.DBUtility.DbHelperSQL.connectionString);
sqlConnection.Open();
if (dt != null && dt.Rows.Count != 0)
{
sqlBulkCopy.WriteToServer(dt);
}
sqlBulkCopy.Close();
sqlConnection.Close();
stopwatch.Stop();
...全文
1701 12 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
duomuer 2014-09-09
  • 打赏
  • 举报
回复
引用 9 楼 wslww007 的回复:
SqlBulkCopy不是根据表的ColumnName来匹配的,而是根据ColumnIndex匹配, 也就是说你的表 字段必须跟数据库的表字段完全一致(Index的排序要跟数据表的一样)。 就算你该字段不打算给他插入值,也要建个DataColumn。包括自增ID.不需要给他值就好了
正解啊,顺序这一点很容易忽略
newnazi 2013-08-05
  • 打赏
  • 举报
回复
引用 10 楼 zaocha321 的回复:
[quote=引用 9 楼 wslww007 的回复:] SqlBulkCopy不是根据表的ColumnName来匹配的,而是根据ColumnIndex匹配, 也就是说你的表 字段必须跟数据库的表字段完全一致(Index的排序要跟数据表的一样)。 就算你该字段不打算给他插入值,也要建个DataColumn。包括自增ID.不需要给他值就好了
哥们儿,正解啊。。。。。。[/quote] 怎么解决的?分享一下吧
狼王_ 2013-04-26
  • 打赏
  • 举报
回复
引用 9 楼 wslww007 的回复:
SqlBulkCopy不是根据表的ColumnName来匹配的,而是根据ColumnIndex匹配, 也就是说你的表 字段必须跟数据库的表字段完全一致(Index的排序要跟数据表的一样)。 就算你该字段不打算给他插入值,也要建个DataColumn。包括自增ID.不需要给他值就好了
哥们儿,正解啊。。。。。。
wslww007 2013-04-25
  • 打赏
  • 举报
回复 1
SqlBulkCopy不是根据表的ColumnName来匹配的,而是根据ColumnIndex匹配, 也就是说你的表 字段必须跟数据库的表字段完全一致(Index的排序要跟数据表的一样)。 就算你该字段不打算给他插入值,也要建个DataColumn。包括自增ID.不需要给他值就好了
await2013 2013-04-18
  • 打赏
  • 举报
回复
手动加ColumnMapping,别太懒
TIgerSH1986 2013-04-18
  • 打赏
  • 举报
回复
一般 像是类似的外键之类的 string 数据库存着id 你可以查看下 具体哪行 那得 调试调试了
九幽之君 2013-04-18
  • 打赏
  • 举报
回复
调试啊,设断点
狼王_ 2013-04-18
  • 打赏
  • 举报
回复
现在是我无法定位到到底是那一列类型转换错误了,我知道肯定是string转int时报错了,但是我看生成的dt里面的int类型字段全部是数字啊。。
md5e 2013-04-18
  • 打赏
  • 举报
回复
Discuz!NT里面有一个Discuz.Common类库 Utils.StrToInt(要转换字段,默认值)蛮不错的
md5e 2013-04-18
  • 打赏
  • 举报
回复
应该是某个int字段遇到null或""
Scorip 2013-04-18
  • 打赏
  • 举报
回复
报那么明显的错误都不能解决?
hb1122 2013-04-18
  • 打赏
  • 举报
回复
类型错了呗呗呗呗

62,241

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧