Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/334.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/9.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# SqlCommand错误_C#_Database_Sql Server 2008 - Fatal编程技术网

C# SqlCommand错误

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

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

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

  • 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注入的时机已经成熟
  • 由于每个查询都不同,因此对性能不利
  • 您实际上想要添加参数(AddParameterWithValue)

    请看这里:


    首先,我强烈建议您尽快使用一种不同的方法-参数化查询。它可以防止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提供的值真的不应该用引号括起来。。。。。。