Springen naar inhoud


- - - - -

SqlDataAdapter.Update() Delete functie werkt niet


  • Log in a.u.b. om te beantwoorden
Er zijn 7 reacties in dit onderwerp

#1 Eviltwin

Eviltwin

    Professional Developer

  • Leden
  • PipPipPipPip
  • 299 berichten
    Laatst bezocht 09 mei 2014 15:22
  • LocatieKampen, Nederland

Geplaatst op 22 augustus 2011 - 14:42

Hallo allemaal,

Ik ben tijdje weg geweest door de vakantie, maar ik mag weer verder met mijn stage  :D

Op de eerste dag loop ik gelijk al tegen het volgende probleem aan:

Ik kan maak gebruik van een dataSet en een SqlDataAdapter.
Door deze combinatie zou ik in theorie alle wijzigingen die ik in de dataset doorvoer ook gelijk in mijn dataBase terug zien.

Dit werkt allemaal leuk alleen niet bij mijn Delete functies.  :D

Ik heb al gekeken of ik de juiste rechten heb, maar dit blijkt niet het probleem te zijn aangezien ik wel met de volgende code rows kan verwijderen(ik weet het geen parameters is onveilig, maar dit is een test opstelling):

Code:
		try
		 {
			 // Open the connection
			 conn.Open();

			 // prepare command string
			 string deleteString = @"
				  DELETE FROM mprog_set
				  WHERE print_id = 172";

			 // 1. Instantiate a new command
			 SqlCommand cmd = new SqlCommand();

			 // 2. Set the CommandText property
			 cmd.CommandText = deleteString;

			 // 3. Set the Connection property
			 cmd.Connection = conn;

			 // 4. Call ExecuteNonQuery to send command
			 cmd.ExecuteNonQuery();
		 }
		 finally
		 {
			 // Close the connection
			 if (conn != null)
			 {
				 conn.Close();
			 }
		 } 



De code die ik gebruik voor de data adapter: ( is allemaal een beetje gestript om het overzichterlijk te houden, maar volgens mij staat al het nodige er in):

Code:

				DataTable dt_mprog_set;
				private SqlDataAdapter a_mprog_set = null;
				public DataSet local_db = new DataSet();

				public DataTable mprog_set
				{
					  get { return dt_mprog_set; }
				}


////////Volgende staat samen met de database verbinding in de constructor van de classe. Hierin worden alle datatabellen geladen en toegevoegd aan de dataset////////////////

				a_mprog_set = new SqlDataAdapter("SELECT * FROM mprog_set", conn);
				a_mprog_set.Fill(local_db, "mprog_set");
				a_mprog_set.RowUpdated += new SqlRowUpdatedEventHandler(a_mprog_set_RowUpdated);
				SqlCommandBuilder cmdB_m = new SqlCommandBuilder(a_mprog_set);
				a_mprog_set.InsertCommand = cmdB_m.GetInsertCommand();
				a_mprog_set.DeleteCommand = cmdB_m.GetDeleteCommand();
				a_mprog_set.UpdateCommand = cmdB_m.GetUpdateCommand();

				dt_mprog_set = local_db.Tables["mprog_set"];
//////einde constructor gedeelte////////////

		public bool save_mprog()
		{

			try
			{
				// Open de connectie
				conn.Open();

				// Sla de DataRow op. Dit vuurt het event OnRowUpdated af
				a_mprog_set.Update(mprog_set);

				// We zijn hier, alles okay!
				return true;
			}

			catch (Exception ex)
			{
				Console.WriteLine(ex.ToString());
			}
			finally
			{
				// Altijd netjes sluiten
				conn.Close();
			}
			return true;
		}


		void a_mprog_set_RowUpdated(object sender, SqlRowUpdatedEventArgs e)
		{
			// Het (zojuist verkregen?) ID is alleen interessant bij een nieuwe record
			if (e.StatementType == StatementType.Insert)
			{
				// Bepaal het zojuist verkregen ID
				SqlCommand command = new SqlCommand("SELECT @@IDENTITY", conn);

				// Bepaal de nieuwe ID en sla deze op in het juiste veld
				object nieuweID = command.ExecuteScalar();

				Console.WriteLine("Nieuwe ID in row update: " + nieuweID.ToString());

				// Bij evt. fouten geen ID --> Daarom testen
				if (nieuweID == System.DBNull.Value == false)
				{
					// Zet de ID in de juiste kolom in de DataRow
					nieuw_id = Convert.ToInt32(nieuweID);
				}
			}
		}



Aanroepen van de code doe ik als volgt:

Code:
	  DataRow[] mprogDR = Data.mprog_set.Select("print_id = " + Data.print_id);
	  Data.mprog_set.Rows.Remove(mprogDR[0]);
	  Data.save_mprog();



EDIT..... Volgende ben ik vergeten te vermelden, maar is toch van wezelijk belang.
Het item wordt wel in de dataset verwijderd, maar niet in de DB. Door tijdens het debuggen met de dataviewer de dataset bekijken laat zien dat het item uit de dataset is, maar als ik het programma opnieuw opstart en de data opnieuw ophaal uit de DB dan staat het item er weer.


Hopelijk kunnen jullie me weer verder helpen, alvast bedankt...

Groeten,

Eviltwin

#2 Hypenate

Hypenate

    Guru Developer

  • Leden
  • PipPipPipPipPipPip
  • 1228 berichten
    Laatst bezocht 15 mei 2019 21:27
