2015-01-02 3 views
1

Я пытаюсь создать окно поиска в своем приложении, для этого мне нужно изменить SqlDataSource.SelectCommand. Буду признателен за любую помощь!Изменить SqlDataSource.SelectCommand с помощью хранимой процедуры с параметрами

Для тестирования я сделал это так, он работает, но она уязвима для SQL инъекций

SqlDataSource1.SelectCommand = "sp_offer_search '" + txtSearch.Text + "', " + Session["customerId"] + " , '" + "Pending"+ "'"; 
    GridView1.DataBind(); 

Это то, что я пытался до сих пор, но он не работает:

if (txtSearch.Text != "") 
     {     
     //open connection 
      oCn.Open(); 
      SqlCommand com = new SqlCommand(query, oCn); 
      com.CommandType = CommandType.StoredProcedure; 

      com.Parameters.AddWithValue("@Variable", txtSearch.Text); 
      com.Parameters.AddWithValue("@CustomerId",Session["customerId"]); 
      com.Parameters.AddWithValue("@Status", txtStatus.Text); 


      DataTable dt = new DataTable(); 
      dt.Load(com.ExecuteReader()); 

      SqlDataSource1.SelectCommand = dt.ToString(); 
      GridView1.DataBind(); 
     } 
+0

Как это работает? Получаете ли вы ошибку или неверные данные, или ничего не возвращали? Что-то другое? –

+0

ничего не возвращает, похоже, что он не нашел соответствия – Carlos

+1

Вы должны проверить [Можем ли мы остановить использование AddWithValue() уже?] (Http://blogs.msmvps.com/jcoehoorn/blog/2014/ 05/12/can-we-stop-using-addwithvalue-уже /) и прекратить использование '.AddWithValue()' - это может привести к неожиданным и неожиданным результатам ... –

ответ

0

Решено! Вот что я пробовал и работает. Надеюсь, это может помочь кому-то.

if (txtSearch.Text != "") 
     { 
      try 
      { 
       // open connection 
       oCn.Open(); 

       SqlDataAdapter da = new SqlDataAdapter("sp_offer_search", oCn); 

       da.SelectCommand.CommandType = CommandType.StoredProcedure; 
       da.SelectCommand.Parameters.Add("@Variable", SqlDbType.VarChar).Value = txtSearch.Text; 
       da.SelectCommand.Parameters.Add("@CustomerId", SqlDbType.Int).Value = Session["customerId"]; 
       da.SelectCommand.Parameters.Add("@Status", SqlDbType.VarChar).Value = "Pending"; 

       DataTable dt = new DataTable(); 
       da.Fill(dt); 
       GridView1.DataSourceID = String.Empty; 
       GridView1.DataSource = dt; 
       GridView1.DataBind(); 

      } 
      catch(Exception ex) 
      { 
       Response.Write(ex.ToString()); 
      } 
      finally 
      { 
       oCn.Close(); 
      } 

     } 
     else 
     { 
      GridView1.DataSourceID = "SqlDataSource1"; 
      SqlDataSource1.SelectCommand = SqlDataSource1.SelectCommand; 
      GridView1.DataBind(); 
     } 
4

Если Источник данных GridView установлен в SqlDataSource1, тогда вам не нужен DataTable. И DataTable.ToString() не является selectCommand. Попытка:

if (txtSearch.Text != "") 
    {       
     SqlCommand com = new SqlCommand(query, oCn); 
     com.CommandType = CommandType.StoredProcedure; 

     com.Parameters.AddWithValue("@Variable", txtSearch.Text); 
     com.Parameters.AddWithValue("@CustomerId",Session["customerId"]); 
     com.Parameters.AddWithValue("@Status", txtStatus.Text); 

     SqlDataSource1.SelectCommand = com; 
     GridView1.DataBind(); 
    } 
+0

Привет Crowcoder, «com» ​​возвращает System.Data.SqlClient.SqlCommand и вызывает ошибку: «System.Data.SqlClient.SqlCommand» не поддерживается в этой версии SQL Server какие-либо идеи? – Carlos

+0

Что для вас значит быть? – Crowcoder

+0

Мы используем SQL Azure – Carlos

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