2012-05-30 11 views
0

У меня есть WebService со следующим методом:C# SQLCommand не работают

[ScriptMethod(ResponseFormat = ResponseFormat.Json)] 
    [WebMethod] 
    public string Login(string passwort, string email, string firma) 
    { 
     return LoginHelper.Login(passwort, email, firma); 
    } 

Моего LoginHelper код:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Web; 
using System.Data; 
using System.Data.SqlClient; 

namespace WebService1 
{ 
    public class LoginHelper 
    { 
     public static string Login(string passwort, string email, string firma) 
     { 
      string userName = ""; 

      SqlConnection con = new SqlConnection(@"Data Source=Yeah-PC\SQLEXPRESS;Initial Catalog=works;Integrated Security=true;"); 

     SqlCommand cmd = new SqlCommand(@"SELECT firma FROM TestData 
            WHERE email = @email", con); 
     cmd.Parameters.AddWithValue("@email", email); 

     con.Open(); 

     SqlDataReader dr = cmd.ExecuteReader(); 
       while (dr.Read()) 
     { 
    //userName += dr["email"].ToString(); 
    //userName += dr["passwort"].ToString(); 
    userName += dr["firma"].ToString(); 
    } 
    dr.Close(); 
    con.Close(); 
    return userName; 
     } 



    } 
} 

Спасибо за это помощью Guys

Я отредактированный мои вопросы. Защищено ли это решение? Я имею в виду против SQL-инъекции. Есть ли что-то еще, что я могу сделать лучше?

+5

Первое, что вы делаете неправильно, это объединение строк SQL. Вместо этого вы должны использовать параметры запроса. – David

+1

Для этого вы должны использовать параметризованный SQL; ваш код, написанный в настоящее время, уязвим для атаки SQL-инъекций. Я бы сделал это изменение первым; есть шанс, что проблема исчезнет, ​​когда вы это сделаете. –

+2

Вы также не можете поместить свои SqlConnection, SqlCommand и SqlDataReader в блоки 'using', и вы используете веб-службы ASMX, когда вы должны использовать WCF, если у вас нет выбора. –

ответ

6

вы звоните LoginHelper.Login(passwort, email, firma);

но в методе

public static string Login(string email, string passwort, string firma)

электронной почты является параметром кулак.

фактически в параметре электронной почты у вас есть пароль, поэтому она не возвращает какой-либо результат

изменить метод login в LoginHelper ниже

public static string Login(string passwort, string email, string firma) 
{ 
    string userName = ""; 

    using (SqlConnection con = new SqlConnection(@"Data Source=Yeah-PC\SQLEXPRESS;Initial Catalog=works;Integrated Security=true;")) 
    using(SqlCommand cmd = new SqlCommand(@"SELECT firma FROM TestData WHERE email = @email", con)) 
    { 
     cmd.Parameters.AddWithValue("@email", email); 
     con.Open(); 
     using (SqlDataReader rdr = cmd.ExecuteReader()) 
     { 
      while (rdr.Read()) 
      { 
       if (rdr["firma"] != DBNull.Value) 
       { 
        userName += rdr["firma"].ToString(); 
       } 

      } 
     } 
    } 

    return userName; 
} 
+0

Thx, который был «одним» из моих проблем :) – Bashud

+0

@Bashud обновил мой ответ с помощью «использования» операторов, sql-параметров, нулевых проверок и т. Д. Надеюсь, что это вам поможет .. – Damith

+0

Большое вам спасибо, что очень помогло мне! ! – Bashud

0

За другой ответ & комментарии.

У вас есть проблема безопасности, если вы не собираетесь использовать ORM (Entity Framework /NHibernate/и т.д ...), пожалуйста, используйте параметризованные запросы

Решая проблему:

  • Это данные в вашей базе данных?
  • Вы указываете на правильную базу данных?
  • Является ли ваш SQL правильным?
  • Выполняется ли запуск SQL?
  • Run SQL Profiler и посмотреть, что SQL получает пробег, затем проверить, что в вашем SQL Management Studio
1

Кроме того, по соображениям безопасности и производительности, вы должны использовать SqlParameters. Читайте об атаках SQL Injection.

string userName = ""; 

SqlConnection con = new SqlConnection(@"Data Source=Yeah-PC\SQLEXPRESS;Initial Catalog=works;Integrated Security=true;"); 

SqlCommand cmd = new SqlCommand(@"SELECT firma FROM TestData 
            WHERE email = @email" con); 
cmd.Parameters.AddWithValue("@email", email); 

con.Open(); 

SqlDataReader dr = cmd.ExecuteReader(); 
while (dr.Read()) 
{ 
    //userName += dr["email"].ToString(); 
    //userName += dr["passwort"].ToString(); 
    userName += dr["firma"].ToString(); 
} 
dr.Close(); 
con.Close(); 
return userName; 
+0

Спасибо, я попробую ваше решение – Bashud

+0

Thx для этого решения. я узнал что-то – Bashud

0

Вместо передачи параметра в коде попробуйте использовать параметр Sqlparameter для добавления параметра. Рекомендуется использовать параметр SQL для добавления параметров. Вы также можете проверить значение электронной почты путем отладки .... если вы передаете правильную информацию.

 SqlConnection conn = new SqlConnection(connectionString); 
     conn.Open(); 
     SqlCommand cmd = new SqlCommand(@"SELECT firma FROM TestData 
           WHERE email = @email" conn); 
     cmd.Parameters.AddWithValue("@email", email);      
     cmd.Prepare(); 
     cmd.ExecuteNonQuery(); 
     SqlDataReader dr = cmd.ExecuteReader(); 
     while (dr.Read()) 
      {     
       userName += dr["firma"].ToString(); 

      } 
     dr.Close(); 
     conn.Close(); 
+0

Спасибо, я попробую ваше решение – Bashud

+0

информация iam pass правильная, я уже проверил это. Damith выложил решение – Bashud

+0

Так что у меня есть возможность решить ур que или по-прежнему сталкиваться с тем же – Chets

3

Если ваш адрес электронной почты содержит символ @, который может быть ваша проблема. @ - маркер параметров для SQLCommand. Думается, что последняя часть вашего адреса электронной почты является параметром sql. Вам нужно будет передать адрес электронной почты с помощью параметра. Это также защищает вас от SQL-инъекций. Ответ Акатэкритоса имеет пример того, как передать электронное письмо в качестве prameter.

Смежные вопросы