Avatar billede c-sharp Nybegynder
15. februar 2005 - 20:42 Der er 28 kommentarer og
1 løsning

hjælp til at gemme data fra datagrid i database

Jeg har en datagrid hvor man har mulighed for at rette en tekst for hver række of trykke "opdater", det er så gerne skulle ske er at den skal udlæse alle teksterne og opdater disse i databasen. Men hvordan gør man det smartest, uden skal skulle opdatere databasen for hver række?
Avatar billede burningice Nybegynder
18. februar 2005 - 12:01 #1
alle teksterne... tænker du på felterne i den pågældende række, eller alle felter i hele datagriddet?
Avatar billede c-sharp Nybegynder
18. februar 2005 - 12:05 #2
Der er nogle forskellige værdier for hver række man kan rette. Som jeg har gjordt det nu løber jeg hele mit datagrid igennem, og for hver række laver jeg en update i datbasen. Men kan det ikke gøre smartere?
Avatar billede burningice Nybegynder
18. februar 2005 - 12:20 #3
jo... du kan opdaterer den række din UpdateCommand bliver udført på.

hvordan ser din UpdateCommand-metode ud?
Avatar billede c-sharp Nybegynder
18. februar 2005 - 12:26 #4
Den ser ud som følger:

for (int i=0; i<MyDataGrid.Items.Count; i++)
{
   
    DataGridItem _item = MyDataGrid.Items[i];
    System.Web.UI.WebControls.Label billednr = (System.Web.UI.WebControls.Label)_item.FindControl("billednr");
    System.Web.UI.WebControls.TextBox tekst = (System.Web.UI.WebControls.TextBox)_item.FindControl("tekst");
    System.Web.UI.WebControls.TextBox raekkefoelge = (System.Web.UI.WebControls.TextBox)_item.FindControl("raekkefoelge");
    CheckBox publiceret = (CheckBox)_item.FindControl("publiceret");

    int publiceretTmp = 0;
               
    if(publiceret.Checked)
            publiceretTmp = 1;

    sql = "UPDATE tblGalleri set  tekst = '" + tekst.Text + "'";
               
    if(raekkefoelge.Text != "")
        sql += ", raekkefoelge = " + raekkefoelge.Text;
               
        sql += ", publiceret = " + publiceretTmp  + "  WHERE billednr = " + billednr.Text;
               
        SqlHelper.ExecuteNonQuery(connStr, CommandType.Text, sql);

}
fyldDatagrid();
Avatar billede snepnet Nybegynder
20. februar 2005 - 01:04 #5
hej c-sharp :o)

hvis du alligevel gufler dine data op i et dataset, som du så bruger som datasource på dit grid (ved jeg jo ikke om du gør) - kan du jo lægge det i session (eller hente på ny ved opdatering), opdatere rækkerne i datasettet - og efterfølgende opdatare datasettet mod basen.... Det giver sådan en nydelig kode :oP

mvh
Avatar billede c-sharp Nybegynder
20. februar 2005 - 19:44 #6
snepnet: kan du give et eksempel på at opdater et dataset og efterfølgende opdater databasen på baggrund af det dataset?
Avatar billede snepnet Nybegynder
20. februar 2005 - 21:01 #7
joda :

SqlConnection con = new SqlConnection(someConnectionString);
SqlCommand selectCommand = new SqlCommand("select * from tblSomething",con);
SqlDataAdapter adapter = new SqlDataAdapter(selectCommand);
DataSet ds = new DataSet();
adapter.Fill(ds);

// så kan du så trixe med data og ...

// hvis det er simple forespørgsler kan du få skrevet sql-erne af en builder...
SqlCommandBuilder comBuilder = new SqlCommandBuilder(adapter);       
adapter.Update(ds);

mvh
Avatar billede c-sharp Nybegynder
01. marts 2005 - 08:11 #8
Jeg er ikke helt med på det her. hvis vi nu siger at jeg løber mit datagrid igennem på følgende måde:

for (int i=0; i<MyDataGrid.Items.Count; i++)
{
   
    DataGridItem _item = MyDataGrid.Items[i];
    System.Web.UI.WebControls.Label billednr = (System.Web.UI.WebControls.Label)_item.FindControl("billednr");
    System.Web.UI.WebControls.TextBox tekst = (System.Web.UI.WebControls.TextBox)_item.FindControl("tekst");
    System.Web.UI.WebControls.TextBox raekkefoelge = (System.Web.UI.WebControls.TextBox)_item.FindControl("raekkefoelge");
    CheckBox publiceret = (CheckBox)_item.FindControl("publiceret");

    int publiceretTmp = 0;
               
    if(publiceret.Checked)
            publiceretTmp = 1;

  // hvordan vil du rette data her?
}

