Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/23.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# 运行SQL Server查询时发生C异常错误_C#_Sql Server - Fatal编程技术网

C# 运行SQL Server查询时发生C异常错误

C# 运行SQL Server查询时发生C异常错误,c#,sql-server,C#,Sql Server,我正在构建简单的库应用程序。我正在使用C和SQL Server 2017 当运行一个函数来检查这本书是否已经存在时,我在名字附近发现了一个错误 public bool DoesItExist() { mainSet mset = new mainSet(); string query = "SELECT * FROM [Library].[dbo].[ViewBook] WHERE " +

我正在构建简单的库应用程序。我正在使用C和SQL Server 2017

当运行一个函数来检查这本书是否已经存在时,我在名字附近发现了一个错误

        public bool DoesItExist()
        {
            mainSet mset = new mainSet();
            string query = "SELECT * FROM [Library].[dbo].[ViewBook] WHERE " +
                "Title = '" + this.title + "' AND " +
                "DateOfFirstRelease = " + this.release_date + " AND " +
                "Name = '" + this.author_name + "' AND " +
                "2Name= '" + this.author_2name + "' AND " +
                "Surname = '" + this.author_surname + "' AND " +
                "Category = '" + this.category + "' AND " +
                "Publishing = '" + this.Publishing+ "' ";

            SqlConnection cnn = new SqlConnection(mset.dataBaseConect);
            SqlCommand cmd = new SqlCommand(query, cnn);
            cnn.Open();
            SqlDataReader reader = cmd.ExecuteReader();  

            if (reader.HasRows) return true;
            else return false;
        }
所有这些。是标题类中的参数

除DateOfRelease类型为:int外,所有参数的类型均为:string

[ViewBook]是[Library]数据库中的一个视图

我得到的错误是:

System.Data.SqlClient.SqlException: 

An expression of non-boolean type specified in a context where a condition is expected, near 'Name'.”
cmd查询的示例:

"SELECT * FROM [Library].[dbo].[ViewBook] WHERE Title = 'Book Name' AND DateOfFirstRelease = 2004 AND Name = 'George' AND 2Name= '' AND Surname = 'Martin' AND Category = 'Economy' AND Publishing = 'PublishingTest' "
这个答案有一个很大的警告;我不是c程序员,所以我没有测试过这个。我很少接近C,只有当我这样做的时候,因为我是一名DBA/SQL开发人员,所以我在帮助我们的开发人员满足他们的SQL Server需求。但是我做了什么?我使用了文档&为了编写一个正确的参数化查询,我添加了一条注释,解释为什么我认为您的查询也失败了:

string query = "SELECT * FROM Library.dbo.ViewBook" + 
                " WHERE Title = @Title" + 
                " AND DateOfFirstRelease = @ReleaseDate" + 
                " AND [Name] = @AuthorName" + //Name is a keyword, so I prefer to quote it
                " AND [2Name] = @AuthorName2" + //Quoted as a column that begins with a number needs to be delimit identified
                " AND Surname = @Surname" + 
                " AND Category = @Category" + 
                " AND Publishing = @Publishing;";

    using (SqlConnection cnn = new SqlConnection(mset.dataBaseConect))
    {
        SqlCommand cmd = new SqlCommand(query, cnn);

        cmd.Parameters.Add("@Title",SqlDbType,VarChar,50); //Guessed datatype
        cmd.Parameters["@Title"].Value = this.title;

        cmd.Parameters.Add("@ReleaseDate",SqlDbType.Date); //Guessed datatype
        cmd.Parameters["@ReleaseDate"].Value = this.release_date;

        cmd.Parameters.Add("@AuthorName",SqlDbType.VarChar,50); //Guessed datatype
        cmd.Parameters["@AuthorName"].Value = this.author_name;

        cmd.Parameters.Add("@AuthorName2",SqlDbType.VarChar,50); //Guessed datatype
        cmd.Parameters["@AuthorName2"].Value = this.author_2name;

        cmd.Parameters.Add("@Surname",SqlDbType.VarChar,50); //Guessed datatype
        cmd.Parameters["@Surname"].Value = this.author_surname;

        cmd.Parameters.Add("@Category",SqlDbType.VarChar,50); //Guessed datatype
        cmd.Parameters["@Category"].Value = this.category;

        cmd.Parameters.Add("@Publishing",SqlDbType.VarChar,50); //Guessed datatype
        cmd.Parameters["@Publishing"].Value = this.Publishing;

        cnn.Open();
        SqlDataReader reader = cmd.ExecuteReader();  
    }

不要注入你的值,参数化它们!SQL注入不是你的朋友。我真的同意@Larnu!请使用参数。添加它们的方法可以在学校项目中看到。。我明白这怎么能给你不这么做的理由。然而,如果你做了这么糟糕的事情,那总是错的。如果这成为一种习惯,你将面临巨大的问题。最好总是做得至少是好的!我知道。这只是一个简单的学校项目,所以不要因为那种态度而烦恼,那样会让你的成绩很差,如果你继续在工作场所使用它,会有很多麻烦。现在就学习如何做事,不要偷懒。参数化是答案的一部分。我刚刚注意到@Steve。我更习惯于使用T-SQL来构建动态语句和使用NCHAR13+NCHAR10:忘记名称上的[]。添加它们之后,所有这些都可以工作。谢谢但是你把你的问题参数化了吗,@DonSlipo?@DonSlipo那么你完全忽略了我回答的全部要点。。。现在停止犯这些错误,解决真正的问题。