2009-05-05 7 views

ответ

6

Это зависит от того, как вы строите свои запросы. Полностью можно писать небезопасные запросы с дозвуковыми, если вы не используете параметры.

// Bad example: 

string sql = "delete from Products where ProductName = " + rawUserInput; 
QueryCommand qry = new QueryCommand(sql, Product.Schema.Provider.Name); 
DataService.ExecuteQuery(qry); 

// Should be: 

string sql = "delete from Products where ProductName = @TargetName"; 
QueryCommand qry = new QueryCommand(sql, Product.Schema.Provider.Name); 
qry.AddParamter("@TargetName", rawUserInput, DbType.String); 
DataService.ExecuteQuery(qry); 
+0

Нет, мы не будем использовать прямой SQL, так что я могу предположить, что мы будем в безопасности с SubSonic! – TheVillageIdiot

6

Нет, SubSonic использует параметры для передачи данных в базу данных, это позаботится об этом.

4

Короткий ответ: нет. Если вы используете классы Subsonic Generated или Subsonic.Select, чтобы сгенерировать ваши запросы/update/insert, вам не нужно беспокоиться о том, что SubSonic правильно использует параметры.

Павел указал, однако, что если вы избегаете писать небезопасный SQL, который позволит вам SubSonic. SubSonic не ваша мать, это не остановит вас, это больше похоже на вашего лучшего друга, это скажет вам не, но если вы решите сделать это, это ваше решение.

1

Просто повторно присутствует пример Павла (если FK ограничения)

 string rawUserInput = "Queso Cabrales1"; 
     #region BadExample 
     //string sql = "delete from Products where ProductName = " + rawUserInput; 
     ////QueryCommand objQueryCommand = new QueryCommand(sql, Product.Schema.Provider.Name); 
     ////DataService.ExecuteQuery(objQueryCommand); 
     #endregion BadExample 

     #region BetterExample 
     // Should be: 

     string sql = "update Products set ProductName = @ProductName where ProductName='Queso Cabrales'"; 
     QueryCommand objQueryCommand = new QueryCommand(sql, Northwind.Product.Schema.Provider.Name); 
     objQueryCommand.AddParameter("@ProductName" , rawUserInput, DbType.String); 
     DataService.ExecuteQuery(objQueryCommand); 


     panGvHolder.Controls.Clear(); 

     Query qry = Northwind.Product.CreateQuery(); 
     qry.Columns.AddRange(Northwind.Product.Schema.Columns); 
     qry.WHERE("UnitPrice > 15").AND("UnitsInStock < 20 "); 
     //WHERE("UnitPrice > 15").AND("UnitsInStock < 30 "); 
     #endregion BetterExample 

     #region PresentResultsReplaceResponseWriteWithConsole.WriteLineForConsoleApp 
     using (IDataReader rdr = qry.ExecuteReader()) 
     { 
      Response.Write("<table>"); 
      while (rdr.Read()) 
      { 
       Response.Write("<tr>"); 
       for (int i = 0; i < rdr.FieldCount; i++) 
       { 
        Response.Write("<td>"); 
        Response.Write(rdr[i].ToString() + " "); 
        Response.Write("<td>"); 
       } //eof for 
       Response.Write("</br>"); 
       Response.Write("</tr>"); 
      } 
      Response.Write("<table>"); 
     } 
     #endregion PresentResultsReplaceResponseWriteWithConsole.WriteLineForConsoleApp 

    } //eof method