Hvordan vil du så rette i dataset'et og opdater databasen?
Avatar billede snepnet Nybegynder
01. marts 2005 - 16:47 #9
hej c-sharp :o)
er lige på vej ud af døren, men jeg poster noget til dig når jeg kommer tilbage !
vi skrives ved
/snep
Avatar billede snepnet Nybegynder
01. marts 2005 - 18:39 #10
Nu var det bare sådan lidt principiel kode du fik.... En model kunne være som noget i denne stil :

// et sessiondataset
protected DataSet PageData
{
  get{return (DataSet)Session["PageData"];}
  set{Session["PageData"] = value;}
}

// i page_load
if(!IsPostBack)
  PageData = GetSomeData(...);

// i en redigér-handler :
foreach(DataGridItem dgi in this.grid)
{
  if(dgi.ItemType == ListItemType.Item || dgi.ItemType == ListItemType.AlternatingItem)
  {
    // her kan du så gøre noget ved dig dataset:
    // *** PageDate.Tables[X].Rows[Y]["someColumn"] = "something from grid";
  }   
  // og til sidst opdatere vha en adapter 
}

***
Du kan gøre det nemmere for dig selv hvis du arbejder med et DataSet med tabeller med unikke id-kolonner... På den måde kan du angive denne kolonne på datagriddet således :

grid.DataKeyColumn = "someIdColomn";

og senere udnytte dette til at få fat i den rigtig rækker sådan her :

// find id
int dbId = Int.Parse(this.grid.DataKeys[dgi.Item.ItemIndex].ToString());
(alternativt kan du self. også sørge for, at dit unikke id indsættes i griddet - så du kan finde det direkte på dit datagriditem).

du kan så finde den rigtige række i dit dataset (når du skal opdateret noget i det) :

DataRow[] row = PageData.Tables[X].Select("dbId=" + dbId);
// der skulle jo så gerne kun være én enkelt row her såhhh....
row[0]["someColumn"] = ((TextBox)dgi.FindControl(...).Text; // hvis du har en TextBox

og det kunne så give en kode som denne :

// i en redigér-handler :
foreach(DataGridItem dgi in this.grid)
{
  if(dgi.ItemType == ListItemType.Item || dgi.ItemType == ListItemType.AlternatingItem)
  {
    int dbId = Int.Parse(this.grid.DataKeys[dgi.Item.ItemIndex].ToString());
    DataRow[] row = PageData.Tables[X].Select("dbId=" + dbId);
    row[0]["someColumn"] = ((TextBox)dgi.FindControl(...).Text;
  }
  UpdateData();
}

// og en opdateringsmetode :
void UpdateDate()
{
  SqlDataAdapter adapter = CreatePageDataAdapter();
  adapter.Update(PageData);
}

CreatePageDataAdapter() kunne så sørge for noget alá det jeg postede tidligere.

håber du ikke synes det er helt ude i hampen... du må endelig spørge hvis du ikke lige synes det giver mening, og ellers håber jeg du kan bruge det til lidt inspiration.

mvh
Avatar billede c-sharp Nybegynder
07. marts 2005 - 08:58 #11
Super med et eksempel!! Jeg har ikke glemt den her, men roder lige med noget andet lige i tiden. Jeg skal nok vende tilbage senere på ugen!
Avatar billede snepnet Nybegynder
07. marts 2005 - 09:09 #12
jamen det er da bare iorden :o)
mvh
Avatar billede c-sharp Nybegynder
10. marts 2005 - 06:33 #13
Jeg har lige nogle spørgsmål til dit eksempel, de kommer lige stille og roligt efterhånden som det forhåbenlig begynder at lysne for mig :-):

Hvad sker der her?:

if(dgi.ItemType == ListItemType.Item || dgi.ItemType == ListItemType.AlternatingItem)
Avatar billede snepnet Nybegynder
10. marts 2005 - 10:42 #14
hej c-sharp :o)

der er flere typer af listitems. du kan se en fuld liste her :
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpref/html/frlrfsystemwebuiwebcontrolslistitemtypeclasstopic.asp

linien gør bare, at der kun kigges på de "almindelige indholdsrækker" - og ikke header og den slags.

mvh
Avatar billede c-sharp Nybegynder
11. marts 2005 - 06:21 #15
Flere spørgsmål :-)

