Toon posts:

[VB.NET] datagridview - dataset - database

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

Verwijderd

Topicstarter
Ik heb een datagridview aan mijn form toegevoegd. Het is de bedoeling dat data uit de database wordt ingeladen in de datagridview en wijzigingen van de datagridview in de database worden geupdate.

Visual Basic .NET:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
Public Class AccountImport
    Dim con As SqlConnection = ConSingleton.Instance
    Dim dataset As DataSet
    Dim adapter As SqlDataAdapter

    Private Sub form_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

        dataset = New DataSet
        adapter = New SqlDataAdapter("select * from Accounts", con)
        Dim commandbuilder As New SqlCommandBuilder(adapter)
        adapter.Fill(dataset, "Accounts")

        DataGridView.DataSource = dataset
        DataGridView.DataMember = "Accounts"

    End Sub

Private Sub DataGridView_CellValueChanged(ByVal sender As Object, ByVal e As System.Windows.Forms.DataGridViewCellEventArgs) Handles DataGridView.CellValueChanged
        adapter.Update(dataset, "Accounts")
End Sub
End Class


Het laden van de data naar de datagridview gaat prima, veranderingen in de datagridview worden echter niet doorgegeven aan de database. Ik ben al nagegaan dat de code van de CellValueChanged method wordt uitgevoerd bij een wijziging van de datagridview. Ik zie echter niet waar de fout kan liggen.

Bovenstaande code is naar voorbeeld van:
http://www.csharp-station...s/AdoDotNet/Lesson05.aspx

  • whoami
  • Registratie: December 2000
  • Laatst online: 00:54
Heb je al eens een breakpoint gezet in de body van je eventhandler ?
Heb je al eens gekeken (mbhv sql profiler) wat er precies naar de DB gestuurd wordt ?

Ik denk trouwens dat, als je cellvalue veranderd is, je row daarom nog niet als 'modified' gemarkeerd is, maar ik kan verkeerd zijn.
Wat beter zou zijn, is dat je die event aan de columnchanged of rowchanged event koppelt van je DataTable.

Zowiezo vind ik het geen goed idee om bij iedere cell-value change een update te gaan doen in je DB.

https://fgheysels.github.io/


Verwijderd

Topicstarter
whoami schreef op dinsdag 15 mei 2007 @ 21:48:
Heb je al eens een breakpoint gezet in de body van je eventhandler ?
Heb je al eens gekeken (mbhv sql profiler) wat er precies naar de DB gestuurd wordt ?

Ik denk trouwens dat, als je cellvalue veranderd is, je row daarom nog niet als 'modified' gemarkeerd is, maar ik kan verkeerd zijn.
Wat beter zou zijn, is dat je die event aan de columnchanged of rowchanged event koppelt van je DataTable.

Zowiezo vind ik het geen goed idee om bij iedere cell-value change een update te gaan doen in je DB.
Ik had al een breakpoint in de eventhandler gezet, de code wordt uitgevoerd bij elke cel die wordt veranderd. Volgens mij beschikt SQL Server Express niet over de sql profiler, de map performance tools is per onderstaande pagina immers niet aanwezig:

http://msdn2.microsoft.com/en-us/library/ms181091.aspx

p.s. Hoe zou de event handler voor de rowchanged er uit zien in mijn geval, zonder IDE hulp is het aardig lastig.

  • barfieldmv
  • Registratie: Maart 2004
  • Laatst online: 10-10 12:36
Verwijderd schreef op dinsdag 15 mei 2007 @ 21:37:
Ik heb een datagridview aan mijn form toegevoegd. Het is de bedoeling dat data uit de database wordt ingeladen in de datagridview en wijzigingen van de datagridview in de database worden geupdate.

Visual Basic .NET:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
Public Class AccountImport
    Dim con As SqlConnection = ConSingleton.Instance
    Dim dataset As DataSet
    Dim adapter As SqlDataAdapter

    Private Sub form_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

        dataset = New DataSet
        adapter = New SqlDataAdapter("select * from Accounts", con)
        Dim commandbuilder As New SqlCommandBuilder(adapter)
        adapter.Fill(dataset, "Accounts")

        DataGridView.DataSource = dataset
        DataGridView.DataMember = "Accounts"

    End Sub

Private Sub DataGridView_CellValueChanged(ByVal sender As Object, ByVal e As System.Windows.Forms.DataGridViewCellEventArgs) Handles DataGridView.CellValueChanged
        adapter.Update(dataset, "Accounts")
End Sub
End Class


Het laden van de data naar de datagridview gaat prima, veranderingen in de datagridview worden echter niet doorgegeven aan de database. Ik ben al nagegaan dat de code van de CellValueChanged method wordt uitgevoerd bij een wijziging van de datagridview. Ik zie echter niet waar de fout kan liggen.

