SqlCommand error
本文关键字:error SqlCommand | 更新日期: 2023-09-27 18:08:19
目前我正试图通过c#程序硬编码3个值来填充我的SQL Server数据库。
我的数据库有4列,如下:
-
RowID
(这应该由我的数据库自动更新) -
Name
(存储为字符串) -
Score
(int) -
Accuracy
(float)
在我的代码中,我试图用以下代码行填充这些:
using (SqlConnection connection = new SqlConnection(DBConnection))
{
string name = "John";
int score = 123;
float Accuracy = 20.0f;
SqlCommand command = new SqlCommand("INSERT INTO HighScoreTable(Name, Score, Accuracy) VALUES(" + name + " , " + score + " , " + Accuracy + ")", connection);
command.Connection.Open();
command.ExecuteNonQuery();
}
但是当我运行程序时,Visual Studio突出显示
command.ExecuteNonQuery()
表示' John'不是一个有效的列。
我做错了什么吗?
我认为唯一正确的方法是:
using (SqlConnection connection = new SqlConnection(DBConnection))
{
string name = "John";
int score = 123;
float Accuracy = 20.0f;
using (SqlCommand command = new SqlCommand("INSERT INTO HighScoreTable(Name, Score, Accuracy) VALUES(@name, @score, @accuracy)", connection);
{
command.Parameters.AddWithValue("@name", name);
command.Parameters.AddWithValue("@score", score);
command.Parameters.AddWithValue("@accuracy", accuracy);
command.Connection.Open();
command.ExecuteNonQuery();
}
}
请注意,当使用参数化查询时,不需要注意单引号 !!字符串参数不是用单引号括起来的——这一切都是框架为你完成的。
这里有很多错误
- 如果你想这样插入,你需要在周围添加"'"你的价值观。
- 您需要在值之间使用逗号。
- SQL注入时机成熟
- 对性能不利,因为每个查询都不同。
你实际上想要添加参数(AddParameterWithValue)
看到:
INSERT
对这类问题使用参数化查询:
using (SqlConnection connection = new SqlConnection(DBConnection))
{
string name = "John";
int score = 123;
float Accuracy = 20.0f;
SqlCommand command = new SqlCommand("INSERT INTO HighScoreTable(Name, Score, Accuracy) VALUES(@name,@score,@accuracy)", connection);
SqlParameter name= new SqlParameter("@name", name);
name.Value = name;
command.Parameters.Add(name);
.
.
.
command.Connection.Open();
command.ExecuteNonQuery();
}
通过这种方式,您可以添加参数,从而可以避免列的混淆。
因为John是一个字符串,你必须让你的数据库知道通过在John的两边添加'
将...VALUES(" + name + " , "...
改为...VALUES('" + name + "' , "...
如果你只写John而不写',那么数据库会认为你在引用一个列,正如你的错误信息所示:数据库不知道任何关于John
的列。
我怀疑你没有转义。
SqlCommand command = new SqlCommand("INSERT INTO HighScoreTable(Name, Score, Accuracy) VALUES("'" + name + "' , " + score + " , " + Accuracy + ")"
一个更好的方法是使用合适的命令参数:
何时应该"SqlDbType"answers";size"添加SqlCommand Parameters时使用?
只要这样做就可以正常工作
SqlCommand command = new SqlCommand("INSERT INTO
HighScoreTable(Name, Score, Accuracy)
VALUES('" + name + "' , " + score + " , " + Accuracy + ")", connection);
作为名称是字符串值只需用'
装饰它就像这样'" + name + "'
因为在sql server中如果字符串没有用'
装饰它会给你一个错误
现在字符串值转换为以下SQL查询,这是无效的
INSERT INTO
HighScoreTable(Name, Score, Accuracy)
VALUES(John , 123 , 20.0f)
要避免这个错误,可以使用SQLParameter,即参数化查询
首先,我强烈建议您使用另一种方法——参数化查询,越快越好。它将防止SQL注入并使您的生活更轻松,因为您不必每次都考虑格式化SQL查询。一段时间后,想知道所有的引号应该放在哪里真的很乏味,而且在维护期间修改这样的代码是一件很痛苦的事情……
其次,你的SQL转换成这样:SqlCommand command = new SqlCommand("INSERT INTO HighScoreTable(Name, Score, Accuracy) VALUES(John , 10 , ..)", connection);
SQL认为您的值实际上是列名!你需要把你的值用单引号
括起来INSERT INTO HighScoreTable(Name, Score, Accuracy) VALUES('John' , 10 , '..')