类型VARCHAR值的算术溢出误差= 770214566.000000000



我有一个dtatgridview,其中从excel表和一个按钮分配了数据,将dtatgridview的行插入sql server表中,当我单击插入按钮并给我给我时,发生了错误在我的问题7770214566上方声明的异常是用户的手机号码,其数据类型是我的表中的char(9),这是我的插入按钮的代码:

private void addCarsSaveBtn_Click(object sender, EventArgs e)
{
    try
    {
        for (int i = 0; i < addCarsDgv.Rows.Count - 1; i++)
        {
            SqlCommand cmd = new SqlCommand("insert into cars(Id,name,carType,stickerNo,plotNo,carPath,mobile,whats) values (@id,@name,@type,@sticker,@plot,@path,@mobile,@whats)", cn);
            cmd.Parameters.AddWithValue("@id", id + i);
            cmd.Parameters.AddWithValue("@sticker", Convert.ToInt32(addCarsDgv.Rows[i].Cells[0].Value));
            cmd.Parameters.AddWithValue("@name", addCarsDgv.Rows[i].Cells[1].Value);
            cmd.Parameters.AddWithValue("@mobile", addCarsDgv.Rows[i].Cells[2].Value);
            cmd.Parameters.AddWithValue("@whats", addCarsDgv.Rows[i].Cells[3].Value);
            cmd.Parameters.AddWithValue("@type", addCarsDgv.Rows[i].Cells[4].Value);
            cmd.Parameters.AddWithValue("@plot", addCarsDgv.Rows[i].Cells[5].Value);
            cmd.Parameters.AddWithValue("@path", addCarsDgv.Rows[i].Cells[6].Value);
            cmd.ExecuteNonQuery();
        }
        MessageBox.Show("All Done!");
    }
    catch (SqlException ex)
    {
        MessageBox.Show(ex.Message);
    }
}

在大多数情况下,AddWithValue将正确解释您的意图。但是,在这种情况下,如果不这样做,您总是可以通过这两个方面的帮助:

  • 施放数据类型以迫使上下文匹配。在您的示例中,简单的.ToString()可能会解决问题...然后,如果这些小数真的在那里,我可以看到另一个错误会出现。如您所知,这不是防弹的。这可能失败的另一个示例是时间戳和日期如何投放到c# DateTime datatype
  • 对参数的数据类型明确。除非您做一些不合理的事情(例如将角色放入数字字段中),这会导致错误,否则这应该是防弹的

这是如何实现选项#2:

的示例
cmd.Parameters.AddWithValue("@mobile", addCarsDgv.Rows[i].Cells[2].Value);
cmd.Parameters[3].SqlDbType = SqlDbType.Char;

这可能不用说,但是" [3]"是因为它是第四参数。

或正如其他人建议的那样,不使用AddWithValue

最新更新