Грешка при SQL връзка - C#

Имам известен проблем при свързването към моя 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 executenonquery изисква отворена и достъпна връзка. текущото състояние на връзката е затворено

Благодаря предварително


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 се предава в SqlCommand ctor   -  person Alex K.    schedule 21.12.2015
comment
@AlexK. - Ах Добре...изглежда, че този път съм заспал зад волана.   -  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