2014-02-13 5 views
0

У меня есть ключ без ключа (это не моя работа), и я пытаюсь использовать raw sql для вставки строки данных. Я попытался сопоставить хранимую процедуру, но у меня была такая же проблема с датой.Неверный формат даты SQL-строки структуры Entity.

internal bool InsertSession(Guid UserID, DateTime LastActivityDate, string SessionID) 
     { 
      string s = "INSERT INTO aspnet_Custom_UserSessionActivity VALUES (" + "'" + UserID.ToString() + "'" + " ," + LastActivityDate.ToString("yyyy-MM-dd HH:mm:ss") + "," + "'" + SessionID.ToString() + "')"; 

      try 
      { 
       using (ALFDataContext) 
       { 
        ALFDataContext.Database.ExecuteSqlCommand(s); 
        ALFDataContext.SaveChanges(); 
        return true; 
       } 
      } 
      catch (Exception ex) 
      { 
       return false; 
      } 
     } 

Это то, что строка s содержит:

INSERT INTO aspnet_Custom_UserSessionActivity VALUES ('f4da4c0b-d94e-4f9c-84ef-c82fa442bbc1' ,2014-02-04 09:48:43,'wj4gesi3bdqytflifnzyqx2c') 

и это ошибка:

Incorrect syntax near '09'. 

    at System.Data.SqlClient.SqlConnection.OnError(SqlException exception, Boolean breakConnection, Action`1 wrapCloseInAction) 
    at System.Data.SqlClient.SqlInternalConnection.OnError(SqlException exception, Boolean breakConnection, Action`1 wrapCloseInAction) 
    at System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj, Boolean callerHasConnectionLock, Boolean asyncClose) 
    at System.Data.SqlClient.TdsParser.TryRun(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj, Boolean& dataReady) 
    at System.Data.SqlClient.SqlCommand.RunExecuteNonQueryTds(String methodName, Boolean async, Int32 timeout) 
    at System.Data.SqlClient.SqlCommand.InternalExecuteNonQuery(TaskCompletionSource`1 completion, String methodName, Boolean sendToPipe, Int32 timeout, Boolean asyncWrite) 
    at System.Data.SqlClient.SqlCommand.ExecuteNonQuery() 
    at System.Data.Objects.ObjectContext.ExecuteStoreCommand(String commandText, Object[] parameters) 
    at System.Data.Entity.Internal.InternalContext.ExecuteSqlCommand(String sql, Object[] parameters) 
    at System.Data.Entity.Database.ExecuteSqlCommand(String sql, Object[] parameters) 
    at MembershipProvider.DataAccess.Repository.InsertSession(Guid UserID, DateTime LastActivityDate, String SessionID) in c:\Users\nickgowdy\Documents\Visual Studio 2012\Projects\ALF source code\ALF\branches\Nick's Branch\MembershipProvider\DataAccess\Repository.cs:line 149 

Я предполагаю, что мой формат даты неправильно, но я не могу увидеть ошибку ,

У кого-нибудь есть предложения по его устранению?

+0

Ну, вам просто удалось доказать, что ORM не защищают автоматически от [SQL Injection] (http://www.troyhunt.com/2013/07/everything-you-wanted-to-know-about -sql.html)! –

ответ

0

НЕ под любые обстоятельства, использование конкатенации для вставки параметров в запрос!

Создав динамический SQL-запрос, вы только что открыли себя до SQL Injection.

избежать SQL Injection с Entity Framework является чрезвычайно проста:

internal bool InsertSession(Guid UserID, DateTime LastActivityDate, string SessionID) 
{ 
    try 
    { 
     using (ALFDataContext) 
     { 
     string s = "INSERT INTO aspnet_Custom_UserSessionActivity VALUES ({0}, {1}, {2})"; 
     ALFDataContext.Database.ExecuteSqlCommand(s, UserID, LastActivityDate, SessionID); 
     // No need to call SaveChanges here. 
     return true; 
     } 
    } 
    catch (Exception ex) 
    { 
     return false; 
    } 
} 

Метод ExecuteSqlCommand автоматически создаст параметризованный запрос, и заменить {0}, {1} и {2} лексемы в строке с правильными именами параметров ,

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