15. februar 2005 - 20:42Der 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?
I dette særtema om aspekter af AI ser vi på skiftet fra sprogmodeller til AI-agenter, og hvordan virksomheder kan navigere i spændet mellem teknologisk hastighed og behovet for menneskelig kontrol.
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?
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
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);
// 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.
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.
.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(...,...);)
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
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:
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?
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
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?
hej igen :o) nej - en sådan kommando er desværre ikke til rådighed på et standard datagrid. mvh
Synes godt om
Ny brugerNybegynder
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.