Avatar billede larsen1 Nybegynder
28. september 2011 - 14:20 Der er 7 kommentarer

Gemme ændringer i Dataset med CommandBuilder

Hej Eksperter

Jeg prøver at lave en databaseforespørgsel som looper igennem poster, og gemme dem i databasen igen. Det virker som om den henter posterne fint, og looper dem igennem, men det bliver ikke gemt. Jeg kan ikke gennemskue hvad jeg mangler for at mine datarows bliver opdateret i databasen.


string sql = "SELECT * FROM Contract WHERE ID > 10";
OleDbConnection conn = new OleDbConnection(strConnection);
conn.Open();
OleDbDataAdapter oDA = new OleDbDataAdapter(new OleDbCommand(sql, conn));
OleDbCommandBuilder oCmdBuilder = new OleDbCommandBuilder(oDA);

DataSet ds = new DataSet();
oDA.Fill(ds, "Contract");
               
DataTable dt = ds.Tables["Contract"];
DataRow[] oDRow = ds.Tables[0].Select();
foreach (DataRow dr in oDRow)
{
  contractLabel.Text += "<br>foreach " + dr["ID"];
  dr.BeginEdit();                   
  dr["status"] = 100;
  dr.EndEdit();
  dr.AcceptChanges();                   
}               
oDA.Update(ds, "Contract");
Avatar billede Cars10 Praktikant
28. september 2011 - 17:52 #1
Nu er jeg ikke vant til at bruge DataSet og TableAdapter på samme måde så det kan være jeg er helt forkert på den, men vil tror det skal være således:

[code]
string sql = "SELECT * FROM Contract WHERE ID > 10";
OleDbConnection conn = new OleDbConnection(strConnection);
conn.Open();
OleDbDataAdapter oDA = new OleDbDataAdapter(new OleDbCommand(sql, conn));
OleDbCommandBuilder oCmdBuilder = new OleDbCommandBuilder(oDA);

DataSet ds = new DataSet();
oDA.Fill(ds, "Contract");
               
DataTable dt = ds.Tables["Contract"];
DataRow[] oDRow = ds.Tables[0].Select();
foreach (DataRow dr in oDRow)
{
  contractLabel.Text += "<br>foreach " + dr["ID"];
  dr.BeginEdit();                   
  dr["status"] = 100;
  dr.EndEdit();
  dr.AcceptChanges();   
  oDA.Update(dr, "Contract");             
}
[/code]
Avatar billede Cars10 Praktikant
28. september 2011 - 17:56 #2
Eller med en for-løkke med update udenfor

[code]
string sql = "SELECT * FROM Contract WHERE ID > 10";
OleDbConnection conn = new OleDbConnection(strConnection);
conn.Open();
OleDbDataAdapter oDA = new OleDbDataAdapter(new OleDbCommand(sql, conn));
OleDbCommandBuilder oCmdBuilder = new OleDbCommandBuilder(oDA);

DataSet ds = new DataSet();
oDA.Fill(ds, "Contract");
               
DataTable dt = ds.Tables["Contract"];
DataRow[] oDRow = ds.Tables[0].Select();
for (int i = 0; i < oDRow.Lenght; i++)
{
  contractLabel.Text += "<br>foreach " + oDRow[i]["ID"];
  oDRow[i].BeginEdit();                   
  oDRow[i]["status"] = 100;
  oDRow[i].EndEdit();
  oDRow[i].AcceptChanges();           
}
oDA.Update(ds, "Contract"); 
[/code]
Avatar billede larsen1 Nybegynder
29. september 2011 - 22:06 #3
Tak for forslagene cars10. Jeg kan ikke teste det før mandag, men læg blot et svar, så får du point.
Avatar billede Cars10 Praktikant
02. oktober 2011 - 14:36 #4
Jeg lægger et svar hvis det virker. Vær opmærksom på den har konverteret " til &quot; osv. der skulle selvfølgelig stå "
Avatar billede larsen1 Nybegynder
03. oktober 2011 - 10:32 #5
Nu har jeg prøvet begge metoder, men uden held. Når jeg gør som nedenstående udskriver den følgende
---
Before 11 : 6
Before 12 : 7
Before 13 : 8
After 100
After 100
After 100
---
Men databasen bliver ikke opdateret.

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

                string strConnection = System.Configuration.ConfigurationManager.AppSettings["ConnectionStringAccess"];
                string sql2 = "SELECT * FROM Contract WHERE ID > 10";
                OleDbConnection conn = new OleDbConnection(strConnection);
                conn.Open();
                OleDbDataAdapter oDA = new OleDbDataAdapter(new OleDbCommand(sql2, conn));
                OleDbCommandBuilder oCmdBuilder = new OleDbCommandBuilder(oDA);

                DataSet ds = new DataSet();
                oDA.Fill(ds, "Contract");
               
                DataTable dt = ds.Tables["Contract"];
               
                DataRow[] oDRow = ds.Tables[0].Select();
               
                foreach (DataRow dr in oDRow)
                {
                    contractLabel.Text += "<br>Before " + dr["ID"] + " : " + dr["status"];
                    dr.BeginEdit();
                    dr["status"] = 100;
                    dr.EndEdit();
                    dr.AcceptChanges();
                    ds.AcceptChanges();
                    oDA.Update(ds, "Contract");
                }
               
                foreach (DataRow dr in oDRow)
                {
                    contractLabel.Text += "<br>After " + dr["status"];                   
                }
Avatar billede larsen1 Nybegynder
03. oktober 2011 - 16:25 #6
Nå - jeg endte med ikke at kunne få noget som helst til at virke, så jeg lavede en "save" funktion, som gemte data ud fra en konstrueret "update" sætning.

Smider du et svar så du kan få point for din assistance. Jeg går ud fra at det var en fejl 40 hos mig, der gør at det ikke ville virke.
Avatar billede arne_v Ekspert
09. oktober 2011 - 04:16 #7
Jeg plejer at kalde Update foer AcceptChanges.

Og tit er jeg nodt til at lave en manuel:

  da.UpdateCommand = cb.GetUpdateCommand();
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

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