Pierwszy program bazodanowy - pomocy!

0

Witam wszystkich programistów. Piszę z prośbą o pomoc ponieważ wziąłem się do pisania programu w C++. Używam środowiska Visual Studio 2013.

Problem dotyczy transakcji. Teoretycznie wszystko działa i dodawane są nowe rekordy jednak są zdublowane.

Proszę pomóżcie i spójrzcie na mój kod poniżej.

MySqlConnection^ PolaczBaze = gcnew MySqlConnection(konfiguracja);
MySqlCommand^ zapytanie = PolaczBaze->CreateCommand();
MySqlTransaction^ transakcja;
PolaczBaze->Open();
transakcja = PolaczBaze->BeginTransaction(IsolationLevel::ReadCommitted);
zapytanie->Connection = PolaczBaze;
zapytanie->Transaction = transakcja;

try{
	zapytanie->CommandText = "INSERT INTO " + zawody + ".grupy (nazwa_grupy, wiek_od, wiek_do, uwagi) VALUES ('" + txtPGNazwaGrupy->Text + "', '" + txtPGWiekOd->Text + "','" + txtPGWiekDo->Text + "','" + txtPGUwagi->Text + "');";
	zapytanie->ExecuteNonQuery();
	transakcja->Commit();

	if (zapytanie->ExecuteNonQuery()){
		MessageBox::Show("Grupa została dodana.", "Wykonano.", MessageBoxButtons::OK, MessageBoxIcon::Information);
	}
	else{
		MessageBox::Show("Wystąpił błąd podczas dodawania grupy.", "UWAGA!", MessageBoxButtons::OK, MessageBoxIcon::Error);
	}
}
catch (Exception^ komunikat){
	MessageBox::Show(komunikat->Message);
	transakcja->Rollback();
}

PolaczBaze->Close();
0

Prawdopodobnie tutaj, w warunku ponownie wysyłasz komendę do bazy SQL: if (zapytanie->ExecuteNonQuery()){
Spróbuj usunąć ten warunek i sprawdź, czy nadal dubluje wpisy.

0

Usunięcie warunku pomogło :) Bardo dziękuję :)

0

Niestety pojawił się kolejny schodek do pokonania :(

Skąd biorą się u mnie błędy typu "attempt to access before calling read()". Zasada działania jest prosta: jeżeli zawodnik jest dodawany do istniejącej rodziny to zwiększamy ilosc czlonkow o 1 natomiast jesli rodzina jeszcze nie istnieje to ja tworzymy. Dodawanie rodzin dziala i zwiekszanie rowniez lecz zawodnikow jak nie bylo tak nie ma. W ogóle bajecznie byłoby gdyby udało się zrobić to na jednej transakcji. Czyli dodajemy rodzine i ponownie sprawdzamy id nowej rodziny. Funkcja sprawdz_rodzine dziala bez zarzutow. Proszę pomóżcie bo zawody blisko a ja w proszku :(
W trakcie prob rozbilem wszystko na osobne transakcje....

String^ plec = "";
String^ rodzina = txtZawodnicyRodzina->Text;
String^ uwagi = "";
String^ dokumenty = "";
int wiek = Convert::ToInt32(lblZawodnicyPokazWiek->Text);
int id_rodziny = sprawdz_rodzine(txtZawodnicyRodzina->Text);
int idgrupy = id_grupy(lblZawodnicyPokazGrupe->Text);

if (txtZawodnicyDokumenty->Text != ""){
	dokumenty = txtZawodnicyDokumenty->Text;
}
else{
	dokumenty = "NIE DOSTARCZONO";
}

if (txtZawodnicyUwagi->Text != ""){
	uwagi = txtZawodnicyDokumenty->Text;
}
else{
	uwagi = "BRAK";
}

if (chbZawodnicyKobieta->Checked){
	plec = "Kobieta";
}
else{
	plec = "Mężczyzna";
}

if (id_rodziny == 0){
	/*DODAWANIE NOWEJ RODZINY*/
	MySqlConnection^ PolaczBaze1 = gcnew MySqlConnection(konfiguracja_sql);
	MySqlCommand^ zapytanie1 = PolaczBaze1->CreateCommand();
	MySqlTransaction^ transakcja1;
	PolaczBaze1->Open();
	transakcja1 = PolaczBaze1->BeginTransaction(IsolationLevel::ReadCommitted);
	zapytanie1->Connection = PolaczBaze1;
	zapytanie1->Transaction = transakcja1;

	try{
		zapytanie1->CommandText = "INSERT INTO familiada_2017.rodziny (nazwa_rodziny, ilosc_czlonkow, punkty) VALUES ('" + txtZawodnicyRodzina->Text + "', 1, 0);";
		zapytanie1->ExecuteNonQuery();

		transakcja1->Commit();

		MessageBox::Show("Dodano rodzinę: " + txtZawodnicyRodzina->Text + ".", "Wykonano.", MessageBoxButtons::OK, MessageBoxIcon::Information);
		
	}
	catch (Exception^ komunikat1){
		MessageBox::Show(komunikat1->Message);
		transakcja1->Rollback();
		MessageBox::Show("Wystąpił błąd podczas dodawania rodziny.", "UWAGA!", MessageBoxButtons::OK, MessageBoxIcon::Error);
	}

	PolaczBaze1->Close();

	id_rodziny = sprawdz_rodzine(txtZawodnicyRodzina->Text);

	/*DODAWANIE ZAWODNIKA DO NOWEJ RODZINY*/
	MySqlConnection^ PolaczBaze1A = gcnew MySqlConnection(konfiguracja_sql);
	MySqlCommand^ zapytanie1A = PolaczBaze1A->CreateCommand();
	MySqlTransaction^ transakcja1A;
	PolaczBaze1A->Open();
	transakcja1A = PolaczBaze1A->BeginTransaction(IsolationLevel::ReadCommitted);
	zapytanie1A->Connection = PolaczBaze1A;
	zapytanie1A->Transaction = transakcja1A;

	try{
		zapytanie1A->CommandText = "INSERT INTO familiada_2017.zawodnicy (imie, nazwisko, plec, data_ur, pokrewienstwo, wiek, szacowany_czas, uwagi, dokumenty, rodzina, grupa) VALUES ('" + txtZawodnicyImie->Text + "', '" + txtZawodnicyNazwisko->Text + "','" + plec + "','" + txtZawodnicyData->Text + "', '" + txtZawodnicyPokrewienstwo->Text + "', '" + wiek + "', '" + txtZawodnicyCzas->Text + "', '" + uwagi + "', '" + dokumenty + "', '" + txtZawodnicyRodzina->Text + "', , '" + idgrupy + "');";
		zapytanie1A->ExecuteNonQuery();

		transakcja1A->Commit();

		MessageBox::Show("Dodano zawodnika: " + txtZawodnicyImie->Text + " " + txtZawodnicyNazwisko->Text + ".", "Wykonano.", MessageBoxButtons::OK, MessageBoxIcon::Information);

	}
	catch (Exception^ komunikat1A){
		MessageBox::Show(komunikat1A->Message);
		transakcja1A->Rollback();
		MessageBox::Show("Wystąpił błąd podczas dodawania zawodnika.", "UWAGA!", MessageBoxButtons::OK, MessageBoxIcon::Error);
	}

	PolaczBaze1A->Close();
}
else{
	/*ZWIEKSZENIE ILOSCI CZLONKOW O 1*/
	MySqlConnection^ PolaczBaze2 = gcnew MySqlConnection(konfiguracja_sql);
	MySqlCommand^ zapytanie2 = PolaczBaze2->CreateCommand();
	MySqlTransaction^ transakcja2;
	PolaczBaze2->Open();
	transakcja2 = PolaczBaze2->BeginTransaction(IsolationLevel::ReadCommitted);
	zapytanie2->Connection = PolaczBaze2;
	zapytanie2->Transaction = transakcja2;

	try{
		zapytanie2->CommandText = "UPDATE familiada_2017.rodziny SET ilosc_czlonkow = ilosc_czlonkow + 1 WHERE nazwa_rodziny = '" + txtZawodnicyRodzina->Text + "';";
		zapytanie2->ExecuteNonQuery();

		transakcja2->Commit();

		MessageBox::Show("Dodano kolejnego zawodnika do rodziny: " + txtZawodnicyRodzina->Text + ".", "Wykonano.", MessageBoxButtons::OK, MessageBoxIcon::Information);
		
	}
	catch (Exception^ komunikat2){
		MessageBox::Show(komunikat2->Message);
		transakcja2->Rollback();
		MessageBox::Show("Wystąpił błąd podczas dodawania zawodnika.", "UWAGA!", MessageBoxButtons::OK, MessageBoxIcon::Error);
	}

	PolaczBaze2->Close();

	
	/*DODANIE ZAWODNIKA DO ISTNIEJACEJ RODZINY*/
	MySqlConnection^ PolaczBaze2A = gcnew MySqlConnection(konfiguracja_sql);
	MySqlCommand^ zapytanie2A = PolaczBaze2A->CreateCommand();
	MySqlTransaction^ transakcja2A;
	PolaczBaze2A->Open();
	transakcja2A = PolaczBaze2A->BeginTransaction(IsolationLevel::ReadCommitted);
	zapytanie2A->Connection = PolaczBaze2A;
	zapytanie2A->Transaction = transakcja2A;

	try{
		zapytanie2A->CommandText = "INSERT INTO familiada_2017.zawodnicy (imie, nazwisko, plec, data_ur, pokrewienstwo, wiek, szacowany_czas, uwagi, dokumenty, rodzina, grupa) VALUES ('" + txtZawodnicyImie->Text + "', '" + txtZawodnicyNazwisko->Text + "','" + plec + "','" + txtZawodnicyData->Text + "', '" + txtZawodnicyPokrewienstwo->Text + "', '" + wiek + "', '" + txtZawodnicyCzas->Text + "', '" + uwagi + "', '" + dokumenty + "', '" + Convert::ToString(id_rodziny) + "', , '" + Convert::ToString(idgrupy) + "');";
		zapytanie2A->ExecuteNonQuery();

		transakcja2A->Commit();

		MessageBox::Show("Dodano zawodnika: " + txtZawodnicyImie->Text + " " + txtZawodnicyNazwisko->Text + ".", "Wykonano.", MessageBoxButtons::OK, MessageBoxIcon::Information);

	}
	catch (Exception^ komunikat2A){
		MessageBox::Show(komunikat2A->Message);
		transakcja2A->Rollback();
		MessageBox::Show("Wystąpił błąd podczas dodawania zawodnika.", "UWAGA!", MessageBoxButtons::OK, MessageBoxIcon::Error);
	}

	PolaczBaze2A->Close();
}

pokaz_siatke("zawodnicy");

1 użytkowników online, w tym zalogowanych: 0, gości: 1