2014-01-15 2 views
2

Это страница за код, где есть ошибкиНеправильный синтаксис около «»

if (Session["username"] != null) 
    { 


     SqlConnection con = new SqlConnection(); 
     con.ConnectionString = ConfigurationManager.ConnectionStrings["registerCS"].ConnectionString; 

     string sql1 = "Select pemgrp from Profile where userID = '" + Session["username"].ToString() + "'"; 
     string sql = "Select studname from Profile where pemgrp = '" + sql1 + "'"; 

     SqlCommand cmd = new SqlCommand(); 
     SqlDataReader dr; 

     DataTable dt = new DataTable(); 

     cmd.CommandText = sql; 
     cmd.Connection = con; 

     //open connection and execute command 
     con.Open(); 
     dr = cmd.ExecuteReader(); 

     if (dr.Read()) 
     { 
     lb_classmates.Text = dr[0].ToString(); 

     } 
    } 

Однако, когда я бегу, он дает мне эту ошибку: Неправильный синтаксис около ключевого слова «где».

Описание: Необработанное исключение произошло во время выполнения текущего веб-запроса. Просмотрите трассировку стека для получения более информации об ошибке и ее месте в коде.

Сведения об исключении: System.Data.SqlClient.SqlException: Неправильный синтаксис рядом с ключевым словом 'where'.

+0

Является ли 'userID'' '' int'? Если это так, не заверните его в апострофы. Но вы должны использовать sql-параметры для предотвращения SQL-инъекций и других проблем в любом случае. –

+0

@TimSchmelter usersID - это строка. – user3021598

+0

его плохая практика, используйте параметры для userId andpemgrp ..он решит многие проблемы. – dotNETbeginner

ответ

8

Как вы используете подзапрос поэтому этот

string sql = "Select studname from Profile where pemgrp = '" + sql1 + "'"; 

должен быть

string sql = "Select studname from Profile where pemgrp in (" + sql1+ ")"; 

и вы должны использовать Parametereized queries, чтобы избежать SQL injection.

+0

+1 для параметризованных запросов. *ИСПОЛЬЗУЙ ИХ*! –

1

Я думаю, что это должно быть

string sql = "Select studname from Profile where pemgrp in (" + sql1+ ")"; 

вместо

string sql = "Select studname from Profile where pemgrp = '" + sql1 + "'"; 

Я настоятельно рекомендую вам использовать parametereized запросов

+1

Downvoter, atleast comment – Satpal

0

Вы должны использовать параметризированное что-то запрос llike этой

string sql = "Select studname from Profile where pemgrp = @p1"; 

и передать параметр

command.Parameters.AddWithValue("@p1",sql1); 
0

No One's answer, конечно, прав.

Если вы хотите использовать подзапрос в запросе, вы должны использовать IN (Transact-SQL)

Определяет, совпадает ли заданное значение любое значение в подзапроса или список.

test_expression [ NOT ] IN 
(subquery | expression [ ,...n ] 
) 

Кроме того, вы всегда должны использовать parameterized queries. Этот тип конкатенаций строк открыт для атак SQL Injection.

Также рассмотрите возможность использования using для размещения вашего SqlConnection.

using (SqlConnection connection = new SqlConnection(ConfigurationManager.ConnectionStrings["registerCS"].ConnectionString)) 
{ 
    connection.Open(); 
    string sql1 = "Select pemgrp from Profile where userID = @username"; 
    string sql = "Select studname from Profile where pemgrp IN (" + sql1 + ")"; 
    SqlCommand command = new SqlCommand(sql, connection); 
    command.Parameters.AddWithValue("@username", Session["username"].ToString()); 
    SqlDataReader reader = command.ExecuteReader(); 
    while (reader.Read()) 
    { 
     // 
    } 
} 
Смежные вопросы