Avatar billede raven_ Nybegynder
25. oktober 2004 - 19:47 Der er 6 kommentarer og
1 løsning

Delete rækker i en tabel med relationer

Hej derude.

Jeg har nogle problemer med at slette rækker i en tabel, der består af en sammensatnøgle.

Tabellen er som følger:
<ArrKategori>
- FK: Kategori
- FK: ArrangementID

eks:
Dans  - 2
Musik  - 1
Teater - 3

Det jeg gerne vil er f.eks. at slette række hvor ArrangementID= 2 og 1.

---------------- Jeg har følgende kode------------
DbConnection Conn = new DbConnection();

            OleDbConnection myConn        = Conn.getConnection();           
            myConn.Open();
                           
            string    SqlQuery    = "SELECT * FROM ArrKategori";
                       
            // DataAdapters for operations
            OleDbDataAdapter MyDataAdapter                = new OleDbDataAdapter(SqlQuery, myConn);
                           
            // CommandBuilders to build Sql commands
            OleDbCommandBuilder CommandBuilder            = new OleDbCommandBuilder(MyDataAdapter);

            // DataSet contains data from Arrangor
            DataSet MyDataSet = new DataSet();               

            // Fill DataSets
            MyDataAdapter.Fill(MyDataSet, "ArrKategori");   

            DataTable MyDataTable    = MyDataSet.Tables["ArrKategori"];
            MyDataTable.PrimaryKey    = new DataColumn[] {MyDataTable.Columns["Kategori"]};

            // New ArrayList
            ArrayList MyArrayList = new ArrayList();
            MyArrayList = GetArrangementID(ArrangorID);

            IEnumerator MyEnumerator = MyArrayList.GetEnumerator();
           
            while(MyEnumerator.MoveNext())
            {
!!!!!!!!-----> Fejl her, melder: Object reference not set to an instance of an object.
                DataRow Row = MyDataTable.Rows.Find(MyEnumerator.Current);
                Row.Delete();
!!!!!!!!<-----

            }

            MyDataAdapter.Update(MyDataSet, "ArrKategori");
            myConn.Close();

----------------------------------------------------------

Er der nogen, der kan se fejlen?
Avatar billede snepnet Nybegynder
25. oktober 2004 - 20:28 #1
hejsan :o)

umiddelbart ser det lidt underligt ud, at du tilføjer "kategori" som primær nøgle på tabellen, og derefter prøver at finde en række udfra en værdi i et array du har hentet med en metoder der hedder GetArrangementID(...) (man forestiller sig lidt at der skulle komme arragementid's tilbage på den).

men bortset fra det - så skulle din kode være god nok (så vidt jeg lige kan se).

mit bedste gæt er - at du henter de gale id's til dit array, og at du derfor får en null-reference på det row du laver i loopet.

jeg kan ikke lige så hvordan nedenstående skulle give dig en null-reference ud fra den kode du har sendt.
DataRow Row = MyDataTable.Rows.Find(MyEnumerator.Current);
men den efterfølgende
Row.Delete() vil kunne gøre det.

mvh
Avatar billede raven_ Nybegynder
25. oktober 2004 - 21:28 #2
Jeg har selv rodet i det med primærnøglen for nøglen er en sammensatnøgle, bestående af Kategori og ArrangementID, men hvordan får jeg sat det som nøgle?

Jeg søger på ArrangementID da jeg ønsker, at slette rækker såsom:
Dans  - 1
Musik - 1
Sport - 1
Musik - 2
Sport - 2

Jeg har test med numeriske værdier for at test om det var forkerte værdier som metoden GetArrangementID returnerede, det gav samme resultat
Avatar billede snepnet Nybegynder
26. oktober 2004 - 00:13 #3
I det koder her :

DataRow Row = MyDataTable.Rows.Find(MyEnumerator.Current);
Row.Delete(); <--- Row skulle være det eneste der kan være null i det du har sendt.

så..... på en eller anden måde laver du en .Find(key) der returnerer null... altså MyEnumerator.Current antager en værdi som ikke findes som nøgle i nogle af dine rækker.

så hvis du starter med at forsøge med en nøgleværdi du ved forefindes i din tabel, så skulle koden ikke fejle... sådan lidt som dette :

DataSet ds1 = new DataSet();
adapter.Fill(ds1, "SomeTable");
DataTable dt = ds1.Tables["SomeTable"];

ds1.Tables[0].PrimaryKey = new DataColumn[] {ds1.Tables[0].Columns[0]};

ArrayList ar = new ArrayList();
ar.Add(<kendt id>);

IEnumerator MyEnumerator = ar.GetEnumerator();
MyEnumerator.MoveNext();
DataRow Row = MyDataTable.Rows.Find(MyEnumerator.Current);
Row.Delete();

Skulle det gå fint.

jeg kender ikke dine data, eller den metode der sætter din arraylist, så det kan jeg ikke rigtig byde ind på, men den nøgle du angiver på tabellen selv - er den eneste du har, så det er den du skal ramme.

mvh
Avatar billede raven_ Nybegynder
26. oktober 2004 - 16:05 #4
Det virker fint, det som du nævner.
Hvordan sætter man 2 felter til at være PrimaryKey, da det er en sammensatnøgle ?
Avatar billede raven_ Nybegynder
26. oktober 2004 - 16:56 #5
Nå, gav op og gjorde det via en god gammel sql delete statement.

Men jeg vil gerne sige tak til snepnet for tiden og til andre der kiggede på det.

Mange tak
Mvh Raven_
Avatar billede snepnet Nybegynder
26. oktober 2004 - 17:55 #6
jamen velbekomme....
du kan godt have flere kolonner som key... det er jo et array du giver den :
ds1.Tables[0].PrimaryKey = new DataColumn[] {ds1.Tables[0].Columns[0]};
der ville du så kunne :
ds1.Tables[0].PrimaryKey = new DataColumn[] {ds1.Tables[0].Columns[0],ds1.Tables[0].Columns[0]};

og du kan også efterfølgende søge på dem :
(nedenstående er stort set bare copy fra docs)

private void FindInMultiPKey(DataTable myTable){
    DataRow foundRow;
    // Create an array for the key values to find.
    object[]findTheseVals = new object[3];
    // Set the values of the keys to find.
    findTheseVals[0] = "John";
    findTheseVals[1] = "Smith";
    findTheseVals[2] = "5 Main St.";
    foundRow = myTable.Rows.Find(findTheseVals);
    // Display column 1 of the found row.
    if(foundRow != null)
      // tjah... så har du dem så her i foundRow
}

mvh
Avatar billede snepnet Nybegynder
26. oktober 2004 - 17:56 #7
(jeg smider lige et svar hvis du kunne bruge det til noget).
mvh
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester