[ASP.NET/C#] Update_Command update niet

Pagina: 1
Acties:

  • Lukin
  • Registratie: Mei 2006
  • Niet online
Ik ben bezig met de voorbereidingen voor mijn tentamen ASP.net over 3 weken en probeer een voorbeeld te creeren van een update_command in een datagrid, toegevoegd via de property builder. Ik maak gebruik van een SQL server database.

Zoals de topic eigenlijk ook al aangeeft is mijn probleem dat er niet wordt upgedate. Als ik de Command.Text omzet naar een string kan ik zien dat hij de oude values pakt en niet de nieuwe die ik in de textbox heb ingevoerd.

Mijn DataGrid heeft autogeneratecolumns op false staan en edit is de laatse Cell in de DataGrid.

Hij geeft keurig aan dat hij de query succesvol heeft uitgevoerd via de try and catch.

Alle hulp is welkom, Alvast bedankt.

Dit is de code die ik heb:

C#:
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
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
using System.Data.SqlClient;

public class WebForm1 : System.Web.UI.Page
    {
        protected System.Web.UI.WebControls.DataGrid DataGrid1;
        protected System.Web.UI.WebControls.Label lblMelding;
        protected string connStr = "Data source=(local);Database=Northwind;Integrated Security = true";
    
    
private void Page_Load(object sender, System.EventArgs e)
        {
            
            FillProducts();

        }


private void FillProducts()
        {
            SqlConnection main = new SqlConnection();

            main.ConnectionString = connStr;
            
            string SQL = "SELECT ProductID, ProductName, SupplierID, CategoryID, QuantityPerUnit, UnitPrice, UnitsInStock, UnitsOnOrder, ReorderLevel FROM Products";

            SqlDataAdapter myAdapter = new SqlDataAdapter(SQL, main);

            DataSet myDS = new DataSet();

            myAdapter.Fill(myDS);

            DataGrid1.DataSource = myDS;

            DataGrid1.DataBind();

            main.Close();
        }


private void DataGrid1_EditCommand(object source, System.Web.UI.WebControls.DataGridCommandEventArgs e)
        {
            DataGrid1.EditItemIndex = e.Item.ItemIndex;
            DataGrid1.DataBind() ;
        }


private void DataGrid1_CancelCommand(object source, System.Web.UI.WebControls.DataGridCommandEventArgs e)
        {
            DataGrid1.EditItemIndex = -1;
            DataGrid1.DataBind();
        }


private void DataGrid1_UpdateCommand(object source, System.Web.UI.WebControls.DataGridCommandEventArgs e)
        {
            
            int ProductID;
            ProductID = Convert.ToInt32((e.Item.Cells[0].Controls[0] as TextBox).Text);

            string prodName; 
            prodName = (e.Item.Cells[1].Controls[0] as TextBox).Text;
            
            int supID;
            supID =  Convert.ToInt32((e.Item.Cells[2].Controls[0] as TextBox).Text);

            int catID;
            catID = Convert.ToInt32((e.Item.Cells[3].Controls[0] as TextBox).Text);

            SqlConnection conn = new SqlConnection();

            conn.ConnectionString = connStr;

            SqlCommand update = new SqlCommand();
                
            update.Connection = conn;

            conn.Open();

            update.CommandText = "UPDATE Products SET ProductName = '" + prodName + "'" + "," + " SupplierID = " + supID + "," + " CategoryID = " + catID + " WHERE ProductID = " + ProductID;

            try
            {
                update.ExecuteNonQuery();
                lblMelding.Text = "Rij succesvol ge-update.";
            }
            catch (Exception ex)
            {
                lblMelding.Text = "Fout bij het updaten." + ex.ToString();
            }

            conn.Close();

            DataGrid1.EditItemIndex = -1;

            DataGrid1.DataBind();

        }

[ Voor 5% gewijzigd door NMe op 30-05-2006 20:50 . Reden: Code tags toegevoegd. Doe je dat de volgende keer zelf? ]


  • whoami
  • Registratie: December 2000
  • Laatst online: 20-02 21:53
Gebruik parametrized queries , bind de parameters aan de goede columns in je grid, etc...

Print je query eens af voor je hem uitvoert, en bekijk hem ff. Wees ook indachtig dat je problemen kunt hebben met sql injection, problemen met datums, etc.... Daarom dus die parametrized queries gebruiken.

Verder is het niet de bedoeling dat je hier al je code zomaar dumpt, het is niet de bedoeling dat wij die voor jou debuggen.
Debuggen is iets wat je zelf moet kunnen, dus, loop eens stap voor stap door je code, bekijk de query die naar de server gestuurd wordt, etc....

Zet ook de Close() van de connection in het finally block, dan ben je zeker dat je connectie altijd gesloten wordt.

https://fgheysels.github.io/


  • Lukin
  • Registratie: Mei 2006
  • Niet online
Bedankt voor de snelle reply, zal er rekening mee houden. Zal de suggesties doorvoeren :)

  • Lukin
  • Registratie: Mei 2006
  • Niet online
Suggesties doorgevoerd maar op de een of andere manier krijgt de query niet de nieuwe waarden die ik invoer in de textboxen en gebruikt hij vrolijk de oude waarden van het moment dat er op de Edit knop gedrukt werdt. De query wordt gewoon uitgevoerd volgens de try and catch.

In andere woorden hij pakt de nieuwe waarden niet. Zit nu al een tijdje te stoeien met het probleem maar kan geen antwoord vinden. Iemand met een idee waarom dit gebeurd ?

Alvast bedankt

[ Voor 7% gewijzigd door Lukin op 30-05-2006 11:18 ]


  • gorgi_19
  • Registratie: Mei 2002
  • Laatst online: 20-02 14:52

gorgi_19

Kruimeltjes zijn weer op :9

Je controleert niet op Page.IsPostback

Digitaal onderwijsmateriaal, leermateriaal voor hbo


  • Lukin
  • Registratie: Mei 2006
  • Niet online
Ik ben er een beetje bekend mee, zal eens kijken wat en belangrijker waar het moet staan. Bedankt voor de tip :)

[ Voor 3% gewijzigd door Lukin op 30-05-2006 11:58 ]


  • Lukin
  • Registratie: Mei 2006
  • Niet online
Ik kom er helaas niet uit :/ :?

Als ik het goed begrijp moet hij bij if(IsPostBack) opnieuw de waarde uit de textboxen halen voordat deze naar de query gaan. Maar hoe ik doet moet doen is mij een raadsel.

Als ik de Postback bij het update_command plaats dan hij weigert uit de edit mode te gaan. En als ik fillProducts(); als if(!IsPostBack) alleen als de pagina voor het eerst geladen wordt maar dan weigert hij als ik op de edit knop klik de datagrid weer te geven en bij IsPostBack dan weigert hij het bij het opstarten :)

Heb wat meer hulp nodig dus mocht iemand enige ideen hebben wat ik fout doe graag :)

Alweer bedankt :)

[ Voor 4% gewijzigd door Lukin op 30-05-2006 12:26 ]


  • TeeDee
  • Registratie: Februari 2001
  • Laatst online: 11:47

TeeDee

CQB 241

Worden de waardes in de database wel geupdate?

Bind je de datagrid wel opnieuw?

C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
void Page_Load {
   if(!(IsPostBack))
   {
     fillproducts()
   }
}


void Edit / Update / Cancel Command 
{
 ... voer je edit command...
   fillproducts() // dus bind je products opnieuw aan de grid
}


of begrijp ik het nu niet?

Heart..pumps blood.Has nothing to do with emotion! Bored


  • Lukin
  • Registratie: Mei 2006
  • Niet online
Nu doet hij het ( teminste nog niet, maar ik ben een stap verder ) en geeft hij aan dat hij de nieuwe waarde meeneemt, maar nu heb ik een ander probleem en daar ga ik nu aanzitten. Input string is niet in het juiste format.

Bedankt voor de hulp, ik ga weer sleutelen. :*)

  • Lukin
  • Registratie: Mei 2006
  • Niet online
*sleutel .. sleutel.. sleutel* :/

