06. april 2006 - 15:09Der er
24 kommentarer og 1 løsning
Eksempel på UPDATE ved OleDB
Jeg har en AccessTabel, hvor jeg udtrækker data fra. Det viser jeg i nogle almindelige textboxe. Så kan der rettes i boxene, trykkes på en knap, og tabellen skulle opdateres med de nye data. Når data ER hentet ind, prøver jeg sådan her:
Fejlen er vist noget med datamismatch. Men datatyperne stemmer godt nok overens med dem i tabellen. Nu klager den også over, at datatypeargument ikke kan være null.
Hvad har jeg gjort forkert, og findes der et simpelt eksempel, med alm. textboxe som opdateringskilder, som jeg kan se?
Glem den fejl med datatypearg - det har jeg løst. Det ser ud som om, den anden fejl skyldes denne linie: int a = adapter.Update(dset); Jeg prøver jo at opdatere min accessTabel gennem en OleDbAdapter, men ved UPDATE vil den have nogle argumenter med in, som jeg faktisk ikke har, eftersom de opdaterede data ligger i textboxe.
Hvad mener du helt nøjagtig i 06/04-2006 15:31:40? Vil det i 06/04-2006 15:31:40 sige, at man kan gå ind og opdatere dele af en tabel på en så simpel måde? Eller er det ikke tabellen, man arbejder på i de eksempler?
Det sidste eksempel giver mening. PRoblemet er bare, at det er INSERT og ikke UPDATE.
Jeg har udraderet nogle fejl i min kode, og er nu nået helt frem til selve opdateringen. Det benytter jeg en OleDbCommandBuilder m.m. til, men det fungerer ikke. Ekserkveringen kommer til denne kodestump:
OleDbCommandBuilder ObjBuilder = new OleDbCommandBuilder(adapter); adapter.UpdateCommand = ObjBuilder.GetUpdateCommand(); adapter.Update(dset, "T_Status");
Nu har jeg lavet et forsøg med data fra 07/04-2006 01:53:37. Nu ser koden således ud:
try { OleDbConnection con = new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + Server.MapPath("") + "\\_Status.mdb"); con.Open(); OleDbCommand ins = new OleDbCommand("UPDATE T_Status SET 'Prioritet'='"+TextBox1.Text.ToString()+ "', 'Program'='"+TextBox2.Text.ToString()+ "', 'Tekst'='"+TextBox3.Text.ToString()+ "', 'Status'='"+TextBox4.Text.ToString()+ "', 'Konsekvens SQL'='"+TextBox5.Text.ToString()+ "', 'Udvilingstid'='"+TextBox6.Text.ToString()+ "', 'Pris'='"+TextBox7.Text.ToString()+"' WHERE 'F_Id'=35", con); ins.ExecuteNonQuery(); con.Close(); } catch(Exception exc){ System.Diagnostics.Debug.WriteLine("Fejlen er: "+exc.Message); }
I Output giver det:
A first chance exception of type 'System.Data.OleDb.OleDbException' occurred in System.Data.dll Fejlen er: Der er ikke angivet nogen værdi for en eller flere krævede parametre.
Så det tyder mere og mere på, at jeg ikke har den korrekte tilgang til tabellen. Men jeg har været inde og kigge. Og det ser kun ud til, at det er primærnøglen, som er påkrævet. Og da det er primærnøglen, der står efter WHERE, skulle dette vel ikke have nogen betydning?
Deresterende felttyper inde i tabellen er: tal tekst notat ja/nej
Det eneste jeg kan se som et muligt problem, er den boolske værdi. Den bliver blot sat ind i UPDATEsql'en som "false" eller "true". Men er dette ikke den rigtige måde, at gøre det på?
Jeg ved ikke, om fejlen kan skyldes dette, men jeg har lige opdaget, at hvis jeg udskriver teksten inde fra textboxene inde i codebehind, så har de stadig værdien fra udtrækket. Altså ikke den opdaterede værdi. Hvordan kan dette lade sig gøre?
'Prioritet' inde i tabellen har: Feltstørrelse="Dobbelt Reelt Tal" og "stadartværdi"=99. Skulle dette have nogen indflydelse? Jeg kan nemlig heller ikke få lov til at fyre UPDATE T_Status SET "Prioritet"=6 WHERE "F_Id"=35; så kommer den frem med en popupbox, hvor man skal skrive 'Prioritet'. Når man så f.eks. skriver 6, så skriver den, at "Dette udtryk er stavet forkert, eller det forekommer for komplekst til at blive evalueret."
Efter lidt rettelse, ser situationen nu således ud:
Når jeg kører programmet, så giver det en fejl til sidst, og tabellen bliver ikke opdateret. Fejlen er:
A first chance exception of type 'System.Data.OleDb.OleDbException' occurred in System.Data.dll Fejlen er: Der er ikke angivet nogen værdi for en eller flere krævede parametre.
Men jeg skriver også sql'en ud inde fra codebehinden. Og hvis jeg kopierer den over i Access, og kører den dér, så går den fint ind, og retter posterne. Hvor kan fejlen være?
Jeg har ikke sql'en ved mig lige p.t., men er det egentlig ikke ligemeget, når nu sql'en virker inde i Access? Jeg har bare taget sql'en derinde fra og kopieret den over i sql-strengen...
Men angående den exception, der kommer, så har jeg læst, at den kun fremkommer, når serveren eller datakilden afbryder forbindelsen til klienten. Så kan det ikke være, at serveren eller selve databasefilen ikke er konfigureret korrekt i denne situation?
Sql'en er: UPDATE T_Status SET Prioritet=6, Program='program1', Tekst='Mulighed for indtastning af anden forhandler', Status='Udført', KonsekvensSQL=True, Udviklingstid='a', Pris='a' WHERE F_Id=35;
Ved exceptioncatch har jeg udskrevet fejlen, som er: "Fejlen er: Der er ikke angivet nogen værdi for en eller flere krævede parametre."
Længere nede i koden, hvor jeg stadig har min tidligere implementering, bliver der også grebet en fejl. Den lyder: "Fejlen er: Column 'KonsekvensSQL' does not belong to table Table."
Nu har jeg lavet en knap, hvor der bliver opdateret automatisk inde i en anden database. Og her fungerer alt selvfølgelig fint. Så jeg tror lige, at jeg skal gå koden lidt efter. Det undrer mig også, hvorfor teksten i tekstfelterne ikke bliver udskrevet med det opdaterede i console, når jeg har rettet dem...
Det lader til, at siden ikke rigtig fanger ændringerne i tekstbox'ene. Hvis jeg udskriver indholdet af en tekstbox, så skrives indholdet ud, der stod i tekstboxen FØR opdateringen - altså ikke det, jeg lige har skrevet manuelt. Hvordan kan dette ske?
Nu har jeg sat "autopostback=true" ved alle tekstboxe. Når jeg så retter i den under kørsel, og med cursoren trykker udenfor tekstboxen, så sker der et postback, og værdien bliver igen det oprindelige. HVordan hænger det sammen?
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.