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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.13 09:15:29