Команда.ВыполнитьНеЗапрос(); Ошибка: неправильный синтаксис рядом с '='

Мой запрос идеален (я проверил его в SQL Server Management Studio). Мой код идеален, но я получаю эту синтаксическую ошибку:

Неверный синтаксис рядом с '='. Описание: во время выполнения текущего веб-запроса возникло необработанное исключение. Пожалуйста, просмотрите трассировку стека для получения дополнительной информации об ошибке и о том, где она возникла в коде. Сведения об исключении: System.Data.SqlClient.SqlException: неправильный синтаксис рядом с '='.

public partial class Temporaryche : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        ddlTDept.Items.Clear();
        ddlTBranch.Items.Clear();

        string connectionString = GlobalVariables.databasePath;
        SqlConnection sqlCon = new SqlConnection(connectionString);
        string query = "select fac.fac_name, dp.dp_name, br.br_name from STUDENT s, DIVISON dv, BRANCH br, DEPT dp, FACULTY fac, CLASS cls, DEGREE dg where dg.dg_id = cls.dg_id and cls.cls_id = s.cls_id and fac.fac_id = dp.fac_id and dp.dp_id = br.dp_id and br.br_id = dv.br_id and s.dv_id = dv.dv_id and s.prn_no = " + txtSearch.Text;

        sqlCon.Open();
        SqlCommand cmd = new SqlCommand(query, sqlCon);
        SqlDataReader reader = cmd.ExecuteReader();

        string facultyName = reader.GetValue(0).ToString();
        string deptName = reader.GetValue(1).ToString();
        string branchName = reader.GetValue(2).ToString();

        ddlTFaculty.SelectedValue = facultyName;

        query = "select dp_name from DEPT where fac_id=(select fac_id where fac_name='" + facultyName + "')";
        cmd = new SqlCommand(query, sqlCon);
        reader = cmd.ExecuteReader();
        ddlTDept.Items.Clear();

        while (reader.Read())
        {
            ddlTDept.Items.Add(reader.GetValue(0).ToString());
        }

        ddlTDept.SelectedValue = deptName;
        sqlCon.Close();
    }
}

person AlexR    schedule 24.10.2015    source источник
comment
И моя ошибка такова: Неправильный синтаксис рядом с '='. Описание: во время выполнения текущего веб-запроса возникло необработанное исключение. Пожалуйста, просмотрите трассировку стека для получения дополнительной информации об ошибке и о том, где она возникла в коде. Сведения об исключении: System.Data.SqlClient.SqlException: неправильный синтаксис рядом с '='.   -  person AlexR    schedule 24.10.2015
comment
Вы должны использовать параметры SQL, а не встраивать имя факультета в запрос SQL. В противном случае вы уязвимы для атак SQL-инъекций. xkcd.com/327   -  person Bryce Wagner    schedule 24.10.2015
comment
Плохие привычки: использование JOIN в старом стиле — старый стиль разделенного запятыми списка таблиц был заменен на правильный синтаксис ANSI JOIN в Стандарт ANSI-92 SQL (более 20 лет назад), и его использование не рекомендуется.   -  person marc_s    schedule 25.10.2015
comment
хм, извините, @marc_s, но не могли бы вы рассказать мне, как ПРИСОЕДИНЯЙТЕСЬ синтексу для этого запроса = выберите fac.fac_name, dp.dp_name, br.br_name from STUDENT s, DIVISON dv, BRANCH br, DEPT dp, FACULTY fac , КЛАСС cls, СТЕПЕНЬ dg, где dg.dg_id = cls.dg_id и cls.cls_id = s.cls_id и fac.fac_id = dp.fac_id и dp.dp_id = br.dp_id и br.br_id = dv.br_id и s.dv_id = dv.dv_id и s.prn_no = + txtSearch.Text;   -  person AlexR    schedule 25.10.2015
comment
Это может быть что-то вроде SELECT ..... FROM Student s INNER JOIN Class cls ON s.cld_id = cls.cls_id .... и так далее — используйте INNER JOIN, LEFT OUTER JOIN и другие типы соединений, определенные в стандарте ANSI SQL, и определите условие соединения прямо здесь, в строке JOIN.   -  person marc_s    schedule 25.10.2015


Ответы (2)


В вашем коде нет ExecuteNonQuery, поэтому единственная точка, где может возникнуть синтаксическая ошибка, находится в этой строке.

