Ошибка исключения C # при выполнении запроса SQL Server - PullRequest
0 голосов
/ 01 июня 2019

Я создаю простое библиотечное приложение.Я использую 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;
        }

Все "this." являются параметрами в классе "Title".

Все параметры имеют тип: string, кроме "DateOfRelease", который имеет тип: int

[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' "

1 Ответ

2 голосов
/ 01 июня 2019

В этом ответе есть большое предостережение; Я не c # кодер, поэтому я не проверял это. Я очень редко подхожу к C #, и только когда делаю это, потому что я помогаю нашим разработчикам в работе с их требованиями к SQL Server (так как я являюсь разработчиком DBA / SQL). Что я сделал, хотя? Я использовал документацию ( Свойство SqlCommand.Parameters & SqlDbType Enum ), чтобы написать правильно параметризованный запрос, который должен работать (я добавил комментарий о том, почему я верю ваш запрос также не удался):

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();  
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...