Bovenstaande code is naar voorbeeld van:
http://www.csharp-station...s/AdoDotNet/Lesson05.aspx
Doet die command builder wel iets? Een regel code lijkt me zelf heel miniem (en als het werkt moet ik me daar toch eens in verdiepen)

Probeer de update command eens uit te lezen
String sql = DataAdapter.Updatecommand.commandtext oid.

[ Voor 3% gewijzigd door barfieldmv op 15-05-2007 22:45 ]


  • whoami
  • Registratie: December 2000
  • Laatst online: 00:54
Hij maakt mbhv de command-builder z'n insert / update en delete statements aan.

https://fgheysels.github.io/


Verwijderd

Topicstarter
De updatecommandtext bestaat inderdaad niet. Morgen nog maar een beetje puzzelen.

  • whoami
  • Registratie: December 2000
  • Laatst online: 00:54
Heeft je tabel geen primary key ofzo ?

https://fgheysels.github.io/


Verwijderd

Topicstarter
whoami schreef op dinsdag 15 mei 2007 @ 23:26:
Heeft je tabel geen primary key ofzo ?
Jewel, op de eerste colom. Met identity specification.

Verwijderd

Topicstarter
Een kleine update: Ik heb de Datagrid_CellChanged herschreven naar een Datatable_RowChanged event. Als ik nu echter een breakpoint in de eventhandler zet, wordt de code niet uitgevoerd bij het veranderen van een cel. Bij de DatagridCellChanged was dit wel het geval. Het probleem ligt dus waarschijnlijk bij het updaten van de veranderingen in de datagridview naar de dataset/datatable.

Visual Basic .NET:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
    Private Sub AccountImport_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        'Set Datagridview and account combobox
        dataset = New DataSet
        datatable = New DataTable("Accounts")
        adapter = New SqlDataAdapter("select * from Accounts", con)
        adapter.Fill(dataset, datatable.TableName)

        commandbuilder = New SqlCommandBuilder(adapter)

        DataGridView.DataSource = dataset
        DataGridView.DataMember = datatable.TableName
    End Sub

    Private Sub datatable_RowChanged(ByVal sender As Object, ByVal e As System.Data.DataRowChangeEventArgs) Handles datatable.RowChanged
        adapter.Update(dataset, datatable.TableName)
    End Sub

End Class

  • whoami
  • Registratie: December 2000
  • Laatst online: 00:54
Nu, tuurlijk wordt de eventhandler nu niet aangeroepen als je een cell gewijzigd hebt; je row is nl nog niet gewijzigd. Je row zal pas gewijzigd zijn als je de row verlaat.

Als je echter geen UpdateCommand hebt, dan kan hij (de adapter) ook niet updaten. Hij weet nl. niet hoe hij dat moet doen; hij heeft geen Update SQL commando.

[ Voor 32% gewijzigd door whoami op 16-05-2007 22:12 ]

https://fgheysels.github.io/


Verwijderd

Topicstarter
whoami schreef op woensdag 16 mei 2007 @ 22:11:
Nu, tuurlijk wordt de eventhandler nu niet aangeroepen als je een cell gewijzigd hebt; je row is nl nog niet gewijzigd. Je row zal pas gewijzigd zijn als je de row verlaat.
Ook als ik de row verlaat (een andere row selecteer na het editten), worden de veranderingen niet geupdate.

Verwijderd

Topicstarter
Ik heb update command even in een button click event gezet (waarbij ik klik nadat ik iets heb geupdate). In dat geval gaat updaten wel goed. Ik moet dus alleen nog een goed event vinden voor mijn update regel. :)

Verwijderd

Verwijderd schreef op woensdag 16 mei 2007 @ 22:29:
Ik heb update command even in een button click event gezet (waarbij ik klik nadat ik iets heb geupdate). In dat geval gaat updaten wel goed. Ik moet dus alleen nog een goed event vinden voor mijn update regel. :)
Dat komt omdat die button waarschijnlijk een CommandName heeft waar op gereageerd wordt ;)

Bedtijd voor Exiss

[ Voor 5% gewijzigd door Verwijderd op 16-05-2007 23:21 ]


  • whoami
  • Registratie: December 2000
  • Laatst online: 00:54
Eh? CommandName, da's ASP.NET. Hier gaat het over WinForms.
Als hij in z'n button-click expliciet een SqlCommand aanmaakt met een update statement etcetera, dan heeft dit zowiezo niets met command-name te maken.

https://fgheysels.github.io/


Verwijderd

whoami schreef op woensdag 16 mei 2007 @ 23:16:
Eh? CommandName, da's ASP.NET. Hier gaat het over WinForms.
Als hij in z'n button-click expliciet een SqlCommand aanmaakt met een update statement etcetera, dan heeft dit zowiezo niets met command-name te maken.
}:O :O Ff wat gemist geloof ik :+
Pagina: 1