Toon posts:

[asp.net/C#]Update command

Pagina: 1
Acties:
  • 169 views sinds 30-01-2008
  • Reageer

Verwijderd

Topicstarter
Hoi Tweakers,
Ik pas begonnen met ASP.NET. Nu maak ik gebruik van een datagrid, maar deze wil niet updaten! Ook aan de code zie ik niks raars (geeft geen errors enzo en geen fouten tijdens debug ) en als ik op update klik dan verschijnt mn oude waarde weer....

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
private void DataGrid_Update(object source, System.Web.UI.WebControls.DataGridCommandEventArgs e)
        {
string gebruiker = ((TextBox)e.Item.Cells[2].Controls[0]).Text;
string paswoord = ((TextBox)e.Item.Cells[3].Controls[0]).Text;
            
OleDbConnection aConnection = new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source="+ ConfigurationSettings.AppSettings["DBConnectionString"]);
OleDbCommand UpdateCommand = new OleDbCommand();
UpdateCommand.Connection = aConnection;
UpdateCommand.CommandText = "UPDATE login SET gebruiker = @gebruiker, paswoord = @paswoord WHERE ID=@ID";

int keyValue = (int)DGGebruiker.DataKeys[e.Item.ItemIndex];
UpdateCommand.Parameters.Add("@ID", SqlDbType.Int).Value = keyValue;
UpdateCommand.Parameters.Add("@gebruiker", OleDbType.Char, 50).Value = gebruiker;
UpdateCommand.Parameters.Add("@paswoord", OleDbType.Char, 50).Value = paswoord;


try 
{
aConnection.Open();
UpdateCommand.ExecuteNonQuery();
}
    
finally 
{
aConnection.Close();
}
DGGebruiker.EditItemIndex = -1;
DataBind();
}


wat kan ik nou het beste doen zodat deze updatecommand wel werkt?

  • gorgi_19
  • Registratie: Mei 2002
  • Laatst online: 20-08 11:40

gorgi_19

Kruimeltjes zijn weer op :9

In je page_load haal je constant de waarden op.
Waarden moeten alleen opgehaald worden als er geen postback is.

Visual Basic .NET:
1
2
3
4
5
Private Sub Page_load(sender as object, e as eventargs) Handles MyBase.Load
    If not Page.IsPostback
        ' Haal data op
    End if
End sub

[ Voor 80% gewijzigd door gorgi_19 op 30-08-2003 11:10 ]

Digitaal onderwijsmateriaal, leermateriaal voor hbo


Verwijderd

Topicstarter
dit staat inderdaad in mijn page_load:
code:
1
2
3
4
5
6
7
8
9
10
private void Page_Load(object sender, System.EventArgs e)
        {
OleDbConnection aConnection = new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source="+ ConfigurationSettings.AppSettings["DBConnectionString"]);
aConnection.Open();
OleDbDataAdapter da = new OleDbDataAdapter("Select ID, gebruiker, paswoord from login order by gebruiker ASC", aConnection);
DataSet ds = new DataSet(); 
da.Fill(ds, "login");
DGGebruiker.DataSource = ds;
DGGebruiker.DataBind();
}


Maar hij zou hem na de update toch goed wegmoeten schrijven?

  • gorgi_19
  • Registratie: Mei 2002
  • Laatst online: 20-08 11:40

gorgi_19

Kruimeltjes zijn weer op :9

Nee, want het Load Event volgt voor het uitvoeren van het ItemCommand-event.

Oftewel wat er nu gebeurd als je wilt updaten:

Haal de data op uit de database en bind deze.
Update met de waarde uit een datagrid. Echter, deze zal niet veranderen, doordat je net de waarden hebt opgehaald.

zie verder mijn edit voor het antwoord.
En waarom gebruik je trouwens een try zonder een catch?

[ Voor 15% gewijzigd door gorgi_19 op 30-08-2003 11:12 ]

Digitaal onderwijsmateriaal, leermateriaal voor hbo


Verwijderd

Topicstarter
gorgi_19 schreef op 30 August 2003 @ 11:12:
Nee, want het Load Event volgt voor het uitvoeren van het ItemCommand-event.

Haal de data op uit de database en bind deze.
Update met de waarde uit een datagrid. Echter, deze zal niet veranderen, doordat je net de waarden hebt opgehaald.
daar zou je wel eens gelijk in kunnen hebben :) ... ga ik dat eens proberen!

