Ошибка при подключении SQL - С#

У меня возникли проблемы с подключением к моему SQL-серверу в моем приложении C#. У меня есть код, который может вставлять или обновлять таблицу моей базы данных. Если я обновляю таблицу, все идет правильно, но если я ее вставляю, я получаю ошибку.

Вот код:

int ID;
conn = new SqlConnection(@"Data Source = SERVER\SQLEXPRESS; Initial Catalog = SQLFiat; User ID = sa; Password = secret");
conn.Open();            

if (cbCarros.SelectedIndex >= 0)
{
    ID = cbCarros.SelectedIndex + 1;
    cmd = new SqlCommand("UPDATE Carros SET ID_Carro=@ID_Carro,Nome=@Nome,Modelo=@Modelo,Combustivel=@Combustivel,Cambio=@Cambio,Portas=@Portas WHERE ID_Carro=@ID_Carro", conn);
    cmd.Parameters.AddWithValue("@ID_Carro", ID);
    cmd.Parameters.AddWithValue("@Nome", tbNome.Text);
    cmd.Parameters.AddWithValue("@Modelo", tbModelo.Text);
    cmd.Parameters.AddWithValue("@Combustivel", cbCombustivel.SelectedItem.ToString());
    cmd.Parameters.AddWithValue("@Cambio", cbCambio.SelectedItem.ToString());
    cmd.Parameters.AddWithValue("@Portas", Int32.Parse(tbPortas.Text));
    cmd.ExecuteNonQuery();
    cmd.Dispose();

    cmd = new SqlCommand("UPDATE Rel_Carro_Apertadeira SET ID_Carro=@ID_Carro,ID_Aper=@ID_Aper WHERE ID_Carro=@ID_Carro", conn);
    cmd.Parameters.AddWithValue("@ID_Carro", ID);
    int ID_Aper = cbApertadeiras.SelectedIndex + 1;
    cmd.Parameters.AddWithValue("@ID_Aper", ID_Aper);
    cmd.ExecuteNonQuery();                
}
else
{
    ID = retornaMaiorID() + 1;               
    cmd = new SqlCommand("INSERT INTO Carros (ID_Carro,Nome,Modelo,Combustivel,Cambio,Portas) Values (@ID_Carro,@Nome,@Modelo,@Combustivel,@Cambio,@Portas)", conn);
    cmd.Parameters.AddWithValue("@ID_Carro", ID);
    cmd.Parameters.AddWithValue("@Nome", tbNome.Text);
    cmd.Parameters.AddWithValue("@Modelo", tbModelo.Text);
    cmd.Parameters.AddWithValue("@Combustivel", cbCombustivel.SelectedItem.ToString());
    cmd.Parameters.AddWithValue("@Cambio", cbCambio.SelectedItem.ToString());
    cmd.Parameters.AddWithValue("@Portas", Int32.Parse(tbPortas.Text));
    cmd.ExecuteNonQuery();
    cmd.Dispose();

    cmd = new SqlCommand("INSERT INTO Rel_Carro_Apertadeira (ID_Carro,ID_Aper) Values (@ID_Carro,@ID_Aper)", conn);
    cmd.Parameters.AddWithValue("@ID_Carro", ID);
    int ID_Aper = cbApertadeiras.SelectedIndex + 1;
    cmd.Parameters.AddWithValue("@ID_Aper", ID_Aper);
    cmd.ExecuteNonQuery();
}

Ошибка:

Произошло необработанное исключение типа «System.InvalidOperationException» в System.Data.dll. Для выполнения nonquery требуется открытое и доступное соединение. текущее состояние соединения закрыто

заранее спасибо


person Ludson Farah    schedule 21.12.2015    source источник
comment
Спасибо за использование параметризованных запросов.   -  person ChaosPandion    schedule 21.12.2015
comment
Помимо рассматриваемой проблемы, вам нужно взглянуть на эту статью. blogs.msmvps.com /jcoehoorn/blog/2014/05/12/ Я бы рекомендовал использовать хранимые процедуры вместо передачи через sql, что лучше по ряду причин, включая проблемы с AddWithValue.   -  person Sean Lange    schedule 21.12.2015
comment
Как совет, не размещайте учетные данные нигде в Интернете по очевидным соображениям безопасности.   -  person Rober    schedule 21.12.2015
comment
Вы не назначаете открытое соединение команде перед выполнением запроса.   -  person user2366842    schedule 21.12.2015
comment
@ user2366842: Тогда почему обновление работает?   -  person B. Clay Shannon    schedule 21.12.2015
comment
@user2366842 user2366842 передано в SqlCommand ctor   -  person Alex K.    schedule 21.12.2015
comment
@АлексК. - Ах. Верно... похоже, на этот раз я спал за рулем.   -  person user2366842    schedule 22.12.2015


Ответы (1)


У меня проблема, в моей функции retornaMaiorID() я закрывал соединение. Извините, что беспокою вас.

Спасибо

person Ludson Farah    schedule 21.12.2015
comment
Хороший урок программирования, совместное использование соединений может привести к проблемам, поэтому будьте осторожны. - person ChaosPandion; 21.12.2015
comment
Функция пула класса соединений позаботится об этом за вас, не делитесь соединениями, используйте их и избавляйтесь от них, за кулисами позаботится об управлении соединениями за вас. - person Ron Beyer; 21.12.2015