2016-06-02 4 views
1

Escape (' ) symbol in Textbox for asp.net c#Лучший способ отладки параметризованный запрос в C#

Основываясь на вопрос в посте выше, большинство людей предположили, что «параметризованных запросов» является лучшим решением, чтобы избежать SQL-инъекции.

Ниже мой код с помощью SQL-инъекции

public DataSet checkemp(string user) 
{ 
    strsql = "SELECT * from employee where employeeid = @userid"; 
    SqlConnection con = new SqlConnection(connectionString); 
    SqlDataAdapter da = new SqlDataAdapter(strsql, connectionString); 
    da.SelectCommand.Parameters.Add("@userid", SqlDbType.VarChar, 50).Value = user;  
    // pretend the user name is "Micheal" 
    con.Open(); 
    DataSet ds = new DataSet(); 
    da.Fill(ds); 
    con.Close(); 
    con.Dispose(); 
    return ds; 
} 

Во время отладки, я могу получить только запрос «SELECT * от сотрудника, где EmployeeID = @userid», если я указываю на «strsql» ярлык, но не «SELECT * от сотрудника, где EmployeeID =„Мичил“

Любое решение предложил решить этот вопрос и сделать его наиболее эффективность спасибо всем

+0

Простой ответ: нет возможности просмотреть команду как «SELECT» от сотрудника, где employeeid = «Micheal'.', удерживая« strsql ». –

+0

Вы также можете использовать профилировщик для просмотра фактического оператора sql выполненный в базе данных – Yogi

+0

, если вы хотите проверить запрос, почему бы вам не сделать это на SQL-сервере? – woodykiddy

ответ

0

Попробуйте MiniProfiler:.?!

"ADO.NET профайлер, способный профилирование вызовы на сырой ADO.NET"

http://miniprofiler.com/

public DataSet checkemp(string user) 
{ 
    strsql = "SELECT * from employee where employeeid = @userid"; 
    SqlConnection con = GetOpenConnection(connectionString); 
    SqlDataAdapter da = new SqlDataAdapter(strsql, connectionString); 
    da.SelectCommand.Parameters.Add("@userid", SqlDbType.VarChar, 50).Value = user;  
    // pretend the user name is "Micheal" 
    con.Open(); 
    DataSet ds = new DataSet(); 
    da.Fill(ds); 
    con.Close(); 
    con.Dispose(); 
    return ds; 
} 

public static DbConnection GetOpenConnection(string connectionString) 
{ 
    var cnn = new SqlConnection(connectionString); 
    // wrap the connection with a profiling connection that tracks timings 
    return new StackExchange.Profiling.Data.ProfiledDbConnection(cnn, MiniProfiler.Current); 
} 

** Вы, возможно, потребуется, чтобы обернуть SqlCommand с ProfiledDbCommand

0

Я бы ввести метод расширения (хотя это необязательно, фактическая логика важнее), которая возвращает анализируемый запрос, как показано ниже, и вызывает это только во время debug:

public void TestMethod() 
{ 
    string cmdStr = "<some sql command text>"; 
    SqlConnection con = new SqlConnection(connectionString); 
    SqlCommand cmd = new SqlCommand(cmdStr, con); 
    cmd.Parameters.AddWithValue("<param1>", <value1>); // add parameter in any way you want 
#if DEBUG 
    string parsedQuery = cmd.GetParsedQuery(); 
    Console.WriteLine(parsedQuery); // or whatever 
#endif 
    SqlDataAdapter da = new SqlDataAdapter(cmd); 
    con.Open(); 
    DataSet ds = new DataSet(); 
    da.Fill(ds); 
    con.Close(); 
    con.Dispose(); 
    return ds; 
} 

public static string GetParsedQuery(this SqlCommand cmd) 
{ 
    if(cmd.CommandType == CommandType.Text) 
    { 
     string parsedQuery = cmd.CommandText; 
     foreach(var p in cmd.Parameters) 
     { 
      parsedQuery = parsedQuery.Replace(p.ParameterName, Convert.ToString(p.Value)); 
     } 

     return parsedQuery; 
    } 

    return null; 
} 

Обратите внимание, что, хотя у меня есть непосредственно написанный метод расширения (для краткости), он действительно должен быть определен в отдельном статическом классе.