2013-10-03 3 views
0

В моем приложении окна мне нужно выполнить серию sqlcommands. Нет проблем, если все SQL-команды выполняются успешно, но когда ошибка 2-й или 3-й команды вызывает ошибку, это создает для меня большую проблему, потому что выполняется команда 1, но 2-й и 3-й не выполняются. Здесь я хочу, чтобы все команды выполнялись или ничего. мой код следующим образом:как выполнить серию sqlcommand сразу в C#

SqlCommand cmd = new SqlCommand("CREATE TABLE [dbo].[" + textBox8.Text + "_stock](" 
         + "[date] [date] NOT NULL PRIMARY KEY CLUSTERED," 
         + "[openingstock] [int] NOT NULL," 
         + "[receipt] [int] NOT NULL," 
         + "[totalstock] [int] NOT NULL," 
         + "[sell] [int] NOT NULL," 
         + "[closingstock] [int] NOT NULL," 
         + ") ON [PRIMARY]", connectionsql); 
        cmd.ExecuteNonQuery(); 
        cmd.Dispose();     

        SqlCommand cmd1 = new SqlCommand("insert into " + textBox8.Text + "_stock values(@date,0,0,0,0,0)", connectionsql); 
        cmd1.Parameters.AddWithValue("date", dateTimePicker3.Value); 
        cmd1.ExecuteNonQuery(); 
        cmd1.Dispose(); 
        cmd1.Parameters.Clear(); 

        SqlCommand cmd2 = new SqlCommand("insert into rate values ('" + textBox12.Text + "','" + textBox8.Text + "_stock','" + double.Parse(textBox7.Text) + "','" + comboBox4.SelectedItem + "')", connectionsql); 
        int z = cmd2.ExecuteNonQuery(); 
        cmd2.Dispose(); 
+0

[SQL Injection предупреждение] (http://msdn.microsoft.com/en-us/library/ms161953%28v=sql.105%29.aspx) - вы должны ** не ** объединить ваши SQL-запросы - используйте ** параметризованные запросы **, чтобы избежать SQL-инъекции –

ответ

1

Вы можете использовать transactions, чтобы сделать это.. Я имею в виду что-то вроде:

transaction.BeginTransaction(); 
try{ 
    // your commands here 
    transaction.CommitTransaction(); // commit after all commands 
} catch (Exception){ 
    // if exception, rollback 
    transaction.RollbackTransaction(); 
} 

Для получения дополнительной информации см: http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqltransaction.commit(v=vs.110).aspx

ВАЖНО: Рассмотрите возможность использования parameterized queries избежать SQL Injection.

+0

Я не могу использовать транзакцию, она не отображается в intellisense. какую сборку я должен использовать для этого? –

+0

В ссылке есть полный пример, посмотрите на него. Я думаю, вы можете сделать это на примере. Я обновил ссылку на EN. –

1

Сделки - путь. В вашем случае:

using (SqlConnection connectionsql= new SqlConnection(connectionString)) 
{ 
    connectionsql.Open(); 

    SqlTransaction transaction; 

    // Start a local transaction. 
    transaction = connectionsql.BeginTransaction("SampleTransaction"); 

    SqlCommand cmd = new SqlCommand("CREATE TABLE [dbo].[" + textBox8.Text + "_stock](" 
     + "[date] [date] NOT NULL PRIMARY KEY CLUSTERED," 
     + "[openingstock] [int] NOT NULL," 
     + "[receipt] [int] NOT NULL," 
     + "[totalstock] [int] NOT NULL," 
     + "[sell] [int] NOT NULL," 
     + "[closingstock] [int] NOT NULL," 
     + ") ON [PRIMARY]", connectionsql); 

    if (cmd.ExecuteNonQuery() <1) // no table created 
    { 
     transaction.Rollback(); 
    } 
    else // no error 
    { 
     SqlCommand cmd1 = new SqlCommand("insert into " + textBox8.Text + "_stock values(@date,0,0,0,0,0)", connectionsql); 
     cmd1.Parameters.AddWithValue("date", dateTimePicker3.Value); 

     if (cmd1.ExecuteNonQuery() < 1) // no row inserted 
     { 
      transaction.Rollback(); 
     } 
     else // no error 
     { 
      cmd1.Dispose(); 

      SqlCommand cmd2 = new SqlCommand("insert into rate values ('" + textBox12.Text + "','" + textBox8.Text + "_stock','" + double.Parse(textBox7.Text) + "','" + comboBox4.SelectedItem + "')", connectionsql); 
      int z = cmd2.ExecuteNonQuery(); 

      if (z < 1) // no row inserted 
      { 
       transaction.Rollback(); 
      } 
      else // no error 
      { 
       transaction.Commit(); // everything was OK, you can commit the results 
      }   
      cmd2.Dispose(); 
     } 
     cmd1.Dispose(); 
    } 
    cmd.Dispose(); 
} 
+0

Я использую ваш код, но все еще проблема. Я получаю сообщение об ошибке, которое требует ExecuteNonQuery() после первой команды. Я думаю, потому что транзакционная фиксация, наконец, так, что таблица не создана, поэтому команда II не может заполнить записи в этом. извините, если я ошибаюсь, я не знаю о транзакции. –

+0

Извините, я не понимаю. Если таблица не будет создана, транзакция будет отменена. Каждый шаг должен завершиться, чтобы код продолжался. Как будто вы хотели - все или ничего. Если у вас возникнут какие-либо ошибки, напишите, в какой строке точно и что именно скажет ошибка. –

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