将表达式转换为数据类型int的算术溢出错误

时间:2013-11-29 13:19:56

标签: c#

表结构是

userid int
fname varchar(50)
lname varchar(50)
Email varchar(50)
Phone decimal(18,2)

这是程序

ALTER procedure [dbo].[AddUser] 
     @userid int,
     @fname varchar(50),
     @lname varchar(50),
     @Email varchar(50),
     @Phone decimal(18,2)
as
    insert into UserInfo(Userid, Fname, Lname, Email, Phone) 
    values(@userid, @fname, @lname, @Email, @Phone)

这是我的代码......

protected void Button1_Click(object sender, EventArgs e)
{
    SqlConnection con = new SqlConnection(ConfigurationManager.AppSettings["con1"]);
    try
    {
        con.Open();

        SqlCommand cmd = new SqlCommand("AddUser",con);
        cmd.CommandType = CommandType.StoredProcedure;

        cmd.Parameters.AddWithValue("@userid",Int32.Parse(TextBox1.Text.Trim()));
        cmd.Parameters.AddWithValue("@fname",TextBox2.Text) ;
        cmd.Parameters.AddWithValue("@lname",TextBox3.Text) ;
        cmd.Parameters.AddWithValue("@Email",TextBox4.Text);
        cmd.Parameters.AddWithValue("@Phone",TextBox5.Text);

        cmd.ExecuteNonQuery();

        Label1.Text = "Record Has Been Added Successfully!";
    }
    catch (Exception en)
    {
        Label1.Text = "Retry to add";
    }
}

如果我输入Phone没有最大值,例如。 233242342423它给出了错误...请问如何解决?

5 个答案:

答案 0 :(得分:0)

我建议您定义varchar(15)来存储手机。 (对于该字段的性能定义索引)

答案 1 :(得分:0)

不仅会丢失前导零,而且将电话号码存储为整数或双精度也是不好的做法。 使用字符串(文本字段),因为您不会对电话号码进行任何算术运算。

答案 2 :(得分:0)

您使用AddWithValue的方式,该命令假定您的string类型的所有列(第一列除外)。

这对于列不适用:     cmd.Parameters.AddWithValue("@Phone",TextBox5.Text)

可能未在数据库中定义为字符串,因此您需要尝试显式解析它们。注意 - 您需要考虑更换存储手机的类型(varchar将是一个不错的选择。)

答案 3 :(得分:0)

您不应将电话号码数据类型视为小数。 把电话号码作为一个字符串,并给出长度 phone varchar(18)。 它会起作用。

答案 4 :(得分:0)

AddWithValue方法根据您为其提供的值的类型将您的值转换为SQL数据类型。如果SQL数据类型是十进制,则需要解析为AddWithValue的.NET十进制以正确转换它:

cmd.Parameters.AddWithValue("@Phone", Decimal.Parse(TextBox5.Text));