[ASP.NET C#] DataSet wegschrijven naar DB*

Pagina: 1
Acties:

  • BDT
  • Registratie: December 2001
  • Laatst online: 23-10-2023
Hallo,

IK heb hetvolgende probleem: Ik heb een XML bestand die ik inlees door middel van een XSD. De XML lees ik in met ReadXml in een dataset.

De inhoud van de dataset wil ik dan in mijn database zetten. De database is uiteraard identiek aan de XSD.

Ik heb 4 tabellen met relaties tussen hen.

produkten -> eigenschappen --> subeigenschappen --> extra

Mijn code voor het wegschrijven van records uit 1 tabel is deze :

foreach (DataRow pRow in ds.Tables["Products"].Rows)
{
SqlDataAdapter da = new SqlDataAdapter("Insert_Products", connectionString);
da.SelectCommand.CommandType = CommandType.StoredProcedure;
da.SelectCommand.Parameters.Add("@ProdName", pRow["ProdName"]);
}

De bedoeling is om het geheel met nested loops te maken, maar deze stored procedure wordt niet aangeroepem(ik heb het gechecked met SQL profiler)
De connectionstring is ook prima.

Wat doe ik hier fout en hoe moet ik het oplossen?

Sega till I die!


  • mulder
  • Registratie: Augustus 2001
  • Laatst online: 22:17

mulder

ik spuug op het trottoir

zeg... komt ie wel in die loop dan?

oogjes open, snaveltjes dicht


  • tijn
  • Registratie: Februari 2000
  • Laatst online: 31-07 00:06
Als je op bovenstaande wijze door je rows van de dataset loopt heb je geen data adapter nodig. Alleen een SQLCommand object volstaat. Zie de SDK documentatie hoe je dit zou moeten oplossen.

Maar aangezien je met een dataset werkt kun je ook nog proberen om de dataset in 1 keer naar de database te gooien. Ik weet alleen niet of dat zo maar lukt met een dataset waarin 4 datatables voorkomen. Als er 1 datatable inzit kan het in ieder geval wel. Je hebt dan een SQLDataAdapter nodig die je de hele dataset in 1 keer kunt laten opslaan via de Update() method. Wel moet je dan van te voren al de Insert en UpdateCommands instellen (incl. de definitie van de parameters). De data adapter zoekt aan de hand van je primary key informatie uit de dataset zelf wel uit of hij gaat inserten of updaten.

*leest terug*
Hum ik hoop dat het verhaal enigszins duidelijk is en dat je er iets verder mee komt.

Cuyahoga .NET website framework


  • whoami
  • Registratie: December 2000
  • Laatst online: 19:34
Waarom zet je de creatie van die data-adapter in de foreach?
Waarom geef je een INSERT query (althans , ik veronderstel toch dat Insert_products een insert-query is) aan de SelectCommand property? SelectCommand verwacht een query die gegevens selecteert.

Als je de gegevens via een data-adapter wilt updaten, moet je niet enkel een SqlCommand aan de SelectCommand property toewijzen, maar ook aan de UpdateCommand etc...
Als je dan de Update functie oid v/d dataset aanroept, dan gaat .NET zelf gaan uitzoeken welke query er moet uitgevoerd worden afaik.
(Ik kan je niet juist zeggen welke code / functie je nodig hebt, aangezien ik hier .NET niet staan heb en zelf nog niet zoveel met data-adapters gewerkt heb.

Als je iedere row zelf wilt overlopen en voor iedere row een Insert wilt aanroepen, dan moet je geen Dataadapter hebben, maar een SqlCommand. Aan de commandtext property geef je dan een insert-query mee of geef je de naam v/e stored procedure aan. Dan moet je nog de ExecuteNonQuery method aanroepen.

Als je het op jouw manier wilt doen, kan je het als volgt doen:
code:
1
2
3
4
5
6
7
8
9
10
SqlCommand cmdInsert;
cmdInsert = new SqlCommand (...);
cmdInsert.CommandText = "Insert_products";
cmdInsert.CommandType = CommandType.StoredProcedure;
cmdInsert.Parameters.Add(...)
foreach(DataRow r in ds.Tables[Products].Rows)
{
   cmdInsert.Parameters["param"].Value = ....
   cmdInsert.ExecuteNongQuery();
}


Ik hoop dat m'n post een beetje duidelijk is.. * whoami is een beetje brak.

https://fgheysels.github.io/


  • whoami
  • Registratie: December 2000
  • Laatst online: 19:34
Titel gemod. :Y)

https://fgheysels.github.io/


Verwijderd

Heb je wel een connection?

Verwijderd

Visual Basic:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
public bool UpdateRecord(DataSet recDs,string querytxt,string tableName)
        {
            try
            {
                OleDbConnection conn=this.GetOleDbConnection();
                conn.Open();
                OleDbDataAdapter DA = new OleDbDataAdapter();
                DA.InsertCommand= new OleDbCommand(querytxt, conn);
                DA.Update(recDs,tableName);
            }
            catch (Exception ex)
            {
            return false;
            }

            return true;
        
        }


Zoals in deze functie ook je DataAdapter updaten.
Je query wordt waarschijnlijk niet uitgevoerd omdat je geen connectie-object open hebt.

  • whoami
  • Registratie: December 2000
  • Laatst online: 19:34
Verwijderd schreef op 28 oktober 2002 @ 16:15:
Visual Basic:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
public bool UpdateRecord(DataSet recDs,string querytxt,string tableName)
        {
            try
            {
                OleDbConnection conn=this.GetOleDbConnection();
                conn.Open();
                OleDbDataAdapter DA = new OleDbDataAdapter();
                DA.InsertCommand= new OleDbCommand(querytxt, conn);
                DA.Update(recDs,tableName);
            }
            catch (Exception ex)
            {
            return false;
            }

            return true;
        
        }


Zoals in deze functie ook je DataAdapter updaten.
Je query wordt waarschijnlijk niet uitgevoerd omdat je geen connectie-object open hebt.


Daar zal het imho niet aan liggen. Als je geen Open Connection hebt, dan krijg je een exception. De TS spreekt daar niet over.
Hij voert gewoon de ExecSQL() niet aan.

https://fgheysels.github.io/


Verwijderd

BDT schreef op 25 oktober 2002 @ 17:11:
Hallo,

IK heb hetvolgende probleem: Ik heb een XML bestand die ik inlees door middel van een XSD. De XML lees ik in met ReadXml in een dataset.

De inhoud van de dataset wil ik dan in mijn database zetten. De database is uiteraard identiek aan de XSD.

Ik heb 4 tabellen met relaties tussen hen.

produkten -> eigenschappen --> subeigenschappen --> extra

Mijn code voor het wegschrijven van records uit 1 tabel is deze :

foreach (DataRow pRow in ds.Tables["Products"].Rows)
{
SqlDataAdapter da = new SqlDataAdapter("Insert_Products", connectionString);
da.SelectCommand.CommandType = CommandType.StoredProcedure;
da.SelectCommand.Parameters.Add("@ProdName", pRow["ProdName"]);
}

De bedoeling is om het geheel met nested loops te maken, maar deze stored procedure wordt niet aangeroepem(ik heb het gechecked met SQL profiler)
De connectionstring is ook prima.

Wat doe ik hier fout en hoe moet ik het oplossen?
Visual Basic:
1
2
3
4
5
6
7
8
9
foreach (DataRow pRow in ds.Tables["Products"].Rows)
{
    SqlDataAdapter da = new SqlDataAdapter("Insert_Products", connectionString);
    da.SelectCommand.CommandType = CommandType.StoredProcedure;
    da.SelectCommand.Parameters.Add("@ProdName", pRow["ProdName"]);
    connectionString.Open();
    da.SelectCommand.ExecuteNonQuery();
   connectionString.Close();
}

  • whoami
  • Registratie: December 2000
  • Laatst online: 19:34
Lees de draad voor je blaat. :P

https://fgheysels.github.io/

Pagina: 1