Aplikacja bazodanowa problem z SQL.

0

Niestety pojawił się kolejny schodek do pokonania podczas tworzenia pierwszej aplikacji bazodanowej :(

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. Rodziny dodają sie dobazy oraz aktualizuje sie ilość członków.

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");

0

Generalnie wyobrażam sobie taką postać kodu jak poniżej lecz efekt działania jest identyczny. Czyli w/w błąd. Jedynym plusem jest to, że rodziny nie są dodawane jeżeli zawodnik nie został dodany. Czyli chyba transakcja działa. Proszę pomóżcie.

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{
		if (id_rodziny == 0){
			zapytanie1->CommandText = "INSERT INTO familiada_2017.rodziny (nazwa_rodziny, ilosc_czlonkow, punkty) VALUES ('" + txtZawodnicyRodzina->Text + "', 1, 0);";
			zapytanie1->ExecuteNonQuery();
			MessageBox::Show("Dodano rodzinę: " + txtZawodnicyRodzina->Text + ".", "Wykonano.", MessageBoxButtons::OK, MessageBoxIcon::Information);

			id_rodziny = sprawdz_rodzine(txtZawodnicyRodzina->Text);

			zapytanie1->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 + "');";
			zapytanie1->ExecuteNonQuery();

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

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

			zapytanie1->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) + "');";
			zapytanie1->ExecuteNonQuery();
			MessageBox::Show("Dodano zawodnika: " + txtZawodnicyImie->Text + " " + txtZawodnicyNazwisko->Text + ".", "Wykonano.", MessageBoxButtons::OK, MessageBoxIcon::Information);
		}


		transakcja1->Commit();

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

	PolaczBaze1->Close();




pokaz_siatke("zawodnicy");

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