如何在Web表单上输入值并将其作为数值存储在SQL Server中

时间:2016-01-26 06:11:36

标签: c# asp.net sql-server

我有以下代码:

protected void btn_add_Click(object sender, EventArgs e)
{
    if (intSlipID_srch.Text == "")
        lblStatus.Text = "Please enter a Slip ID.  ";
    string connection =
    WebConfigurationManager.ConnectionStrings["popeye_marina"].ConnectionString;
    SqlConnection con = new SqlConnection(connection);

    // Clear text controls

    txtSlipLength.Text = string.Empty;
    txtSlipWidth.Text = string.Empty;
    txtCovered.Text = string.Empty;
    txtFee.Text = string.Empty;
    intDockID.Text = string.Empty;
    intBoatID.Text = string.Empty;

    // Create Update SQL string

    string insertSQL;
    insertSQL = "INSERT INTO slip (";
    insertSQL += "slip_length, slip_width, ";
    insertSQL += "covered, annual_fee, dock_id, boat_id) ";
    insertSQL += "VALUES (";
    insertSQL += "@slip_length, @slip_width, @covered, ";
    insertSQL += "@fee, @dockID, @boatID)";

    SqlCommand cmd = new SqlCommand(insertSQL, con);
    cmd.Parameters.AddWithValue("@slip_length", txtSlipLength.Text);

    cmd.Parameters.AddWithValue("@slip_width", txtSlipWidth.Text);
    cmd.Parameters.AddWithValue("@covered", txtCovered.Text);
    cmd.Parameters.AddWithValue("@fee", txtFee.Text);
    cmd.Parameters.AddWithValue("@dockID", intDockID.Text);
    cmd.Parameters.AddWithValue("@boatID", intBoatID.Text);
    int inserted = 0;
    try
    {
        con.Open();
        inserted = cmd.ExecuteNonQuery();
        lblStatus.Text = inserted.ToString() + " record inserted.";
    }
    catch (Exception err)
    {
        lblStatus.Text = "Error saving Slip.  ";
        lblStatus.Text += err.Message;
    }
    finally
    {
        con.Close();
    }
}

目标数据库列是数字。当我运行Web表单并输入数值时,我收到错误:

  

将数据类型nvarchar转换为数字

时出错

你能告诉我如何纠正这个错误吗?

3 个答案:

答案 0 :(得分:2)

这里有两个错误,

首先,为什么在将文本框分配给新变量之前清除它。它总是会返回一个空字符串。

txtSlipLength.Text = string.Empty;
txtSlipWidth.Text = string.Empty;
txtCovered.Text = string.Empty;
//...

第二,您需要使用表格将值转换为适当的数据类型。

例如:

//if your column is Decimal
cmd.Parameters.AddWithValue("@slip_length", Convert.ToDecimal(txtSlipLength.Text));
//if your column is Integer
cmd.Parameters.AddWithValue("@slip_length", Convert.ToInt32(txtSlipLength.Text));
//if your column is string (nvarchar, varchar, char, etc.) then you can use your code
cmd.Parameters.AddWithValue("@slip_length", txtSlipLength.Text);

答案 1 :(得分:1)

不确定哪个特定列,但很少的表列是数字的,并将它们作为字符串传递给DB肯定会导致转换/转换错误。例如:annual_fee您将其作为文本传递。而是转换为int,然后像

一样传递它
cmd.Parameters.AddWithValue("@fee", Convert.ToInt32(txtFee.Text));

更好,使用Add()方法的重载,如

cmd.Parameters.Add("@fee", SqlDbType.Int).Value = Convert.ToInt32(txtFee.Text));

答案 2 :(得分:0)

问题是像slip_length这样的变量是数字,你为它传递一个字符串,它与nvarchar类型相关联。你可以减轻这种情况,如下所示:

cmd.Parameters.AddWithValue("@slip_length", decimal.Parse(txtSlipLength.Text));

但是,必须注意如果txtSlipLength.Text无法解析为小数,则会抛出异常。你可以通过多种方式解决这个问题。首先,您必须设置验证方案,当且仅当满足您定义的条件时,才能继续数据持久性。然后,您可以使用Parse方法的主动版TryParse