Op het moment crashed hij dus ( nog steeds :'( ) met de volgende error:

Input string was not in a correct format.

Deze error verwijst naar ProductID. Als ik het ProductID omzet naar een string dan worden de nieuwe waardes wel uitgelezen, dit neem ik aan naar aanleiding van het uitlezen van de aangepaste textboxen naar labels en crashed hij niet en het feit dat in mijn vorige versie ook de waardes keurig worden doorgegeven aan de query, alleen het ProductID niet.

Maar dan kijk ik naar de query die ook wordt uitgelezen en dan laat hij leuk de letterlijke query zien. In de database is ProductID natuurlijk een Integer waardoor het aanwijzen als string niet kan....

suggesties iemand ? :)

[ Voor 12% gewijzigd door Lukin op 30-05-2006 14:48 ]


  • whoami
  • Registratie: December 2000
  • Laatst online: 20-02 21:53
Hoe bouw je je query nu op ?

https://fgheysels.github.io/


  • Lukin
  • Registratie: Mei 2006
  • Niet online
Ik heb hem opgebouwd naar aanleiding van een voorbeeld dat ik tegenkwam na wat googlen, hij is nu als volgt opgebouwd:

-------------------------------------------
code:
1
2
3
4
5
6
7
8
9
10
11
12
updateCommand.Parameters.Add(new SqlParameter("@ProductID", SqlDbType.VarChar));
updateCommand.Parameters["@ProductID"].Value = ProductID;

updateCommand.Parameters.Add(new SqlParameter("@ProductName", SqlDbType.VarChar));
updateCommand.Parameters["@ProductName"].Value = prodName;

updateCommand.Parameters.Add(new SqlParameter("@SupplierID", SqlDbType.Int)); updateCommand.Parameters["@SupplierID"].Value = supID;

updateCommand.Parameters.Add(new SqlParameter("@CattegoryID", SqlDbType.Int));
updateCommand.Parameters["@CattegoryID"].Value = catID;

updateCommand.CommandText = "UPDATE Products SET ProductName = @ProductName, SupplierID = @SupplierID, CategoryID = @CattegoryID WHERE ProductID = @ProductID";

-----------------------------------------------
ProductID staat op het moment op VarChar vanwege de redenen in de vorige post.

[ Voor 89% gewijzigd door Lukin op 30-05-2006 21:00 ]


  • whoami
  • Registratie: December 2000
  • Laatst online: 20-02 21:53
Als ProductID een integer is in je DB, dan moet je 'm ook als integer aan je parameters toevoegen.
Als je variable ProductID een string is, dan kan je die toch omzetten naar een int ?

code:
1
updateCommand.Parameters["@ProductId"].Value = Convert.ToInt32 (ProductID);

https://fgheysels.github.io/


  • Lukin
  • Registratie: Mei 2006
  • Niet online
Dat dacht ik dus eerst ook, maar het enige wat dat doet is de error verplaatsen van de oorspronkelijk plaats waar ik ProductID als Integer had aangeduid naar die plaats.

Mischien dat als ik de error code erbij doe dat het wat duidelijker wordt:

Input string was not in a correct format.
Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code.

Source Error:

Line 115: updateCommand.Parameters.Add(new SqlParameter("@ProductID", SqlDbType.VarChar));
Line 116: updateCommand.Parameters["@ProductID"].Value = Convert.ToInt32(ProductID);
Line 117:
Line 118: updateCommand.Parameters.Add(new SqlParameter("@ProductName", SqlDbType.VarChar));

[ Voor 66% gewijzigd door Lukin op 30-05-2006 20:50 ]


  • NMe
  • Registratie: Februari 2004
  • Laatst online: 22-01 23:51

NMe

Quia Ego Sic Dico.

Ik zie nu al 3 keer twee posts van jouw hand onder elkaar staan, Lukin. Hier op GoT is het gebruikelijk om je post te editen als je zelf de laatste poster bent in een topic en de laatste reactie is minder dan 24 uur oud. Dit bespaart overbodige replies en zet je topic niet op een oneerlijke manier bovenaan neer. Mensen zie je topic ook wel zonder het omhoog te schoppen. ;)

Overigens heb ik [code=c#]-tags toegevoegd aan je startpost. Wil je die in het vervolg zelf gebruiken? Hoe dat werkt kun je nalezen in Hoe post je code? / Hoe gebruik je de code tag?. :)

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


  • whoami
  • Registratie: December 2000
  • Laatst online: 20-02 21:53
Als je je parameter als Varchar definieert, moet je dan natuurlijk geen integer meegeven als waarde.
Als je een integer meegeeft als waarde, moet je ook je parameter als integer definieren.
Kijk eens naar lijn 115; daar zeg je dat die parameter / dat veld in je DB een varchar is, en je geeft een int mee.

https://fgheysels.github.io/


  • Lukin
  • Registratie: Mei 2006
  • Niet online
Bedankt voor de info, was zelf ook al op zoek hoe je die code optie tevoorschijn kreeg :)

