[.NET] DataAdapter voegt alleen 'null' toe aan db

Pagina: 1
Acties:

  • Limhes
  • Registratie: Oktober 2001
  • Laatst online: 09-04 16:10
Ik probeer een standaard databinding (noem je dat zo?) op te bouwen door een connection, data-adapter en dataset aan elkaar te linken en dit weer te geven op een datagrid.

Nu heb ik de adapter aan twee commands gehangen (één selectcommand en één insertcommand) en vervolgens de adapter de dataset laten vullen. So far, so good; ik zie de data mooi in de datagrid staan. Als ik nu probeer de data te laten opslaan gaat het echter fout; er worden namelijk alleen null-values opgeslagen...

Ik vraag me nu dus af waar je aangeeft wat er wordt opgeslagen. Ik kan in het insertcommand de parameters aangeven die ge-insert moeten worden, maar vraag me wel af wat in het 'value' vakje kwijt kan. Moet ik dit gewoon leeglaten en snapt de IDE dat ik bedoel dat hij de 'source column' (die ik wel heb ingevuld) moet inserten of niet?

De enige code die effectief iets doet is het volgende (de rest van de gegevens staat in feite in de properties):
Visual Basic .NET:
1
2
3
4
5
6
7
8
9
10
11
12
        Try
            Dim ds As New System.Data.DataSet

            If Me.dsCustomers.HasChanges(DataRowState.Added) Then
                ds = Me.dsCustomers.GetChanges(DataRowState.Added)
                Me.daCustomers.Update(ds, "customers")
            End If

            Me.dsCustomers.AcceptChanges()
        Catch ex As Exception
            MsgBox(ex.ToString, MsgBoxStyle.Critical)
        End Try

  • whoami
  • Registratie: December 2000
  • Laatst online: 15:31
Je InsertCommand heeft een aantal parameters gekregen vermoed ik ?
Heb je ook de source-column name van de parameter gezet ? (Uit je topicstart kan ik dit wel uitmaken).
Heb je ook de 'juiste' naam aan die source-column gehangen ? Ttz, de naam die je in je dataset/datatable hebt ?
De value kan je dan leeglaten, want die wordt door .NET (niet door de IDE, die heeft er niets mee te maken) dan wel automatisch ingevuld adhv je source-column.

En wat bedoel je eigenlijk met 'er worden enkel null-values opgeslagen' ? :?

[ Voor 9% gewijzigd door whoami op 17-09-2005 18:54 ]

https://fgheysels.github.io/


  • Limhes
  • Registratie: Oktober 2001
  • Laatst online: 09-04 16:10
whoami schreef op zaterdag 17 september 2005 @ 18:54:
Je InsertCommand heeft een aantal parameters gekregen vermoed ik ?
Heb je ook de source-column name van de parameter gezet ? (Uit je topicstart kan ik dit wel uitmaken)
Ja
.
Heb je ook de 'juiste' naam aan die source-column gehangen ? Ttz, de naam die je in je dataset/datatable hebt ?
Die namen staan in de 'Tables' property edit onder de juiste tabel. Alleen wanneer ik bij de columns AllowDBNull op false zet wil de volgende regel niet compileren:

Me.daCustomers.Fill(Me.dsCustomers, "customers")

En dat terwijl customers wel de juiste tabel is en verder de relaties wel lijken te kloppen...
De value kan je dan leeglaten, want die wordt door .NET (niet door de IDE, die heeft er niets mee te maken) dan wel automatisch ingevuld adhv je source-column.
Dat is wel fijn om te weten :)
En wat bedoel je eigenlijk met 'er worden enkel null-values opgeslagen' ? :?
De insert lukt wel, dwz er komt wel een nieuwe rij bij in de database (als ik deze bekijk met mysqlfront, mijn frontend). Het enige probleem is dat alle waardes die eigenlijk ingevuld zouden moeten zijn de 'null' waarde bevatten; er wordt dus niet de daadwerkelijke data doorgegeven.

Ik vermoed dat de fout dan ergens tussen de data-adapter en de dataset zit (hoe geeft deze zijn data door?) omdat in het insert command wel staat aangegeven dat de data niet 'null' mag zijn... Moet ik in bovenstaand stuk code nog eea toevoegen zodat de data er werkelijk is?

Verwijderd

Er is iets mis met het insert command. Post de code waarmee je de data adapter aanmaakt, en misschien ook de XML van de dataset.

  • Limhes
  • Registratie: Oktober 2001
  • Laatst online: 09-04 16:10
