2014-09-04 7 views
0

Я не могу найти ошибку, почему мои данные не были вставлены в базу данных. Я использую сервер sql. DB - 3 поля: 1) id (int) 2) test1 (varchar (50)) 3) test2 (varchar (50)). Я пытаюсь вставить данные из текстового поля и даты.Не удается вставить данные

private void SaveToDB() 
    { 
     string strSql = ""; 
     string[] tos = txtTo.Text.Split(';'); 
     for (int i = 0; i < tos.Length; i++) 
     { 
      strSql += "INSERT INTO test (test1, test2) VALUES ('" + txtContent.Text.Trim() + "','" + DateTime.Now.ToString() + "');"; 
     } 
     using (SqlConnection connection = new SqlConnection(Common.ConnetionString)) 
     { 
      connection.Open(); 
      SqlTransaction tran = connection.BeginTransaction(); 
      try 
      { 
       SqlCommand cmd = new SqlCommand(strSql, connection, tran); 
       cmd.ExecuteNonQuery(); 
       tran.Commit(); 
      } 
      catch (Exception e) 
      { 
       tran.Rollback(); 
      } 
      finally 
      { 
       connection.Close(); 
       Response.Redirect("messagelist.aspx?flag=2"); 
      } 
     } 
    } 

Но как я должен изменить код, что параметр работы в цикле

+0

Обратите внимание, что этот код подходит для [SQL Injection] (http://en.wikipedia.org/wiki/SQL_injection). Вместо этого используйте ORM, например [Entity Framework] (http://msdn.microsoft.com/en-us/data/ef.aspx), что также, вероятно, поможет исправить вашу проблему. –

+0

Чтобы решить вашу конкретную проблему, можете ли вы отправить фактический SQL, отправляемый в базу данных после замены всех переменных? –

+0

Кроме того, я подозреваю, что вы получаете исключение. Это действительно плохая практика, чтобы поймать и проглотить исключения, как вы это делаете. После 'tran.Rollback();' call 'throw;'. Это может показать проблему. –

ответ

1

Ваш цикл, вероятно, следует охватить весь блок. Кроме того, параметризуйте свой запрос, чтобы вы не были широко открыты для инъекций. Просто предложение, но я бы также использовал BEGIN TRANSACTION в вашем заявлении sql, противоположном SqlTransaction tran, он обработает откат для вас и немного очистит ваш код.

string[] tos = txtTo.Text.Split(';'); 
for (int i = 0; i < tos.Length; i++) 
{ 
    string strSql = "INSERT INTO test (test1, test2) VALUES (@Content, @DateTime);"; 
    using (SqlConnection connection = new SqlConnection(Common.ConnetionString)) 
    { 
     connection.Open(); 
     SqlTransaction tran = connection.BeginTransaction(); 
     try 
     { 
      using (SqlCommand cmd = new SqlCommand(strSql, connection, tran)) 
      { 
       cmd.Parameters.AddWithValue("@Content", txtContent.Text.Trim()); 
       cmd.Parameters.AddWithValue("@DateTime", DateTime.Now.ToString()); 
       cmd.ExecuteNonQuery(); 
       tran.Commit(); 
      } 
     } 
     catch (Exception e) 
     { 
      tran.Rollback(); 
     } 
     finally 
     { 
      connection.Close(); 
      Response.Redirect("messagelist.aspx?flag=2"); 
     } 
    } 
} 
Смежные вопросы