Met betrekking tot die VarChar, ik kan hem op .Int zetten zoals het inderdaad in de database moet komen maar dan blijft hij heel leuk die error geven. Als ik de .Int laat staan en de Convert.ToInt32 weg haal dan dan vang ik een exceptie op op deze regel line 136):
code:
1
                   updateCommand.ExecuteNonQuery();


complete exeption
code:
1
2
3
4
5
Fout bij het updaten.System.FormatException: Input string was not in a correct format. 
at System.Data.SqlClient.SqlCommand.ExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream) 
at System.Data.SqlClient.SqlCommand.ExecuteNonQuery() 
at update.WebForm1.DataGrid1_UpdateCommand(Object source, DataGridCommandEventArgs e)
in c:\inetpub\wwwroot\update\webform1.aspx.cs:line 136

Dus weer terug bij af :)

[ Voor 8% gewijzigd door Lukin op 30-05-2006 21:09 ]


  • whoami
  • Registratie: December 2000
  • Laatst online: 20-02 21:53
Wat zit er in ProductID ?
Heb je dat al eens bekeken mbhv een watch ? Of heb je de inhoud van ProductID al eens ge-outputted ?

Het is iig zo dat je je parameter als int moet definieren, en je productId als Int aan die parameter moet toewijzen.
Echter, aangezien je die error blijft krijgen, moet het zijn dat er in ProductID een waarde zit die niet naar een integer kan omgezet worden.

https://fgheysels.github.io/


  • Lukin
  • Registratie: Mei 2006
  • Niet online
Zou niet weten wat een watch is of hoe dat werkt :)

(Database) ProductID is natuurlijk autonumber.

Heb net geprobeerd het ProductID via een label tevoorschijn te krijgen maar hij laat niets zien. Net zoals bij de vorige versie, zonder parameters, ziet hij blijkbaar dus geen ProductID, of geeft hij hem in ieder geval dus geen waarde mee.

code:
1
2
3
4
5
6
7
8
9
10
<asp:datagrid id="DataGrid1" style="Z-INDEX: 101; LEFT: 32px; POSITION: absolute; TOP: 184px"
                runat="server" AutoGenerateColumns="False">
                <Columns>
                    <asp:BoundColumn Visible="False" DataField="ProductID" SortExpression="ProductID" HeaderText="ProductID"></asp:BoundColumn>
                    <asp:BoundColumn DataField="ProductName" SortExpression="ProductName" HeaderText="ProductName"></asp:BoundColumn>
                    <asp:BoundColumn DataField="SupplierID" SortExpression="SupplierID" HeaderText="SupplierID"></asp:BoundColumn>
                    <asp:BoundColumn DataField="CategoryID" SortExpression="CategoryID" HeaderText="CategoryID"></asp:BoundColumn>
                    <asp:EditCommandColumn ButtonType="LinkButton" UpdateText="Update" CancelText="Cancel" EditText="Edit"></asp:EditCommandColumn>
                </Columns>
            </asp:datagrid>


De cell van de DataGrid waarin ProductID zit is 0 dus daar light het niet aan denk ik.

[ Voor 35% gewijzigd door Lukin op 30-05-2006 21:36 ]


  • whoami
  • Registratie: December 2000
  • Laatst online: 20-02 21:53
Dan wil het zeggen dat ProductID leeg is.

https://fgheysels.github.io/


  • Lukin
  • Registratie: Mei 2006
  • Niet online
Het ziet er naar uit dat hij blijkbaar leeg is inderdaad terwijl als ik de column op visible zet en op edit druk er wel degelijk waarden in de textboxen staan. Mijn kennis van ASP.net is niet groot maar als de methodes werken voor de 3 andere attributen waarom zou hij dan niet ProductID pakken. Waar zou het verschil zitten ?

[ Voor 7% gewijzigd door Lukin op 30-05-2006 21:40 ]

Pagina: 1