2016-06-02 2 views
0

C# код:Ошибка в GridView пытается показать данные только для текущего пользователя

string str = "Data Source=(LocalDB)\\MSSQLLocalDB;"; 
str += "AttachDbFilename=|DataDirectory|DinoData.mdf;"; 
str += "Integrated Security= True"; 

SqlConnection c; 
c = new SqlConnection(str); 

if (Show.Text == "all" || Show.Text == "All" || Show.Text == "all table" || Show.Text == "All table" || Show.Text == "All Table" || string.IsNullOrWhiteSpace(Show.Text)) 
{ 
    DataTable dt = new DataTable(); 

    String req; 
    req = "SELECT * FROM [User] Where Username = "+Session["CurentUserid"]; 

    SqlDataAdapter da = new SqlDataAdapter(req, c); 
    da.Fill(dt); 

    datagrid.DataSource = dt; 
    datagrid.DataBind(); 
} 
else 
{ 
    if (!string.IsNullOrWhiteSpace(Show.Text)) 
    { 
     DataTable dt = new DataTable(); 

     String req; 
     req = Show.Text+ " Where Username = " + Session["CurentUserid"]; 

     SqlDataAdapter da = new SqlDataAdapter(req, c); 
     da.Fill(dt); 

     datagrid.DataSource = dt; 
     datagrid.DataBind(); 
    } 
} 

Ошибка:

An exception of type 'System.Data.SqlClient.SqlException' occurred in System.Data.dll but was not handled in user code

Additional information: Invalid column name 'Niss'.

Пожалуйста, помогите, Niss это идентификатор одного из моих пользователей

+0

где происходящая эта ошибка? Кстати вы можете изменить все свои условия в первом 'if' до' Show.Text.ToLower(). Содержит («все») ' – techspider

+0

Я уверен, что имя пользователя, хранящееся в переменной сеанса, является Niss, правильно? – Steve

ответ

1

Это классическая ошибка, вызванная не использованием параметризованного запроса. Вы забыли поставить значение имени пользователя между одиночными кавычками, поэтому ваш пользователь Нисс путали как имя столбца

req = "SELECT * FROM [User] Where Username = @user"; 
SqlDataAdapter da = new SqlDataAdapter(req, c); 
da.SelectCommand.Parameters.Add("@user", SqlDbType.NVarChar).Value = Session["CurentUserid"]; 
da.Fill(dt); 

Более углублено: UserName представляет собой текстовый столбец и, таким образом, если вы хотите найти значение этого столбца вам нужно установить значение между одинарными кавычками.
Однако решение данной проблемы, добавив пару цитат

Where Username = '"+Session["CurentUserid"] + "'" 

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

Я оставляю обсуждение Sql инъекций и все проблемы, вы можете столкнуться в своем коде в остальном части (где вы используете все текстовое поле, чтобы построить свой запрос this well known answer

+3

Хорошо, чтобы помочь , но я думаю, что вы находитесь на опасном пути. Другая часть и использование Show.Text - очень большой риск для безопасности. Прочтите ответы, размещенные по ссылке выше. – Steve