query = @"select dp_name from DEPT 
         where fac_id=(select fac_id where fac_name='" + facultyName + "')";

В этой строке вы пропустите FROM в подзапросе, поэтому вы должны написать как

query = @"select dp_name 
          from DEPT 
          where fac_id= (select fac_id 
                         FROM DEPT where fac_name= '" + facultyName + "')";

Конечно, это просто решит вашу непосредственную проблему, но, как уже говорили другие, вы должны немедленно начать использовать параметризованный запрос.

Например

query = @"SELECT dp_name FROM DEPT 
          wHERE fac_id = (SELECT TOP 1 fac_id 
                          FROM DEPT 
                          WHERE fac_name=@faculty";
cmd = new SqlCommand(query, sqlCon);
cmd.Parameters.Add("@faculty", SqlDbType.NVarChar).Value = facultyName;
....

EDIT
Я должен переписать свое первое утверждение. Есть еще один момент, когда может возникнуть синтаксическая ошибка. Он находится в первой строке, если txtSearch.Text пуст.
В этом случае запрос остается незавершенным и вызывает синтаксическую ошибку.
Это может произойти из-за того, что код вызывается в событии Page_Load, когда в событии еще ничего нет. текстовое окно. Поэтому, вероятно, нам следует добавить что-то, чтобы предотвратить выполнение всего блока кода, если txtSearch пусто.

protected void Page_Load(object sender, EventArgs e)
{
    if(!string.IsNullOrWhiteSpace(txtSearch.Text))
    {
        .... code that executes the queries ...
    }
}

В общем, этот код не подходит для события Page_Load, возможно, этот код следует переместить в событие нажатия кнопки, когда пользователь просит выполнить поиск....

Наконец, как упоминалось в комментариях, вы должны использовать синтаксис JOIN, чтобы лучше отделить условие WHERE от отношений между вашими таблицами. Запрос может быть записан как

SELECT  fac.fac_name,
        dp.dp_name,
        br.br_name 
FROM    STUDENT s INNER JOIN DIVISION dv ON s.dv_id = dv.dv_id
        INNER JOIN BRANCH br ON dv.br_id = br.br_id
        INNER JOIN DEPT dp ON br.dp_id = dp.dp_id
        INNER JOIN FACULTY fac ON dp.fac_id = fac.fac_id
        INNER JOIN CLASS cls ON s.cls_id = cls.cls_id
        INNER JOIN DEGREE dg ON cls.dg_id = dg.dg_id
WHERE   s.prn_no=@search";
person Steve    schedule 24.10.2015
comment
Готово, но, пожалуйста, не удаляйте комментарий. Это правильно, и вы должны оставить это, чтобы будущие читатели могли понять эволюцию ответа. - person Steve; 24.10.2015
comment
да, я использовал параметризованную версию запроса, как вы сказали. Фактическое значение для названия факультета - FTE. - person AlexR; 25.10.2015
comment
но показанная ошибка находится в верхней строке запроса, как я пишу выше - person AlexR; 25.10.2015
comment
Если вы попытаетесь выполнить этот запрос в Sql Server Management Studio, вы получите какие-то ошибки? - person Steve; 25.10.2015
comment
нет. вот почему я в замешательстве. в студии управления сервером он показывает мне идеальный ответ, как я хочу. - person AlexR; 25.10.2015
comment
И, конечно же, у вас есть предопределенный текст в этом текстовом поле, верно? Потому что если нет, то у вас есть усеченный запрос, и помните, что событие Page_Load запускается каждый раз, когда у вас есть событие на стороне сервера для выполнения, а не только при первом событии Page_Load. - person Steve; 25.10.2015
comment
хм, да, ты прав, потому что у меня нет предопределенного текста в текстовом поле. - person AlexR; 25.10.2015

Вы не упоминаете строку, в которой возникает ошибка, так сложно быть уверенным на 100%, а также отсутствует какая-то другая информация. Однако в первом тексте SQL в конце есть следующее:

s.prn_no=" + txtSearch.Text;

Поскольку это текст, он должен быть в кавычках ''

s.prn_no='" + txtSearch.Text +"'"

Тем не менее, вы НИКОГДА не должны создавать запросы SQl, подобные этому, из-за SQL Injection. Вместо этого вы должны использовать объекты параметров вместо этого.

person Mark E    schedule 24.10.2015