我有以下代码:
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转换为数字
时出错
你能告诉我如何纠正这个错误吗?
答案 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
。