从用户文本框插入值时出现转换错误

时间:2017-11-10 16:04:10

标签: c# sql

我在数据库服务器上有一个表

 CREATE TABLE [dbo].[io] (
 [io_id] INT NOT NULL, 
 [name] VARCHAR (50) NULL,
 [gender] CHAR (10) NULL,
 [rank] VARCHAR (50) NULL, 
 [salary] INT NULL, 
  PRIMARY KEY CLUSTERED ([io_id] ASC) );

对于此表,我使用以下代码插入数据:

private void button2_Click_1(object sender, EventArgs e)
{
    SqlConnection cn = new SqlConnection(global::CFMSApp.Properties.Settings.Default.CFMSConnectionString);
    try
    {
        con.Open();
        SqlCommand cmd = con.CreateCommand();
        cmd.CommandType = CommandType.Text;
        cmd.CommandText = "insert into io values('" + textBox1.Text + "','" + textBox2.Text + "','" + textBox3.Text + "','" + textBox4.Text + "','" + textBox5.Text + "')";
        cmd.ExecuteNonQuery();
        con.Close();
        MessageBox.Show("adding new record done");
        textBox1.Text = " ";
        textBox2.Text = " ";
        textBox3.Text = " ";
        textBox4.Text = " ";
        textBox5.Text = " ";
    }
    catch (Exception ex)
    {
        MessageBox.Show(ex.Message, "error");
    }
    finally
    {
        cn.Close();
        con.Close();
    }
}

插入记录时出错:

  

转换varchar值时转换失败' anagha'到数据类型int

如何防止此错误?

2 个答案:

答案 0 :(得分:0)

你的查询字符串有错误,就像这样

  

插入io(io_id,姓名,性别,职级,薪水)   价值观('" + textBox1.Text +"','" + textBox2.Text +"',' " + textBox3.Text +"','" + textBox4.Text +"','" + textBox5 .Text +"')";

你正在做什么的textbox1.text,这是' anagha'正在输入io_id并且是整数值。你在导致问题的整数上输入一个字符串。

我的一些建议使用参数化查询。 sql注入或黑客可以在你的程序上使用

答案 1 :(得分:0)

第一列的类型是什么?这是一个INT。 textBox1.Text的类型是什么?这是一个字符串。您不能将字符串隐式转换为INT。

鉴于你有五个值和五个文本框,但第一个显然包含一个字符串(即“anagha”),很难告诉你如何解决问题。 textBox1应该包含io_id的值吗?如果是这样,那么也许io_id应该是varchar而不是INT。另一方面,如果它必须是INT,那么您应该阻止用户在textBox1中输入字符。也许io_id应该是自动生成的,在这种情况下你的表结构是错误的,你根本不应该在表单上有一个字段。糟糕的命名约定(即textBox1,textBox2等)使得无法确定您的意图。

然而,你绝对应该解决的一件事是你有可怕的SQL注入问题。

cmd.CommandText = "insert into io values(@value1, @value2, @value3, @value4, @value5)";
var parameter = new SqlParameter("@value1", SqlDbType.Int)
{ Value = textBox1.Text };
cmd.Parameters.Add(parameter);
var parameter = new SqlParameter("@value2", SqlDbType.NVarChar, 50)
{ Value = textBox2.Text };
// ... etc ...