ASP.NET报错:nvarchar转numeric失败,商品插入问题求助
解决插入Product表时“nvarchar to numeric”转换错误的问题
我一眼就揪出了问题的核心——你的INSERT语句参数顺序和数据库表的字段顺序完全不匹配,这才是导致类型转换报错的根本原因!
先对比一下关键信息:
- Product表的字段顺序(跳过自增的ProdID):
ProdName→ProdPrice→ProdDesc→ImageName→Size→ImageData→ProdBrand→ProdStock - 但你写的INSERT语句里,参数顺序却是:
@ProdName→@ProdDesc→@ProdPrice→ ...
说白了,你把原本要插入ProdDesc的字符串数据,硬塞给了ProdPrice这个decimal类型的字段,这不触发“nvarchar转numeric”错误才怪!
第一步:修正INSERT语句的字段映射
一定要在INSERT语句里明确指定要插入的字段名,再按对应顺序传参数,这样哪怕表结构字段顺序变动,代码也不会出错。修正后的代码如下:
string cs = ConfigurationManager.ConnectionStrings["DataBase"].ConnectionString; using (SqlConnection con = new SqlConnection(cs)) { // 明确指定字段名,和表结构顺序一一对应 SqlCommand cmd = new SqlCommand(@" INSERT INTO Product (ProdName, ProdPrice, ProdDesc, ImageName, Size, ImageData, ProdBrand, ProdStock) VALUES (@ProdName, @ProdPrice, @ProdDesc, @ImageName, @Size, @ImageData, @ProdBrand, @ProdStock);", con); cmd.Parameters.AddWithValue("@ProdName", txtProdName.Text); cmd.Parameters.AddWithValue("@ProdPrice", decimal.Parse(txtProdPrice.Text)); cmd.Parameters.AddWithValue("@ProdDesc", txtProdDesc.Text); cmd.Parameters.AddWithValue("@ImageName", fileName); cmd.Parameters.AddWithValue("@Size", fileSize); cmd.Parameters.AddWithValue("@ImageData", bytes); cmd.Parameters.AddWithValue("@ProdBrand", ddlBrand.SelectedItem.Text); cmd.Parameters.AddWithValue("@ProdStock", int.Parse(txtProdStock.Text)); con.Open(); cmd.ExecuteNonQuery(); // using块会自动释放连接,不用手动调用con.Close() lblImageResult.Visible = true; lblImageResult.Text = "Upload Successful"; lblImageResult.ForeColor = System.Drawing.Color.Green; }
第二步:补充输入验证(避免后续潜在崩溃)
你现在用的decimal.Parse和int.Parse如果遇到用户输入无效内容(比如字母、空值)会直接抛出异常,建议提前做验证:
// 验证商品价格是否为有效decimal if (!decimal.TryParse(txtProdPrice.Text, out decimal prodPrice)) { lblImageResult.Text = "请输入有效的商品价格!"; lblImageResult.ForeColor = System.Drawing.Color.Red; return; } // 验证库存数量是否为有效int if (!int.TryParse(txtProdStock.Text, out int prodStock)) { lblImageResult.Text = "请输入有效的库存数量!"; lblImageResult.ForeColor = System.Drawing.Color.Red; return; } // 后续参数直接用验证后的变量 cmd.Parameters.AddWithValue("@ProdPrice", prodPrice); cmd.Parameters.AddWithValue("@ProdStock", prodStock);
第三步:建议用显式参数类型替代AddWithValue
AddWithValue偶尔会因为类型推断偏差导致意外问题,最好显式指定参数的SqlDbType,确保和数据库字段类型完全匹配:
cmd.Parameters.Add("@ProdPrice", SqlDbType.Decimal).Value = prodPrice; cmd.Parameters.Add("@ProdStock", SqlDbType.Int).Value = prodStock; // 其他参数也可以照此处理,比如: cmd.Parameters.Add("@ProdName", SqlDbType.NVarChar, 50).Value = txtProdName.Text;
内容的提问来源于stack exchange,提问作者Dallas Chow
相关产品推荐
相关产品推荐

