多行文本框数据存入SQL Server数据库报Invalid Column Name错误如何处理
问题原因
- 表名不匹配:INSERT语句中操作的表为
tbl_overall_details,但你提供的实际存在的表结构是tbl_nametally_details。若tbl_overall_details不存在,或该表的字段与你写入的Serial_no/Batch_no等列名不一致,就会触发Invalid Column Name报错。 - 参数数据类型与表结构不匹配:表中
Serial_no、Batch_no、Worder_no、Service_no、Blue_name_qty均为int类型,Worder_date为date类型,但代码中所有参数都设置为VarChar类型传字符串,即使隐式转换成功也存在格式不符的报错风险。 - 字段长度不足:
Blue_name字段仅为nvarchar(50),两行多语言姓名很容易超出长度限制,导致内容截断或报错。
解决办法
- 修正插入语句的表名,改为实际要写入的
tbl_nametally_details;如果确实需要写入tbl_overall_details,先核对该表的列名、字段类型是否和代码中写的完全一致,注意大小写敏感的SQL Server实例会对大小写不同的同拼写字段判定为不同列。 - 调整参数数据类型和表结构对齐,参考修改后的代码:
ValidateField(textBox47); if (HasEmptyField) { return; } // 修正表名 query = "insert into tbl_nametally_details (Serial_no, Batch_no, Worder_no, Worder_date, Service_no, Blue_name, Blue_name_qty) VALUES (@d1, @d2, @d3, @d4,@d5, @d6,@d7)"; using (cmd1 = new SqlCommand(query, con)) { // 参数类型和表结构对齐 cmd1.Parameters.Add("@d1", SqlDbType.Int).Value = int.Parse(lbl_serail_no.Text.Trim()); cmd1.Parameters.Add("@d2", SqlDbType.Int).Value = int.Parse(lbl_batch_no.Text.Trim()); cmd1.Parameters.Add("@d3", SqlDbType.Int).Value = int.Parse(textBox1.Text.Trim()); cmd1.Parameters.Add("@d4", SqlDbType.Date).Value = dateTimePicker1.Value.Date; cmd1.Parameters.Add("@d5", SqlDbType.Int).Value = int.Parse(textBox3.Text.Trim()); // 指定nvarchar长度,提前校验内容长度避免溢出 var blueName = textBox45.Text.Replace(Environment.NewLine,"\r\n").Trim(); if (blueName.Length > 50) { // 可加自定义的长度超限提示逻辑 return; } cmd1.Parameters.Add("@d6", SqlDbType.NVarChar, 50).Value = blueName; cmd1.Parameters.Add("@d7", SqlDbType.Int).Value = int.Parse(textBox47.Text.Trim()); cmd1.ExecuteNonQuery(); } con.Close();
- 若业务允许输入更长的双语言姓名,建议调整表结构中
Blue_name的长度,例如修改为nvarchar(200),避免内容截断。 - 建议增加try-catch异常捕获逻辑,获取更详细的报错信息,方便快速定位问题。
内容的提问来源于stack exchange,提问作者siraj ahmed
相关产品推荐
相关产品推荐

