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'不是一个有效的列。

我做错了什么吗?

SqlCommand error

我认为唯一正确的方法是:

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();
    }
}

请注意,当使用参数化查询时,不需要注意单引号 !!字符串参数不是用单引号括起来的——这一切都是框架为你完成的。

这里有很多错误

  1. 如果你想这样插入,你需要在周围添加"'"你的价值观。
  2. 您需要在值之间使用逗号。
  3. SQL注入时机成熟
  4. 对性能不利,因为每个查询都不同。

你实际上想要添加参数(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 , '..')