-1

目前我正在尝试使用我通过 C# 程序硬编码的 3 个值填充我的 SQL Server 数据库。

我的数据库有 4 列,如下所示:

  • RowID(这应该由我的数据库自动更新)
  • Name(存储为字符串)
  • Score(整数)
  • Accuracy(漂浮)

在我的代码中,我尝试使用以下代码行填写这些内容:

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

声明“约翰”不是有效的列。

我做错了什么吗?

4

7 回答 7

2

(仅在我看来)正确的方法是:

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

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

于 2013-04-10T09:24:23.720 回答
1

这里大错特错。

  1. 如果你想像这样插入,你需要在你的值周围添加“'”。
  2. 您需要在值之间使用逗号。
  3. 这对于 SQL 注入来说已经成熟了
  4. 对性能不利,因为每个查询都不同。

您实际上想要添加参数 (AddParameterWithValue)

看这里:

INSERT 上的 SQL 注入

于 2013-04-10T09:23:09.897 回答
1

对此类问题使用参数化查询:

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

通过这种方式,您可以添加参数,以避免列的混淆。

于 2013-04-10T09:24:55.880 回答
0

由于 John 是一个字符串,因此您必须通过在 John 的任一侧添加 ' 来让您的数据库知道这一点。

所以...VALUES(" + name + " , "...改为...VALUES('" + name + "' , "...

如果你只写 John 没有 ' 在任何一边,那么数据库会认为你是指一个列,并且正如你的错误消息显示的那样:数据库对名为 的列一无所知John

于 2013-04-10T09:20:42.730 回答
0

只是这样做才能正常工作

SqlCommand command = new SqlCommand("INSERT INTO 
      HighScoreTable(Name, Score, Accuracy) 
               VALUES('"  + name + "' , " + score + " , " + Accuracy + ")", connection);

因为名称是字符串值,所以只需'像这样装饰它,'" + name + "'因为在 sql server 中,如果字符串没有用它装饰,'则会给你一个错误

现在字符串值被转换为以下 sql 查询 shich 无效

      INSERT INTO 
      HighScoreTable(Name, Score, Accuracy) 
               VALUES(John , 123 , 20.0f)

为避免此错误,请使用 SQLParameter 即参数化查询

于 2013-04-10T09:20:50.987 回答
0

我怀疑你没有逃脱文本。

SqlCommand command = new SqlCommand("INSERT INTO HighScoreTable(Name, Score, Accuracy) VALUES("'" + name + "' , " + score + " , " + Accuracy + ")"

更好的方法是使用正确的命令参数:

添加 SqlCommand 参数时应该何时使用“SqlDbType”和“size”?

于 2013-04-10T09:22:19.953 回答
0

首先,我强烈建议您采用不同的方法 - 参数化查询,尽快。它将防止 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 , '..')
于 2013-04-10T09:23:20.310 回答