Inzender

Geplaatst op 22 augustus 2011 - 14:51

Visual Basic Code:
DELETE * FROM mprog_set
				  WHERE print_id = 172"; 

Gokje?

#3 Eviltwin

Eviltwin

    Professional Developer

  • Leden
  • PipPipPipPip
  • 299 berichten
    Laatst bezocht 09 mei 2014 15:22
  • LocatieKampen, Nederland

Geplaatst op 22 augustus 2011 - 14:58

Hallo Hypenate,

Bedankt voor je inzet, maar dit is niet het probleem.
Op deze wijze had ik even getest of ik wel de juiste rechten heb en het werkt.

Trouwens ..... het sterretje (*) ben ik ook gewend van PHP, maar als ik dat hier toepas dan krijg ik een syntax fout.

Greetingz,

Eviltwin

#4 SilentBob

SilentBob

    Professional Developer

  • Leden
  • PipPipPipPip
  • 360 berichten
    Laatst bezocht
  • LocatieHome

Geplaatst op 22 augustus 2011 - 15:14

Je kan eens proberen door (in je 3de voorbeeld code blok)Code:
Data.mprog_set.Rows.Remove(mprogDR[0]); 
te vervangen doorCode:
	  foreach( DataRow row in mprogDR ) {
		row.Delete( );
	  }


#5 Eviltwin

Eviltwin

    Professional Developer

  • Leden
  • PipPipPipPip
  • 299 berichten
    Laatst bezocht 09 mei 2014 15:22
  • LocatieKampen, Nederland

Geplaatst op 22 augustus 2011 - 16:06

Bedankt SilentBob,

Je hebt (alweer) gelijk  :D.

Zou je ook kunnen uitleggen waarom de foreach nodig is?

Ik weet dat er maximaal één row terug komt. Daarom leek het mij logischer om een vaste index mee tegeven  :D

Groeten,

Eviltwin

#6 SilentBob

SilentBob

    Professional Developer

  • Leden
  • PipPipPipPip
  • 360 berichten
    Laatst bezocht
  • LocatieHome

Geplaatst op 22 augustus 2011 - 16:29

Rows is een Collection (object) van rijen die in de datatable zitten. De Remove method gaat de rij verwijderen uit de collectie, maar niet de RowState aanpassen. De Delete method doet dit wel.
We hebben een array van rijen, daarom een foreach.Code:
DataRow[] mprogDR = Data.mprog_set.Select("print_id = " + Data.print_id); 
Je zou ook het volgende kunnen doenCode:
if( mprogDR.Length == 1 ) {
  mprogDR[0].Delete( );
}	  
Of alles op 1 lijnCode:
Data.mprog_set.Select("print_id = " + Data.print_id)[0].Delete();
Wat je zelf het makkleijkst vindt  :D

#7 Eviltwin

Eviltwin

    Professional Developer

  • Leden
  • PipPipPipPip
  • 299 berichten
    Laatst bezocht 09 mei 2014 15:22
  • LocatieKampen, Nederland

Geplaatst op 22 augustus 2011 - 16:45

Bedankt, ik denk dat het nu wel redelijk duidelijk is.  :D

#8 Eviltwin

Eviltwin

    Professional Developer

  • Leden
  • PipPipPipPip
  • 299 berichten
    Laatst bezocht 09 mei 2014 15:22
  • LocatieKampen, Nederland

Geplaatst op 24 augustus 2011 - 16:57

Ik heb weer een vraag,

Tijdens het maken van een nieuw item krijg ik van de DB het ID terug.
Het ID zet ik vervolgens in de zojuist aangemaakte dataRow in de datatable (printen). Volgens mij is de data nu in de DB en de Datatable gelijk en is het niet nodig om nogmaals te updaten.

ik gebruik de volgende code om een item aan te maken:

Code:
				DataRow printRow = Data.printen.NewRow();

				printRow["naam"] = txt_printnaam.Text;
				printRow["klant"] = txt_klantnaam.Text;
				printRow["mprog"] = chk_mprog.Checked;
				printRow["bootloader"] = chk_bootloader.Checked;
				printRow["sw_versie"] = txt_versie.Text;
				if (txt_pad.Text != String.Empty)
				{
					printRow["thumb"] = ReadImageToBytes(txt_pad.Text);
				}

				Data.printen.Rows.Add(printRow);
				Data.save_print();

				//nieuwe ID in de row binnen de dataset plaatsen.
				printRow["print_id"] = Data.nieuw_id;
				Data.print_id = Data.nieuw_id;
				Data.save_print();


Waarom moet ik na het wegschrijven van het nieuwe ID naar de dataTable de volgende nogmaals code aanroepen:

Data.save_print();

Roep ik de code geen tweede keer aan dan krijg ik de volgende fout melding:

Citeren

System.Data.DBConcurrencyException: Concurrency violation: the DeleteCommand affected 0 of the expected 1 records.


Code in save_print is overigens het zelfde als save_mprog hier boven.



Groeten,

Eviltwin




0 gebruiker(s) lezen dit onderwerp

0 lid(leden), 0 bezoeker(s), 0 anonieme gebruikers

Inloggen


Untitled 1

Met dank aan Jürgen voor de jarenlange inzet van visualbasic.be (anno dec 2000)
Met dank aan Mike en Ronneke voor de jarenlange inzet van vbib.be (anno dec 2010)
Met dank aan PascalBianca voor de jarenlange inzet van vbib.be (anno dec 2016)