UpdateDate() laver den opdateringen i databasen?
Avatar billede snepnet Nybegynder
12. marts 2005 - 10:08 #16
hej igen :o)
ja den opdaterer ved adapter.Update() - men adapteren skal så lige laves først.
mvh
snep
Avatar billede c-sharp Nybegynder
14. marts 2005 - 06:00 #17
Hvad vil det sige at man opdater via adapter.Update()? Opdater den så ikke i databasen med det samme?

Udskyld jeg spørg så meget :-)
Avatar billede c-sharp Nybegynder
14. marts 2005 - 09:30 #18
Nu ved jeg ikke om jeg har hoppet over hvor gæret er lavest, men jeg har altid brugt MS ApplicationBlocks til min database adgang, kan jeg stadig bruge denne i forbindelse med det her?

kan heller ikke helt se hvordan CreatePageDataAdapter() skal kommet til at se ud.
Avatar billede snepnet Nybegynder
14. marts 2005 - 22:00 #19
.Update() er bare en motode der eksekverer diverse commands, hvilket så medfører en opdatering i selve basen.
(såfremt de er tilstede eller kan genereres).

CreatePageAdapter() var bare for at illustrere at du skulle sørge for at få den lavet... en typisk kode til det står i det første eksempel.

eksemplet var tænkt for fuldt implementering, men jeg kan ikke se at der skulle være noget i vejen for at bruge dataaccess-blokken sammen med de principper vi har skrevet om her, men jeg har dog ikke brugt den selv.
(fx. kunne PageData = GetSomeData(...) ligeså godt være :
PageData = DatabaseFactory.CreateDatabase(...).ExecuteDataSet(...,...);)

mvh
Avatar billede c-sharp Nybegynder
18. marts 2005 - 06:30 #20
Og jeg bliver ved med at spørge, nu må du sige til hvis det er ved at være for meget, så skal du nok få dine point!

Jeg har nu skrevet følgende kode:

protected DataSet PageData
{
    get{return (DataSet)Session["PageData"];}
    set{Session["PageData"] = value;}
}

private void update_Click(object sender, System.EventArgs e)
{
    for (int i=0; i < MyDataGrid.Items.Count; i++)
    {
        DataGridItem _item = MyDataGrid.Items[i];
        System.Web.UI.WebControls.Label billednr = (System.Web.UI.WebControls.Label)_item.FindControl("billednr");
        System.Web.UI.WebControls.TextBox tekst = (System.Web.UI.WebControls.TextBox)_item.FindControl("tekst");

        DataRow[] row = PageData.Tables["Table"].Select("billednr=" + billednr.Text);
        row[0]["tekst"] = tekst.Text;   
        updateData();
    }
}

private void updateData()
{
    SqlDataAdapter adapter = new SqlDataAdapter();
    SqlCommandBuilder comBuilder = new SqlCommandBuilder(adapter);       
    adapter.Update(PageData);
}

Men min update metode virker ikke.

Jeg er heller ikke så meget med på hvad der sker til sidst.

Jeg troede at man skulle gøre følgende:

løbe datagrid'en igennem og tilrette dataset'et efter datagrid, når hele dataset'et er tilrettet, opdater dataset'et med databasen.
Avatar billede snepnet Nybegynder
18. marts 2005 - 08:50 #21
det er også det du skal - så din update kunne være :
(for en kort bemærkning dropper vi lige det med at dit datasæt ligger i session)

// i din handler af update

// hent referencedata
SqlConnection con = new SqlConnection(someConnectionString);
SqlCommand selectCommand = new SqlCommand("select * from tblSomething",con);
SqlDataAdapter adapter = new SqlDataAdapter(selectCommand);
DataSet ds = new DataSet();
adapter.Fill(ds);

// løb igennem dit grid
foreach(DataGridItem dgi in MyDataGrid.Items)
{
  // kun almindelige rækker :
  if(dgi.ItemType == ListItemType.Item || dgi.ItemType == ListItemType.AlternatingItem)
  {
    // ... fyld indhold af tekbokse mv. ind i datasættet 
  }
}

// og gem ændringerne i basen
SqlCommandBuilder comBuilder = new SqlCommandBuilder(adapter);       
adapter.Update(ds);
}

Prøv at se om du kan få det til at funge.... bare som eksempel
Avatar billede c-sharp Nybegynder
21. marts 2005 - 06:28 #22
det sidste du posted fik jeg til at virke :-)

