Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/295.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何用c将文本框中的十进制值插入数据库#_C#_Sql Server - Fatal编程技术网

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

C# 如何用c将文本框中的十进制值插入数据库#,c#,sql-server,C#,Sql Server,我正在使用SQL Server数据库和Windows窗体应用程序。我有两个文本框和一个组合框。用户在文本框中输入自己的姓名和工作频率,然后从组合框中选择年份。我尝试将这些值插入数据库 例: 在数据库中: year --> nvarchar(4) name --> nvarchar(50) rate --> decimal(18,2) type --> nvarchar(50) 我的代码如下: SqlCommand cmd = new SqlCommand("INSERT

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

例:

在数据库中:

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语句中指定的列数匹配


应将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注入)

这种插入很容易被注入,正如您已经发现的那样,很难添加像decimal、DateTime等值。。。要添加列,请使用参数。添加

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');插入到一个限定表(somefield)值('somecolumn');更新另一个表集somefield='somevalue');插入到用户(年份、名称、费率、类型),(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" + "')"

我添加了一个示例,说明插入内容如何容易受到我的回答的影响,请看一看。为什么要将年份(这显然是一个数值)存储为
nvarchar(4)
?!?!使用最合适的数据类型-始终-在这里肯定是
INT
(多于
nvarchar(4)
)..将数据类型nvarchar转换为数字时出错。@DarthSucuk因为我不知道您的确切表结构,有些东西可能与它不匹配。例如,如果年列是nvarchar,您应该更改第一个参数,如下所示:
cmd.Parameters.Add(“@year”,SqlDbType.nvarchar).Value=yearcombo.Text;
等等,检查并确保您的列类型与参数类型匹配。我在写入37.2时修复了它,但在写入37.2时它会插入,但主要问题是它是用逗号存储的。如何修复它?在尝试转换它之前,只需将逗号替换为
convert.ToDecimal(rate.Text.Replace(“,”,“,”),CultureInfo.CurrentCulture)
它没有修复我刚才说的问题,但现在它得到了37,62到3762,00它给了我将数据类型nvarchar转换为数字的错误。
"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" + "')"