ASP.NET中Post方法执行INSERT语句时出现VALUES子句值数量与指定列数不匹配的错误排查
问题分析与解决方案
你遇到的这个错误完全是因为INSERT语句的VALUES子句格式错误,还附带一个参数拼写问题,我来帮你一步步修正:
核心错误点1:VALUES子句的括号使用错误
你的原SQL语句里,VALUES后面把每个参数都单独用括号括起来了:
values (@ObjektiMeQiraEmri), (@LLojiObjektit), (@Siperfaqe), (@NumriIDHomave), (@Kati), (@Cmimi), (@Vendndodhja), (@Qyteti), (@Shteti)
这种写法会被SQL Server解析成9个独立的单行插入请求,每个行只包含1个值,但你前面明确指定了9列,自然会触发“值数量与列数不匹配”的错误。正确的写法是把所有参数放在同一个括号内,用逗号分隔。
次要错误点2:参数名拼写错误
你在SQL里写了@LLojiObjektit(两个L),但后面绑定参数时用的是@LlojiObjektit(一个L),这会导致参数绑定失败,也是潜在的问题,必须一起修正。
修正后的完整Post方法代码
[HttpPost] public JsonResult Post(ObjektiMeQira omq) { // 修正SQL的VALUES格式,同时修正参数拼写错误 string query = @" insert into dbo.ObjektiMeQira(ObjektiMeQiraEmri,LlojiObjektit,Siperfaqe, NumriIDHomave, Kati, Cmimi, Vendndodhja, Qyteti, Shteti) values (@ObjektiMeQiraEmri, @LlojiObjektit, @Siperfaqe, @NumriIDHomave, @Kati, @Cmimi, @Vendndodhja, @Qyteti, @Shteti) "; string sqlDataSource = _configuration.GetConnectionString("EmployeeAppCon"); using (SqlConnection myCon = new SqlConnection(sqlDataSource)) { myCon.Open(); using (SqlCommand myCommand = new SqlCommand(query, myCon)) { myCommand.Parameters.AddWithValue("@ObjektiMeQiraEmri", omq.ObjektiMeQiraEmri); myCommand.Parameters.AddWithValue("@LlojiObjektit", omq.LlojiObjektit); myCommand.Parameters.AddWithValue("@Siperfaqe", omq.Siperfaqe); myCommand.Parameters.AddWithValue("@NumriIDHomave", omq.NumriIDHomave); myCommand.Parameters.AddWithValue("@Kati", omq.Kati); myCommand.Parameters.AddWithValue("@Cmimi", omq.Cmimi); myCommand.Parameters.AddWithValue("@Vendndodhja", omq.Vendndodhja); myCommand.Parameters.AddWithValue("@Qyteti", omq.Qyteti); myCommand.Parameters.AddWithValue("@Shteti", omq.Shteti); // 插入操作不需要DataReader和DataTable,用ExecuteNonQuery更合适 myCommand.ExecuteNonQuery(); } } return new JsonResult("Added Successfully"); }
额外优化说明
- 插入/更新/删除这类写操作,不需要使用
SqlDataReader和DataTable,直接调用ExecuteNonQuery()即可,它会返回受影响的行数,更符合操作场景。 using块会自动释放连接和命令资源,不需要手动调用Close(),删掉冗余的手动关闭代码能让代码更简洁安全。
内容的提问来源于stack exchange,提问作者Ardit Hamiti
相关产品推荐
相关产品推荐