Men hvis jeg nu vender tilbage til løsningen med en session der opbevare dataset'et så kan jeg ikke helt finde ud af at lave en SqlDataÁdapter. Jeg har fået skrevet følgende kode:

    DataSet ds = PageData;
           
    for (int i=0; i < MyDataGrid.Items.Count; i++)
    {
   
        DataGridItem _item = MyDataGrid.Items[i];
        System.Web.UI.WebControls.Label billednr = (System.Web.UI.WebControls.Label)_item.FindControl("billednr");
        System.Web.UI.WebControls.TextBox tekst = (System.Web.UI.WebControls.TextBox)_item.FindControl("tekst");
        System.Web.UI.WebControls.TextBox raekkefoelge = (System.Web.UI.WebControls.TextBox)_item.FindControl("raekkefoelge");
        CheckBox publiceret = (CheckBox)_item.FindControl("publiceret");

        int publiceretTmp = 0;
               
        if(publiceret.Checked)
            publiceretTmp = 1;

        DataRow[] row = ds.Tables["Table"].Select("billednr=" + billednr.Text);
          row[0]["tekst"] = tekst.Text;
        row[0]["raekkefoelge"] = raekkefoelge.Text;
        row[0]["publiceret"] = publiceretTmp;
    }

    SqlConnection con = new SqlConnection(connStr);

    string sql1 = "SELECT billednr, filnavn, tekst, publiceret, raekkefoelge, dato " +
                "FROM tblGalleri " +
            "WHERE kategoriId = " + kategori.Text + " " +
            "ORDER BY raekkefoelge";

        SqlCommand selectCommand = new SqlCommand(sql1,con);
        SqlDataAdapter adapter = new SqlDataAdapter(selectCommand);

        SqlCommandBuilder comBuilder = new SqlCommandBuilder(adapter);       
        adapter.Update(ds);

Jeg mangler bare en måde at initialisere SqlDataAdapter uden en sqlforspørgsel.
Avatar billede snepnet Nybegynder
21. marts 2005 - 09:51 #23
hej C.

det gør på samme måde, men du kan jo lægge det i en metode for sig selv :

private SqlDataAdapter GenerateAdapter(bool addCommandBuilder)
{
  SqlConnection con = new SqlConnection(connectionString);
  SqlCommand selectCommand = new SqlCommand(selectString,con);
  SqlDataAdapter adapter = new SqlDataAdapter(selectCommand);
  if(addCommandBuilder)
  {
    SqlCommandBuilder comBuilder = new SqlCommandBuilder(adapter);
  }
  return adapter;
}

// der hvor du så henter data
DataSet PageData = new DataSet();
GenerateAdapter(false).Fill(ds, "tblGalleri");

// og i den metode hvor du så vil gemme data
SqlDataAdapter adapter = GenerateAdapter(true);
adapter.Update(PageData, "tblGalleri");

Du kan jo lige prøve at du kan få det til at spille.
Vi skrives ved.

mvh :o)
Avatar billede c-sharp Nybegynder
21. marts 2005 - 09:58 #24
Jeg forstår åbenbart ikke rigtig baggrunden for den SqlDataAdapter, for jeg kan ikke se hvad den skal med en select statment for at opdatere databasen?
Avatar billede snepnet Nybegynder
21. marts 2005 - 10:19 #25
commandbuilderen skal bruge en selectcommand for at kunne generere update, delete og inserts.
mvh
Avatar billede c-sharp Nybegynder
21. marts 2005 - 10:46 #26
Så det kode jeg har posted ser rigtig nok ud?

Så skal du have TUSIND TAK for hjælpen ! ! ! smid et svar så er der nogle MEGET velfortjente point!
Avatar billede snepnet Nybegynder
21. marts 2005 - 10:56 #27
ja sådan kan du sagtens lave det.... måske du kunne lave en lidt mere direkte vej til det aktuelle datarow i dit dataset, fremfor en select - men det er en detalje.... princippet er bestemt gangbart.
tak for de pæne or... du er meget velkommen :o)
vi skrives ved
mvh
Avatar billede c-sharp Nybegynder
22. marts 2005 - 06:37 #28
lige et sidste spørgsmål :-)

Kan man kalde en kommando på dataGrid så den opdatere. Problemet er at når jeg har rettet i de data i datagrid og vælger at de skal gemmes, så viser den godt nok de rettede data, men de er ikke sorteret efter rettelserne.

Så istedet for at skal fylde data i igen, kan man så ikke kalde en opdater metode på datagrid?
Avatar billede snepnet Nybegynder
22. marts 2005 - 18:59 #29
hej igen :o)
nej - en sådan kommando er desværre ikke til rådighed på et standard datagrid.
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