我在数据库服务器上有一个表
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
如何防止此错误?
答案 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 ...