Avatar billede Max Novice
09. december 2005 - 11:39 Der er 12 kommentarer og
1 løsning

Opdater SQL database med DataSet eller DataTable.

Hej.

Jeg leder efter den lette måde at opdatere min database på. Læste noget om, at det skulle kunne gøres med et DataSet eller en DataTable. Det virker fint med at læse fra databasen, men jeg kan ikke få det til at virke med at skrive til databasen.

I får lige min kode, og så kommer der lidt forklaringer:

public void writeDT(DataTable dtw)
  {
  SqlCommand sqlkommando = new SqlCommand();
  SqlDataAdapter logAdapter = new SqlDataAdapter();
  DataSet logDS = new DataSet();
  //logDS.Tables = dtw;
  SqlConnection logDB = new SqlConnection(dbString);
  sqlkommando.CommandText = "Insert * Into Fields";
  sqlkommando.Connection = logDB;
  logAdapter.InsertCommand = sqlkommando;
  logDB.Open();
  logAdapter.Fill(logDS, "Fields");
  logDB.Close();
}

Ok, dette stykke kode er metoden "writeDT(DataTable dtw)" fra min klasse "LogDatabase". Metoden kaldes med en DataTable, indeholdende de data, som skal indsættes i databasen, som parameter.

Min DataTable (dtw) indeholder en flad tabel (x antal rækker af 22 kolonner).

dbString er min database connection string, som er defineret et andet sted i koden.

Den udkommenterede linje, er der jeg prøver at kopiere indholdet fra min DataTable over i et DataSet. Det virker slet ikke (linjen er ufærdig, og resultatet af mange andre forsøg).

Jeg er ikke sikker på hvorvidt min sql kommando er rigtig og / eller om jeg skal bruge InsertCommand på SqlAdapteren?

Jeg ved heller ikke om idéen her vil virke, når man bare skal tilføje nye data. Lige nu er tabellen tom, men der vil jævnligt blive tilført flere linjer.

Det er ret mange løse ender og spørgsmål, men jeg håber I kan hjælpe mig med at få noget brugbart ud af det.

Mvh.
/Mnc
Avatar billede Max Novice
09. december 2005 - 12:09 #1
logDS = dtw.DataSet; synes at virke i stedet for den udkommenterede linje, men jeg får stadig fejl i min logAdapter.Fill-sætning.. :(
Avatar billede snepnet Nybegynder
09. december 2005 - 14:17 #2
du kan få et eksempel her:

SqlConnection con = new SqlConnection(...);
SqlCommand command = new SqlCommand(..., con);

SqlDataAdapter adapter = new SqlDataAdapter(command);

DataSet data = new DataSet();
adapter.Fill(data);

// en ændring
if(data.Tables[0].Rows.Count > 0)
{
    DataRow somerow = data.Tables[0].Rows[0];
    if(somerow != null)
    {
        somerow["somefield"] = "...";
    }
}

// opdatering hvis der er ændringer
if(data.HasChanges())
{
    SqlCommandBuilder combuilder = new SqlCommandBuilder(adapter);
    adapter.Update(data);
}

NB!
SqlCommandBuilder'en er ikke en du skal benytte af performancehensyn

mvh
Avatar billede Max Novice
12. december 2005 - 11:35 #3
ok, kigger lige på det..
Avatar billede snepnet Nybegynder
12. december 2005 - 16:52 #4
bare iorden :o)
mvh
Avatar billede Max Novice
13. december 2005 - 15:46 #5
Hmmmm. Hvis man nu ser bort fra CommandBuilderen; jeg har en DataTable med alle mine fine data i, som jeg skal have hældt over i Sql databasen. Senere får jeg endnu en DataTable med nye data, som skal hældes derover i. Jeg synes ikke rigtigt jeg kan få den til at gøre det. SqlCommandBuilderen er nok ikke det smarteste at bruge, for jeg får ret mange data at flytte rundt med.

/Mnc
Avatar billede snepnet Nybegynder
13. december 2005 - 18:30 #6
hvis du vil kopiere rækker fra en datatable til en anden kan du benytte
someDataTable.ImportRow(...);

din insertkommando ser ikke helt fint ud - byg den op sådan her:

insert into sometable (someString, someInt, someDate) values("string",22,DateTime.Now)

du behøver ikke bikse med at åbne og lukke forbindelsen når du bruger en adapter... det skal den nok fikse.

mvh
Avatar billede Max Novice
14. december 2005 - 08:29 #7
Hmm.. Nu er jeg helt forvirret. Jeg ved ikke om vi taler forbi hinanden, men kan du ikke vise mig et eksempel på hvordan jeg smider alle data fra min DataTable over i min sql-database. DataTabellen (og tabellen i databasen for den sags skyld) har 22 kolonner, og tabellen i databasen er oprettet.
Avatar billede snepnet Nybegynder
14. december 2005 - 10:00 #8
du må lige skrive hvad det er du er forvirret over?

og hvis du kan svare på de her spørgsmål ville det være fint:

bruger du .net 1.1 eller 2.0?

du får en DataTable her:
public void writeDT(DataTable dtw)

hvor kommer den fra - og ligger den i et dataset i forvejen?

mvh
Avatar billede Max Novice
20. december 2005 - 11:22 #9
Hej igen, og undskyld ventetiden. Måtte lige have det til at virke på den gammeldags metode.
Jeg bruger .NET 2.0 og Visual Web Developer 2005 Express.
Det jeg gerne vil, er at smide en flad tabel (en DataTable med 22 kolonner og en hulens masse DataRows) over i min sql database. Tabellen i sql databasen er oprettet og kolonnerne i den stemmer overens med kolonnerne i min DataTable. Det jeg gør nu, er at fyre et sql-statement af for hver DataRow i min DataTable. Det virker ganske glimrende, men da mine DataTables har det med at blive større og større, er jeg bange for, at jeg måske på et eller andet tidspunkt vil lægge sql-serveren ned (vil på et tidspunkt nå 16 mio. Rows el. lign.).
Derfor var det jeg tænkte, at man måske kunne lade .NET platformen håndtere tilgangen til sql databasen, og lave noget smart i stil med DataBinding, som ikke vil være så belastende for den. Der findes en fill kommando, men jeg kan BARE ikke få den til at virke. Derfor var det, at jeg kom i tvivl om, om det overhovedet kan lade sig gøre..

Håber du/I kan hjælpe.
Avatar billede snepnet Nybegynder
20. december 2005 - 11:33 #10
der findes en mulighed for at lave bulk-copy's. det skulle være det hurtigst mulige.
http://msdn2.microsoft.com/library/7ek5da1a.aspx
mvh
Avatar billede Max Novice
28. december 2005 - 15:35 #11
Ok, det var tilsyneladende sådan det skulle gøres. :)
Smid et svar, så er der points.
Tak for hjælpen endnu en gang.

Mvh.
Avatar billede snepnet Nybegynder
28. december 2005 - 15:57 #12
kommer her :o)
mvh
Avatar billede Kim Neesgaard Seniormester
25. juni 2007 - 15:49 #13
Dette er altså et herligt forum!! Jeg havde akkurat brug for kode til DataTable (aflæst fra Excel) -> SQL Server 2005 tabel - og her er svaret let og elegant!!!
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