Verwijderd schreef op zondag 18 september 2005 @ 01:31:
Er is iets mis met het insert command. Post de code waarmee je de data adapter aanmaakt, en misschien ook de XML van de dataset.
Ik heb het nogmaals vrij minimaal overgemaakt, maar dan in code ipv in de IDE. Nu krijg ik de melding dat column 'name' niet 'null' mag zijn, maar dat is hij ook helemaal niet als ik 'm ga updaten...
Visual Basic .NET:
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
' Declaratie gebeuren:
    Friend WithEvents connMySQL As New MySql.Data.MySqlClient.MySqlConnection
    Friend WithEvents daCustomers As New MySql.Data.MySqlClient.MySqlDataAdapter
    Friend WithEvents dcCustomersSelect As New MySql.Data.MySqlClient.MySqlCommand
    Friend WithEvents dcCustomersInsert As New MySql.Data.MySqlClient.MySqlCommand
    Friend WithEvents dcCustomersUpdate As New MySql.Data.MySqlClient.MySqlCommand
    Friend WithEvents dcCustomersDelete As New MySql.Data.MySqlClient.MySqlCommand
    Friend WithEvents dsCustomers As New System.Data.DataSet
' Form_load:
        Me.connMySQL.ConnectionString = "Server=localhost;UserId=root;Password=woordenboek;Database=SunControl"
        Me.connMySQL.Open()

        Me.dcCustomersSelect.Connection = Me.connMySQL
        Me.dcCustomersSelect.CommandText = "SELECT id, name FROM customers"

        Me.dcCustomersInsert.Connection = Me.connMySQL
        Me.dcCustomersInsert.CommandText = "INSERT INTO customers (name) VALUES (@name)"
        Me.dcCustomersInsert.Parameters.Add(New MySql.Data.MySqlClient.MySqlParameter("@name", MySql.Data.MySqlClient.MySqlDbType.String, 50, "name"))

        Me.daCustomers.SelectCommand = Me.dcCustomersSelect
        Me.daCustomers.InsertCommand = Me.dcCustomersInsert
        Me.daCustomers.UpdateCommand = Me.dcCustomersUpdate
        Me.daCustomers.DeleteCommand = Me.dcCustomersDelete

        Me.daCustomers.Fill(Me.dsCustomers)
        Me.dgCustomers.SetDataBinding(Me.dsCustomers, Nothing)
        Me.dgCustomers.Refresh()
' Button_click:
        Try
            Dim dsChanges As New System.Data.DataSet
            If Me.dsCustomers.HasChanges(DataRowState.Added) Then
                MsgBox("ja!")
                dsChanges = Me.dsCustomers.GetChanges(DataRowState.Added)
                ' en de vreemde dingen gebeuren altijd hier:
                Me.daCustomers.Update(Me.dsCustomers)
                Me.dsCustomers.AcceptChanges()
            End If
        Catch ex As Exception
            MsgBox(ex.ToString)
        End Try

De foutmelding hierop is: "Column 'name' cannot be null"

  • gorgi_19
  • Registratie: Mei 2002
  • Laatst online: 27-04 18:17

gorgi_19

Kruimeltjes zijn weer op :9

Is Name niet een reserved word in MySQL?

Digitaal onderwijsmateriaal, leermateriaal voor hbo


  • Limhes
  • Registratie: Oktober 2001
  • Laatst online: 09-04 16:10
gorgi_19 schreef op zondag 18 september 2005 @ 11:57:
Is Name niet een reserved word in MySQL?
Volgens de highlighter niet...

Maar ik heb de fout al gevonden! Tegen alle tutorials en manuals in blijkt de '@' de boosdoener. Hetgeen ik gebruik in de insert query schijnt een 'named parameter' te zijn, die je moet aangeven met een '?' ipv een '@'. En daar kun je dan uren naar kijken zonder erachter te komen!

Maar toch bedankt voor alles :). Mocht er nog iets zijn dat eventueel vies is of mooier kan qua opbouw dan spui maar...

  • whoami
  • Registratie: December 2000
  • Laatst online: 15:31
De @ -parameters worden alleszins gebruikt bij MS databases. Ik kan me echter wel herinneren dat ik ook eens de ? placeholder heb moeten gebruiken, en dat zal ws bij oracle DB's geweest zijn.

https://fgheysels.github.io/


  • Limhes
  • Registratie: Oktober 2001
  • Laatst online: 09-04 16:10
Hmm, ik heb geen ervaring met andere db's dan MySQL (kom uit de PHP wereld) en vanwege de koppeling met internet blijft deze toch wel fijn. Maar ik vind 't wel behoorlijk krom dat deze benadering verschilt per database; je zou toch zeggen dat dit in ADO.NET voor alle db's gelijk gemaakt zou kunnen worden?
Pagina: 1