C# SqlCommand错误
目前,我正试图用3个值填充我的SQL Server数据库,我正在通过C#程序硬编码 我的数据库有4列,如下所示:C# SqlCommand错误,c#,database,sql-server-2008,C#,Database,Sql Server 2008,目前,我正试图用3个值填充我的SQL Server数据库,我正在通过C#程序硬编码 我的数据库有4列,如下所示: RowID(这应该由我的数据库自动更新) 名称(存储为字符串) 分数(整数) 精度(浮动) 在我的代码中,我试图用以下代码行来填写这些内容: using (SqlConnection connection = new SqlConnection(DBConnection)) { string name = "John"; int
(这应该由我的数据库自动更新)RowID
(存储为字符串)名称
(整数)分数
(浮动)精度
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();
}
但当我运行程序时,VisualStudio会突出显示
command.ExecuteNonQuery()
声明“John”不是有效的列
这有什么问题吗?由于John是一个字符串,您必须通过在John的两侧添加“来让数据库知道这一点 因此,将
…值(“+name+”,“…
更改为…值(“+name+”,“…
如果您只写John而两边都没有,那么数据库会认为您引用了一个列,并且正如您的错误消息所显示的:数据库对名为
John
的列一无所知,只需执行此操作即可正常工作
SqlCommand command = new SqlCommand("INSERT INTO
HighScoreTable(Name, Score, Accuracy)
VALUES('" + name + "' , " + score + " , " + Accuracy + ")", connection);
因为名称是字符串值,所以只需像这样用“+name+”
来修饰它,因为在sql server中,如果字符串不是用“
来修饰,它将给您一个错误
现在字符串值get convert to following sql query shich无效
INSERT INTO
HighScoreTable(Name, Score, Accuracy)
VALUES(John , 123 , 20.0f)
为避免此错误,请使用SQLParameter,即prameterize查询我怀疑您没有跳过文本
SqlCommand command = new SqlCommand("INSERT INTO HighScoreTable(Name, Score, Accuracy) VALUES("'" + name + "' , " + score + " , " + Accuracy + ")"
更好的方法是使用适当的命令参数:
这里有很多错误
首先,我强烈建议您尽快使用一种不同的方法-参数化查询。它可以防止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 , '..')
正确的方法(仅以我的观点)是:
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();
}
}
请注意,在使用参数化查询时,您不必介意单引号!!字符串参数不包含在单引号中-这一切都是由框架为您完成的。对此类问题使用参数化查询:
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();
}
通过这种方式,您可以添加参数,从而避免列的混淆。如果您花10秒钟搜索StackOverflow以查找任何相关问题,您应该已经读过的一件事是:为了理智起见,使用参数化查询!!!这对您有用吗?/1)不完全正确。如果值是字符串,则需要将值包含在单引号中。数字可以不带单引号使用。同意。但这里的主要问题是不使用参数,因此这是一个没有实际意义的观点。@ThorstenDittmar-我刚刚指出了他的代码的错误之处(从SQL Server的角度).我从不鼓励向数据库发送连接字符串,但我想我也可以在我的回答中指出;)你编写它的方式非常冗余。您可以使用
AddWithValue
。另外,您正在使用的SqlParameter
构造函数已经设置了参数的值,因此不需要行name.value=…
。@ThorstenDittmar是的,最近我开始编写参数化查询,在此之前我编写的查询与poster编写的相同。我看到了你的答案,对我来说很有教育意义。Thanx.但是Score
是一个INT
-所以你为Score提供的值真的不应该用引号括起来。。。。。。