2015-07-16 4 views
-3

Я хочу получить одну часть данных из таблицы SQL Server с помощью C# из ASP.NET. Я объясняю свой код ниже.Извлечь данные из SQL Server с помощью C# asp.net

public DataTable ValidateUserDetail(string emailid) 
{ 
    SqlConnection con = new SqlConnection(CmVar.convar); 

    try 
    { 
     con.Open(); 
     DataTable dt = new DataTable(); 

     string sql = "SELECT User_PWD from T_User_Master WHERE User_Email_ID= ' " + emailid+ "'"; 

     SqlCommand cmd = new SqlCommand(sql, con); 
     SqlDataAdapter objadp = new SqlDataAdapter(cmd); 
     objadp.Fill(dt); 
     con.Close(); 

     if(dt.rows.count > 0) 
     { 
      // I need password here. 
     } 
    } 
    catch(Exception e) 
    { 
     throw e; 
    } 
} 

Здесь мне нужно получить пароль пользователя после извлечения из таблицы.

+1

[SQL Injection предупреждение] (http://msdn.microsoft.com/en-us/library/ms161953%28v=sql.105%29.aspx) - вы должны ** не ** сцепить вместе ваши SQL-запросы - используйте ** параметризованные запросы **, чтобы избежать SQL-инъекций. Кроме того, *** ПОЖАЛУЙСТА *** скажите мне, что вы *** НЕ *** сохраняете пароли своего пользователя ** в виде обычного текста ** в своей базе данных !! Это *** ОСНОВНАЯ *** безопасность NO NO .... –

ответ

0

доступа в первой строке, а значение столбца:

dt.Rows.First()["User_PWD"] 
+0

Нет, она показывает ошибку. Я думаю, что пространство имен error.I добавил 'system.Data', но все же ошибка – satya

+0

Сначала может потребоваться System.linq или System.Linq.Data. Какую ошибку вы получаете? –

+0

Не используйте 'First()'. используйте индекс 0 или цикл. потому что он сделал сборку 'System.Linq.Data.' –

0

Добавьте этот код в блоке if

string password = dt.rows[0]["name"].ToString(); 

Datatable возвращает количество rows.0 используется для выбора первой строки.

2

Попробуйте это:

string User_PWD = dt.Rows[0][0].ToString(); 

Также вам следует использовать параметр, чтобы избежать Sql Injection так:

string sql = "SELECT User_PWD from T_User_Master WHERE User_Email_ID = @id"; 
SqlCommand cmd = new SqlCommand(sql, con); 
cmd.Parameters.AddWithValue("@id", emailid); 
+0

Единственный ответ до сих пор, который адресован [Exploits Of A Mom] (http://xkcd.com/327/). – Filburt

3

Похоже, вам просто нужно использовать ExecuteScalar вместо SqlDataAdapter, так как вы вероятно получить один строка с одним значением столбца с вашим запросом.

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

Не используйте свои пароли как обычный текст. Пожалуйста, прочитайте: Best way to store password in database

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

using(var con = new SqlConnection(CmVar.convar)) 
using(var cmd = con.CreateCommand()) 
{ 
    cmd.CommandText = "SELECT User_PWD from T_User_Master WHERE User_Email_ID = @id"; 
    cmd.Parameters.Add("@id", SqlDbType.Int).Value = emailid; 
    // I assumed your User_Email_ID column is int. 
    con.Open(); 
    string password = (string)cmd.ExecuteScalar(); 
} 
+1

'ExecuteScalar' - лучшее решение для получения значения одного столбца: +1 –

0

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

Вы можете получить пароль, как показано ниже.

общественных DataTable ValidateUserDetail (строка EMAILID) { SqlConnection кон = новый SqlConnection (CmVar.convar); try { con.Open(); DataTable dt = new DataTable(); string sql = "SELECT User_PWD от T_User_Master WHERE User_Email_ID = '" + emailid + "'"; SqlCommand cmd = новый SqlCommand (sql, con); SqlDataAdapter objadp = новый SqlDataAdapter (cmd); objadp.Fill (dt); con.Close();

  if (dt.rows.count > 0) 
      { 
       string pwd = dt.Rows[0]["User_PWD"].ToString();// I need password here. 
      } 
     } 
     catch (Exception e) 
     { 
      throw e; 
     } 
    } 
Смежные вопросы