You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

实习生求助:Insert方法遇String转Int32类型转换异常

帮你解决Insert方法的两个错误

嘿,别慌!我来帮你拆解下这两个错误的根源,一步步解决问题:

错误根源分析

1. DataRow赋值方式错误

你在dt.Rows.Add里的参数传递逻辑有问题:

dt.Rows.Add(1, new string[] { lang, known, known, known }, werknemerId);

DataRowCollection.Add方法需要与DataTable列数匹配的单个参数列表,但你把Taal、Spreken、Lezen、Schrijven四个列的值打包成了一个数组,这会导致:

  • 数组被当作单个值赋值给第二列Taal(实际存储的是数组的字符串表示,比如"System.String[]")
  • 后续的Spreken、Lezen、Schrijven列没有被赋值,默认是DBNull

当SqlBulkCopy写入数据库时,目标表的某个int列可能接收到了这个字符串值,从而抛出「String无法转换为Int32」的异常。

2. 重复调用写入方法

你连续调用了两次bc.WriteToServer(dt);,这会导致DataTable里的所有数据被重复插入到数据库中,虽然不是报错的直接原因,但会造成数据冗余。

修正后的完整代码

int werknemerId = 12345; 
int knowhowLenght = knowhowMatches.Count; 
DataTable dt = new DataTable(); 
dt.Columns.Add(new DataColumn("Kantoor", typeof(int))); 
dt.Columns.Add(new DataColumn("Taal", typeof(string))); 
dt.Columns.Add(new DataColumn("Spreken", typeof(string))); 
dt.Columns.Add(new DataColumn("Lezen", typeof(string))); 
dt.Columns.Add(new DataColumn("Schrijven", typeof(string))); 
dt.Columns.Add(new DataColumn("Talen_op_werknemerID", typeof(int))); 

// 修正Rows.Add的参数传递:每个列对应一个参数,顺序和DataTable列一致
for (int x = 0; x < languageMatches.Count; x++) { 
    string lang = languageMatches[x]; 
    string known = knowhowMatches[x]; 
    dt.Rows.Add(1, lang, known, known, known, werknemerId); 
} 

using(SqlConnection Conn = new SqlConnection(connstring)) { 
    Conn.Open(); 
    using(SqlBulkCopy bc = new SqlBulkCopy(Conn)) { 
        bc.DestinationTableName = "UzkTalen"; 
        
        // 推荐添加列映射:确保DataTable列和目标表列按名称匹配,避免顺序不一致导致的错误
        bc.ColumnMappings.Add("Kantoor", "Kantoor");
        bc.ColumnMappings.Add("Taal", "Taal");
        bc.ColumnMappings.Add("Spreken", "Spreken");
        bc.ColumnMappings.Add("Lezen", "Lezen");
        bc.ColumnMappings.Add("Schrijven", "Schrijven");
        bc.ColumnMappings.Add("Talen_op_werknemerID", "Talen_op_werknemerID");
        
        // 移除重复的写入调用
        bc.WriteToServer(dt); 
    } 
}

关键修正点说明

  1. 修正Rows.Add参数:现在每个参数对应DataTable的一列,类型完全匹配,不会再出现字符串转int的类型错误。
  2. 移除重复写入:只保留一次WriteToServer调用,避免数据重复插入。
  3. 添加列映射(可选但推荐):如果目标表UzkTalen的列顺序和DataTable不一致,SqlBulkCopy会按位置匹配,容易出问题。添加列映射后,会按列名匹配,更安全可靠。

内容的提问来源于stack exchange,提问作者Excalibur Morgan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.06 13:02:45