如何使用C#将文本框中的十进制值插入数据库

时间:2019-03-20 11:58:07

标签: c# sql-server

我正在使用SQL Server数据库和Windows Forms应用程序。我有2个文本框和1个组合框。用户在文本框中输入他们的姓名和工作率,然后从组合框中选择年份。我尝试将这些值插入数据库。

EX:

2018    Mike    39,72     WORKERS

在数据库中:

year --> nvarchar(4)
name --> nvarchar(50)
rate --> decimal(18,2)
type --> nvarchar(50)

我的代码如下:

SqlCommand cmd = new SqlCommand("INSERT INTO USERS(YEAR,NAME,RATE,TYPE) VALUES ('" + yearcombo.Text + "','" + name.Text + "','" + Convert.ToDecimal(rate.Text, CultureInfo.CurrentCulture) + ",'" + "WORKERS" + "')", connection);

我收到此错误:

  

INSERT语句中的列少于VALUES子句中指定的值。 VALUES子句中的值数必须与INSERT语句中指定的列数匹配。

2 个答案:

答案 0 :(得分:11)

这种插​​入很容易注入,并且您已经发现很难添加小数,DateTime等值以添加列,请使用Parameters.Add

SqlCommand cmd = new SqlCommand("INSERT INTO USERS(YEAR,NAME,RATE,TYPE) VALUES (@year, @name,@rate,@type)", connection);

cmd.Parameters.Add("@year", SqlDbType.Int).Value = int.Parse(yearcombo.Text);
cmd.Parameters.Add("@name", SqlDbType.VarChar).Value = name.Text;
cmd.Parameters.Add("@rate", SqlDbType.Decimal).Value = Convert.ToDecimal(rate.Text, CultureInfo.CurrentCulture);
cmd.Parameters.Add("@type", SqlDbType.VarChar).Value = "WORKERS";

想象一下,有人更改了yearcombo值(例如,就像在chrome中使用inspect元素一样)并将其设置为:

“ 2019,'a',1,'Something');插入ARESTRICTEDTABLE(somefield)values('somecolumn');更新AnotherTable set SomeField ='somevalue');,插入用户(年份,名称,费率,type),(2019,“

然后您的命令文本为:

"insert into users (year,name,rate,type) (2019,'a',1,'Something');insert into ARESTRICTEDTABLE(somefield) values('somecolumn'); update AnotherTable set SomeField = 'somevalue');, insert into users(year,name,rate,type),(2019," ,'" + name.Text + "','" + Convert.ToDecimal(rate.Text, CultureInfo.CurrentCulture) + ",'" + "WORKERS" + "')"

答案 1 :(得分:7)

您应该对包含参数的查询使用 SqlParameter : 应该是这样的:

SqlCommand cmd = new SqlCommand("INSERT INTO USERS(YEAR,NAME,RATE,TYPE) VALUES (@YEAR, @NAME, @RATE, @TYPE)", connection);
cmd.Parameters.Add(new SqlParameter("@YEAR", yearcombo.Text));
cmd.Parameters.Add(new SqlParameter("@NAME", name.Text));
cmd.Parameters.Add(new SqlParameter("@RATE", Convert.ToDecimal(rate.Text, CultureInfo.CurrentCulture)));
cmd.Parameters.Add(new SqlParameter("@TYPE", "WORKERS"));

我没有测试它,但是它会将您的参数转换为查询的正确小数。 另外,最好将SqlParameter用于安全性问题(防止 SQL注入