Verwijderd

Topicstarter
een wat late reactie van mijn kant...(heerlijk zon vakantie hehe)

Ik heb geprobeerd wat gorgi_19 zei, maar het werkt nog niet :'(

zo ziet mijn page_load er nu uit:

code:
1
2
3
4
if (!IsPostBack)
{
 DoDataBind();
}


dan ga ik binden:

code:
1
2
3
4
5
6
7
8
OleDbConnection aConnection = new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source="+ ConfigurationSettings.AppSettings["DBConnectionString"]);
aConnection.Open(); 

String sqlSelectStr = "SELECT ID, gebruiker, paswoord FROM login order by gebruiker ASC"; 
OleDbCommand cmd = new OleDbCommand(sqlSelectStr,aConnection); 
DGGebruiker.DataSource = cmd.ExecuteReader(); 
DGGebruiker.DataBind(); 
aConnection.Close();


Als ik dan op de editknop druk dan laatie een leeg datagrid zien (en zo kan ik niet editten...

verder heb ik mijn update command wat netter gemaakt (hoop ik):

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
private void DataGrid_Update(object source, System.Web.UI.WebControls.DataGridCommandEventArgs e)
{
string gebruiker = ((TextBox)e.Item.Cells[2].Controls[0]).Text;
string paswoord = ((TextBox)e.Item.Cells[3].Controls[0]).Text;
                        
OleDbConnection aConnection = new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source="+ ConfigurationSettings.AppSettings["DBConnectionString"]);
OleDbCommand UpdateCommand = new OleDbCommand();
UpdateCommand.Connection = aConnection;
UpdateCommand.CommandText = "UPDATE login SET gebruiker = @gebruiker, paswoord = @paswoord WHERE ID = @ID";
            
int keyValue = (int)DGGebruiker.DataKeys[e.Item.ItemIndex];
UpdateCommand.Parameters.Add("@ID", OleDbType.Integer).Value = DGGebruiker.DataKeys[e.Item.ItemIndex];
UpdateCommand.Parameters.Add("@gebruiker", OleDbType.Char).Value = gebruiker;
UpdateCommand.Parameters.Add("@paswoord", OleDbType.Char).Value = paswoord;
            
try 
{
aConnection.Open();
UpdateCommand.ExecuteNonQuery();
}

catch (Exception ex) 
{
Message.Text = ex.ToString();
}
    
finally 
{
aConnection.Close();
}

DGGebruiker.EditItemIndex = -1;
DataBind();

}


iemand nog tips hoe ik de update kan laten werken?

  • gorgi_19
  • Registratie: Mei 2002
  • Laatst online: 20-08 11:40

gorgi_19

Kruimeltjes zijn weer op :9

Zet eens op regel 3:
Visual Basic .NET:
1
Throw New Exception("UpdateCommand::Entering update method")

En je mag het zelf naar c# vertalen.

Digitaal onderwijsmateriaal, leermateriaal voor hbo


  • whoami
  • Registratie: December 2000
  • Laatst online: 22:54
Een DataReader gebruiken als DataSource vind ik niet zo'n goed idee.
Een DataReader neemt namelijk de connectie exclusief in beslag, tot wanneer die Reader opnieuw geclosed wordt.

Wat gebeurd er precies in je DataBind functie?

Ben je wel zeker dat die Update Functie uitgevoerd wordt? Zet er eens een break-point in.

https://fgheysels.github.io/


Verwijderd

Topicstarter
gorgi_19 schreef op 06 September 2003 @ 12:11:
Zet eens op regel 3:
Visual Basic .NET:
1
Throw New Exception("UpdateCommand::Entering update method")

En je mag het zelf naar c# vertalen.
regel 3... van me update command (of mijn mijn code behind? (anders zit ik nl in me 'usings' te plakken)

Whoami:

dit gebeurt er in mijn databind:
code:
1
2
3
4
5
6
7
8
OleDbConnection aConnection = new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source="+ ConfigurationSettings.AppSettings["DBConnectionString"]);
aConnection.Open(); 

String sqlSelectStr = "SELECT ID, gebruiker, paswoord FROM login order by gebruiker ASC"; 
OleDbCommand cmd = new OleDbCommand(sqlSelectStr,aConnection); 
DGGebruiker.DataSource = cmd.ExecuteReader(); 
DGGebruiker.DataBind(); 
aConnection.Close();

[ Voor 43% gewijzigd door Verwijderd op 06-09-2003 12:17 ]


  • gorgi_19
  • Registratie: Mei 2002
  • Laatst online: 20-08 11:40

gorgi_19

Kruimeltjes zijn weer op :9

Verwijderd schreef op 06 September 2003 @ 12:15:
[...]

regel 3... van me update command (of mijn mijn code behind? (anders zit ik nl in me 'usings' te plakken)
na
C#:
1
2
private void DataGrid_Update(object source, System.Web.UI.WebControls.DataGridCommandEventArgs e)
{

Digitaal onderwijsmateriaal, leermateriaal voor hbo


  • gorgi_19
  • Registratie: Mei 2002
  • Laatst online: 20-08 11:40

gorgi_19

Kruimeltjes zijn weer op :9

whoami schreef op 06 September 2003 @ 12:14:
Een DataReader gebruiken als DataSource vind ik niet zo'n goed idee.
Een DataReader neemt namelijk de connectie exclusief in beslag, tot wanneer die Reader opnieuw geclosed wordt.
In dit geval, namelijk met het direct binden, lijkt het me niet zo een probleem? Qua tijd zou het toch niet uit mogen maken?

OF ik hem nu eerst uitlees, in een collection zet, en daarmee verder ga werken of ik hem tijdens het uitlezen al gelijk 'bewerk'

[ Voor 15% gewijzigd door gorgi_19 op 06-09-2003 12:20 ]

Digitaal onderwijsmateriaal, leermateriaal voor hbo


  • whoami
  • Registratie: December 2000
  • Laatst online: 22:54
gorgi_19 schreef op 06 September 2003 @ 12:18:
[...]

In dit geval, namelijk met het direct binden, lijkt het me niet zo een probleem? Qua tijd zou het toch niet uit mogen maken?
Ik zie nergens dat die DataReader gesloten wordt.

https://fgheysels.github.io/


  • gorgi_19
  • Registratie: Mei 2002
  • Laatst online: 20-08 11:40

gorgi_19

Kruimeltjes zijn weer op :9

whoami schreef op 06 September 2003 @ 12:19:
[...]


Ik zie nergens dat die DataReader gesloten wordt.
Wordt dat niet opgelost door de connection te sluiten?

Digitaal onderwijsmateriaal, leermateriaal voor hbo


Verwijderd

Topicstarter
gorgi_19 schreef op 06 september 2003 @ 12:21:
[...]

Wordt dat niet opgelost door de connection te sluiten?
volges mij wel....

  • whoami
  • Registratie: December 2000
  • Laatst online: 22:54
gorgi_19 schreef op 06 September 2003 @ 12:21:
[...]

Wordt dat niet opgelost door de connection te sluiten?
Ik ben het niet 100% zeker, maar ik denk het niet.

Je kan wel een commandBehavior opgeven bij de ExecuteReader functie, maar daarmee geef je aan dat de connectie moet gesloten worden als de reader gesloten wordt.

Update: blijkbaar wordt die toch gesloten als de connectie gesloten wordt.

[ Voor 10% gewijzigd door whoami op 06-09-2003 12:28 ]

https://fgheysels.github.io/


  • whoami
  • Registratie: December 2000
  • Laatst online: 22:54
Weet je nu al zeker of die UpdateCommand uitgevoerd wordt? Heb je er al eens een breakpoint ingezet, of heb je gorgi_19s methode al geprobeerd (met die exceptie)?

https://fgheysels.github.io/


Verwijderd

Topicstarter
zoals hij nu is kan de update niet eens worden uitgevoerd... ik druk op de edit knop en hij laadt een lege datagrid.... (met die methode van gorgi ben ik bezig...(maar zit ff naar een c# syntax te zoeken)

Verwijderd

Topicstarter
ik heb die exception erin gegooid:

in c#: throw new Exception("UpdateCommand::Entering update method");

wat hij dan vervolgens aangeeft is het volgende:
string gebruiker = ((TextBox)e.Item.Cells[2].Controls[0]).Text;

string staat blauw onderstreept met de melding: unreachable code detected... er lijkt dus wel degelijk wat aan de hand te zijn... maar hoe nu verder...

  • whoami
  • Registratie: December 2000
  • Laatst online: 22:54
Heb je de datagrid at design time gedesigned, of maak je die via code?
Waarmee ik bedoel: waar en hoe zet je de columns en die EditCommandColumn etc in je datagrid?

Hoezo je zit naar een C# syntax te zoeken? Gewoon ff zoeken in de doc's op Exceptions, of het throw keyword en je hebt het zo gevonden.

https://fgheysels.github.io/


  • whoami
  • Registratie: December 2000
  • Laatst online: 22:54
Verwijderd schreef op 06 september 2003 @ 13:07:
ik heb die exception erin gegooid:
string staat blauw onderstreept met de melding: unreachable code detected... er lijkt dus wel degelijk wat aan de hand te zijn... maar hoe nu verder...
Tuurlijk, maar dat is geen probleem.

Gorgi's bedoeling met die exception is, dat je kunt zien of die method wel daadwerkelijk ge-entered wordt. Als die exceptie gethrowed wordt, wordt de rest van de code van die method niet meer uitgevoerd zoals je het daar nu staan hebt.
Maar dat geeft niet, zoals ik al zei is het throwen van die exceptie gewoon ff om te testen.

https://fgheysels.github.io/


Verwijderd

Topicstarter
whoami schreef op 06 september 2003 @ 13:08:
Heb je de datagrid at design time gedesigned, of maak je die via code?
Waarmee ik bedoel: waar en hoe zet je de columns en die EditCommandColumn etc in je datagrid?

Hoezo je zit naar een C# syntax te zoeken? Gewoon ff zoeken in de doc's op Exceptions, of het throw keyword en je hebt het zo gevonden.
ik heb gewoon een standaard grid. Daarmee die edit column aangemaakt...
vervolgens in de events van grid alles gekoppeld: zoals DataGrid_Cancel etc

[ Voor 9% gewijzigd door Verwijderd op 06-09-2003 13:17 ]


Verwijderd

Zet eens achter elke paar regels
Response.Write("dit werkt") ofzo dan kan je kijken hoever hij raakt en wat er precies wordt uitgevoerd.
We weten namelijk niet echt goed wat er nu wel en niet wordt uitgevoerd :)

Test ook eens je update commando met een paar hardcoded waarden zodat je kan zien of je update functie wel werkt :)

  • whoami
  • Registratie: December 2000
  • Laatst online: 22:54
In je EditCommand event - handler moet je wel je data opnieuw inlezen:

code:
1
2
3
4
5
6
private void DataGrid1_EditCommand(object source, System.Web.UI.WebControls.DataGridCommandEventArgs e)
{
   DataGrid1.DataSource = getStuff();
   DataGrid1.EditItemIndex = e.Item.ItemIndex;
   DataGrid1.DataBind();
}


In je page_load zet je dan bv deze code:

code:
1
2
3
4
5
6
7
8
private void Page_Load(object sender, ... )
{
   if( !this.IsPostback )
   {
         DataGrid1.DataSource = getStuff();
         DataGrid1.DataBind();
   }
}


code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
private DataSet getStuff()
{
    SqlConnection con = new SqlConnection("connectionstring");
    
    SqlCommand cmd = new SqlCommand();
    cmd.Connection = con;
    cmd.CommandText = "SELECT blaat from tabel";
 
    SqlDataAdapter da = new SqlDataAdapter();
    da.SelectCommand = cmd;

    DataSet ds = new DataSet();
    con.Open()
    da.Fill(ds);
    con.Close();
    return ds;
}

[ Voor 52% gewijzigd door whoami op 06-09-2003 13:28 ]

https://fgheysels.github.io/


Verwijderd

Topicstarter
Verwijderd schreef op 06 September 2003 @ 13:23:
Zet eens achter elke paar regels
Response.Write("dit werkt") ofzo dan kan je kijken hoever hij raakt en wat er precies wordt uitgevoerd.
We weten namelijk niet echt goed wat er nu wel en niet wordt uitgevoerd :)

Test ook eens je update commando met een paar hardcoded waarden zodat je kan zien of je update functie wel werkt :)
ik heb in me try en catch van me updatecommand wat response.write erin gegooid...'dit werkt' krijg ik wel te zien....

Whoami:
In me edit wordt nu ook data opgehaald waardoor ik nu WEL data kan editten (maar nog niet update :P )

  • whoami
  • Registratie: December 2000
  • Laatst online: 22:54
Het updaten zal ook wel werken denk ik.

Alleen zal je na de update ook je dataGrid opnieuw moeten inladen denk ik.

https://fgheysels.github.io/


Verwijderd

Topicstarter
oke ik heb de code van whoami helemaal ingepast. Geen errors, alle knoppen werken. Als ik na de edit wil updaten dan laat hij een lege grid zien... ook heeft hij de gegevens nog niet veranderd...

  • whoami
  • Registratie: December 2000
  • Laatst online: 22:54
Wordt de code in je UpdateCommand event handler nu uitgevoerd?
Heb je die
code:
1
throw Exception();

daar nog in staan misschien?

Ben je wel zeker dat je UPDATE statement goed is, heb je dat statement al zo eens bekeken en getest in je DB?
etc...

Weet je waarom je update statement waarschijnlijk niet werkt?
Omdat je, als waarde voor die ID parameter niet het ID gaat gaan meegeven van die betreffende gebruiker, maar de Index van de betreffende rij uit de datagrid.

Zet eens de DataKeyField property van de dataGrid op de naam van het veld dat de primary key is in je tabel.
Bijvoorbeeld:
code:
1
MyDataGrid.DataKeyField = "PersoonId";


En in je UpdateCommand eventhandler verander je de regel waarin je de ID property invult als volgt (ongeveer):
code:
1
2
cmdUpdate.Parameters.Add("@p_id", OleDbType.Integer).Value = 
   Convert.ToInt32(MyDataGrid.DataKeys[e.Item.ItemIndex]);

[ Voor 56% gewijzigd door whoami op 06-09-2003 14:03 ]

https://fgheysels.github.io/


Verwijderd

Topicstarter
jah die exception heb ik eruit gegooid. Ben er bijna zeker van dat me update script goed is... (al heb ik hem niet kunnen testen omdat ik met dit probleem zit)

  • whoami
  • Registratie: December 2000
  • Laatst online: 22:54
check m'n edit. ;)

https://fgheysels.github.io/


Verwijderd

Topicstarter
het is toch te gek voor woorden:

ik heb dit gedaan:

code:
1
2
int keyValue = (int)DGGebruiker.DataKeys[e.Item.ItemIndex];
UpdateCommand.Parameters.Add("@ID", OleDbType.Integer).Value = Convert.ToInt32(DGGebruiker.DataKeys[e.Item.ItemIndex]);


edit:

kleine aanpassing: ipv cmdUpdate heb ik UpdateCommand gebruikt


Na op de updateknop gedrukt te hebben laadt hij de gegevens:
code:
1
2
3
DGGebruiker.EditItemIndex = -1;
DGGebruiker.DataSource = getStuff();
DGGebruiker.DataBind();


maar helaas....geen update van me gegevens... :'( (om moe van te worden he)
(hij haalt ook geen oude waarden op, dat heb ik gesjekt...)

  • gorgi_19
  • Registratie: Mei 2002
  • Laatst online: 20-08 11:40

gorgi_19

Kruimeltjes zijn weer op :9

Heb je uberhaupt je datakeyfield wel goed gedefinieerd?

Digitaal onderwijsmateriaal, leermateriaal voor hbo


  • whoami
  • Registratie: December 2000
  • Laatst online: 22:54
Debug het boeltje eens, en kijk eens wat de waarden die je meegeeft aan de parameters.

https://fgheysels.github.io/


Verwijderd

Topicstarter
gorgi_19 schreef op 06 September 2003 @ 14:20:
Heb je uberhaupt je datakeyfield wel goed gedefinieerd?
ID is gebaseerd op autonummer van access... dus gewoon ID, ook in mijn datakeyfield heb ik daar ID neergezet

  • gorgi_19
  • Registratie: Mei 2002
  • Laatst online: 20-08 11:40

gorgi_19

Kruimeltjes zijn weer op :9

Ik kan me verder alleen voorlopig maar aansluiten bij whoami; Trace is erg handig hiervoor.

Digitaal onderwijsmateriaal, leermateriaal voor hbo


  • whoami
  • Registratie: December 2000
  • Laatst online: 22:54
gorgi_19 schreef op 06 september 2003 @ 14:27:
Ik kan me verder alleen voorlopig maar aansluiten bij whoami; Trace is erg handig hiervoor.
* whoami houdt meer van breakpoints en watches.

https://fgheysels.github.io/


  • gorgi_19
  • Registratie: Mei 2002
  • Laatst online: 20-08 11:40

gorgi_19

Kruimeltjes zijn weer op :9

whoami schreef op 06 september 2003 @ 14:27:
[...]


* whoami houdt meer van breakpoints en watches.
Kan op zich ook gebruikt worden.. :P Misschien nog wel beter in dit geval..
Alleen ik weet niet of de TS VS.Net tot z'n beschikking heeft.

Digitaal onderwijsmateriaal, leermateriaal voor hbo


Verwijderd

Topicstarter
gorgi_19 schreef op 06 September 2003 @ 14:29:
[...]

Kan op zich ook gebruikt worden.. :P Misschien nog wel beter in dit geval..
Alleen ik weet niet of de TS VS.Net tot z'n beschikking heeft.
ik heb idd vs tot mijn beschikking (sinds een week) echter weinig ervaring nog met breakpoints...
Ik heb ze wel geplaatst en opnieuw gedebugged maar ik krijg geen meldingen oid...

  • whoami
  • Registratie: December 2000
  • Laatst online: 22:54
Je moet niet kijken naar welke meldingen je krijgt ofzo.

Gebruik watches, en kijk eens wat de waardes worden van de variabelen gebruiker, paswoord en ID.
Ga na of er wel een record bestaat in je db met dat ID, kijk eens hoe de query - string er nu uit ziet, en probeer die dan eens uit door hem in Access uit te voeren, etc...

https://fgheysels.github.io/

Pagina: 1