none
numerische spalten und werte... RRS feed

  • Frage

  • Hallo,

    uff..so jetzt gehen die eigentlichen Probleme los :)

    Alos, ich habe eine ACCESS Mappe per

    CREATE Statement erstellt, dabei eine Spalte
    mit RabattSatz numeric(6,2) in diesem Statement...

    Wird in ACCESS auch soweit korrekt dargestellt.

    wenn ich jetzt per OleDbDataAdapter den Spaltenwert mit

    19.25 oder 19,25 oder "19.25" oder "19,25" von VB aus zu schreiben versuche bekomme ich in dem Feld
    immer nur 1925,00 unter ACCESS angezeigt... Muss ich beim OleDbDataAdapter irgendwo noch das Dezimaltrennzeichen definieren ?

    Gibt es irgendwo eine Basisklasse für numerische Textboxen ? Im Web gibts zwar hundetausendeinträge wie man nur numerische
    Eingaben in einer Textbox zulässt, aber nicht das ganze drum herum..
    Sprich wenn die Spalte nur 3 vorkommastellen zulässt und nur 2 nachkommastellen, dann darf der User auch nicht mehr eingeben.
    Mit MaxTextlengh funktioniert das ganze nicht wirklich. Ebenfalls das ein leeres Feld nicht "leer" dargestellt wird, sondern 0,00 ...

    Im Datagridview wird mir diese Numerische Spalte augenscheinlich als Text dargestellt ( linksbündig).
    Muss ich im Adapter.Fill noch was einstellen, damit numierische Spalten automatisch korrekt dargestellt
    werden (rechtsbündig mit Dezimaltrennzeichen und gründsätzlich 2 0en..

    Danke euch wie immer !

    Mario

    Donnerstag, 15. Juli 2010 15:13

Antworten

  • Hallo Mario,

    wie schon mehrfach angesprochen, gibt es in einer Jet-DB
    keine Vor- oder Nachkommastellen. Dies sind rein Access-
    interne Formatierungsanweisungen. Für das Speichern von
    Zahlenwerten mit beliebiger Anzahl von Vor- und Nachkommastellen
    brauchst Du einfach ein Feld vom Typ Single, Double oder Währung
    (currency).

    Um einen neuen Datensatz in der DB zu speichern, brauchst Du
    einen Insert-Command. Um einen vorhandenen Datensatz in der
    DB zu verändern (eines oder auch mehrere Felder) brauchst Du
    einen Update-Command. Wenn es nur darum geht, brauchst Du
    weder einen DataAdapter noch eine DataTable.

    Unter

        www.gssg.de -> Visual Basic -> VB.net
            -> Datenbank
                -> DB CommandObjekt / DataReader

    findest Du ein Programm in dem Du Dir die Arbeitsweise der
    verschiedenen Commands (Insert, Update, Delete) ansehen
    kannst.
    Um von vorneherein erst gar kein Problem mit unterschiedlichen
    Dezimaltrennern (Punkt, Komma) entstehen zu lassen, solltest Du
    Werte nicht direkt in Deine CommandTexte eintragen, sondern
    immer mit Parameter-Objekten arbeiten. Auch das siehst Du in
    dem o.g. Beispiel.

    Gruß aus St.Georgen
    Peter Götz
    www.gssg.de (mit VB-Tipps u. Beispielprogrammen)

    Donnerstag, 22. Juli 2010 08:35
  • Hallo,

    Hier mal ein kompl. ablauffähiges Beispiel, mit dem Du
    einen neuen Datensatz in die Tabelle "Tabelle" einer Access.mdb
    schreiben kannst.
    Die Tabelle muss ein Feld "ID" vom Typ Integer enthalten,
    welches auch als Primärschlüssel definiert ist. Ein als
    Primärschlüssel definiertes Feld ist für den CommandBuilder
    erforderlich, damit er mit den von ihm gebildeten Commands
    jeweils einen ganz bestimmten Datensatz eindeutig adressieren kann.

    Public Class Form1
        Private mDA As OleDb.OleDbDataAdapter
        Private mDT As DataTable
        Private mCB As OleDb.OleDbCommandBuilder
        Private mCNN As OleDb.OleDbConnection
        Private DGV As DataGridView
        Private WithEvents BtnNew As Button

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

            DGV = New DataGridView
            With DGV

                .SetBounds _
                        (10, 10, _
                         Me.ClientSize.Width - 20, _
                         Me.ClientSize.Height - 70)

                .Anchor = _
                        AnchorStyles.Left Or _
                        AnchorStyles.Top Or _
                        AnchorStyles.Right Or _
                        AnchorStyles.Bottom

                .AllowUserToAddRows = False

            End With
            Me.Controls.Add(DGV)

            BtnNew = New Button
            With BtnNew
                .Font = New Font("Arial", 10)
                .Name = "BtnNew"
                .SetBounds(10, DGV.Bottom + 10, 120, 40)
                .Text = "New Record"

                .Anchor = _
                        AnchorStyles.Left Or _
                        AnchorStyles.Bottom

            End With
            Me.Controls.Add(BtnNew)

            CreateData()

            DGV.DataSource = mDT
        End Sub


        Private Sub Form1_FormClosing _
                (ByVal sender As Object, _
                 ByVal e As System.Windows.Forms.FormClosingEventArgs _
                ) Handles Me.FormClosing

            If mCNN IsNot Nothing Then

                If mCNN.State And ConnectionState.Open = _
                        ConnectionState.Open Then

                    mCNN.Close()
                End If

            End If
        End Sub


        Private Sub BtnNew_Click _
                (ByVal sender As Object, _
                 ByVal e As System.EventArgs _
                ) Handles BtnNew.Click

            ' Neuen Datensatz erstellen und in der DB speichern
            InsertNewRecord()

        End Sub

        Private Sub Form1_Click _
                (ByVal sender As Object, _
                 ByVal e As System.EventArgs _
                 ) Handles Me.Click

            ' zum Testen der Function GetNextID
            MsgBox(GetNextID, MsgBoxStyle.Information)
        End Sub

        Private Function GetNextID() As Integer
            ' Liefert die in der DB-Tabelle enthaltene höchste ID + 1
            Dim Cmd As New OleDb.OleDbCommand _
                    ("Select Max(ID) From Tabelle", mCNN)

            Dim Ret As Object

            Ret = Cmd.ExecuteScalar
            If Ret = Nothing Then
                Return 1
            Else
                Return CInt(Ret) + 1
            End If
        End Function

        Private Sub InsertNewRecord()
            Dim DR As DataRow
            DR = mDT.NewRow
            Dim ID As Integer = GetNextID()

            With DR
                .Item(0) = ID
                .Item(1) = "Hallo Welt"
                .Item(2) = 25.4
                .Item(3) = "Admin"
                .Item(4) = Now
            End With

            mDT.Rows.Add(DR)

            MsgBox _
                (mCB.GetInsertCommand.CommandText, _
                 MsgBoxStyle.Information)

            mDA.Update(mDT)

        End Sub

        Private Sub CreateData()
            mCNN = GetConnection("D:\DataBases\DB2002.mdb")
            mCNN.Open()

            mDA = _
                    New OleDb.OleDbDataAdapter _
                    ("Select * From Tabelle", mCNN)

            mDA.MissingSchemaAction = _
                    MissingSchemaAction.AddWithKey


            mDT = New DataTable
            mDA.FillSchema(mDT, SchemaType.Mapped)

            mCB = New OleDb.OleDbCommandBuilder(mDA)
        End Sub

        Private Function GetConnection _
                (ByVal FileName As String) As OleDb.OleDbConnection

            Dim CSB As New OleDb.OleDbConnectionStringBuilder
            Dim CNN As OleDb.OleDbConnection

            With CSB
                .DataSource = FileName
                .Provider = "Microsoft.Jet.OLEDB.4.0"

                ' Connectionpooling ausschalten
                .OleDbServices = -4

                ' DB im geteilten Modus öffnen
                .Add("Mode", "Share Deny None")

                ' Pagelocking ab Access-Version 2000
                .Add("Jet OLEDB:Database Locking Mode", 1)
            End With

            CNN = New OleDb.OleDbConnection(CSB.ConnectionString)
            Return CNN
        End Function

    End Class

    Nach dem Programmstart siehst Du eine Form mit einem
    DataGridView sowie einem Button "New Record".
    Das DataGridView ist nach dem Programmstart erst mal
    leer, da mit DataAdapter.FillSchema nur das Tabellenschema
    jedoch keine Daten in die DataTable (mDT) geladen werden.
    Mit jedem Klick auf den Button "New Record" kannst Du
    nun einen neuen Datensatz erzeugen, der sofort im DGV
    sichtbar wird und auch gleich in der DB-Tabelle gespeichert
    wird.

    Gruß aus St.Georgen
    Peter Götz
    www.gssg.de (mit VB-Tipps u. Beispielprogrammen)

    Donnerstag, 22. Juli 2010 11:29

Alle Antworten

  • Hallo Mario,

    mit "ACCESS Mappe" meinst Du vermutlich eine Tabelle in
    einer Access-Datenbankdatei (*.mdb)?

    Handelt es sich dabei um eine bereits bestehende *.mdb
    oder hast Du diese selbst via Programmcode erstellt?
    Wenn ja, wie?

    Wie genau sieht Dein Commandobjekt (Code) mit Deinem
    CREATE-Statement aus?

    Sofern Du numerische Werte via Programmcode in ein numerisches
    Feld einer Tabelle Deiner *.mdb schreibst, gilt dafür die internationale
    (engl.) Schreibweise mit dem Punkt als Dezimaltrenner.

    Das Problem "Punkt oder Komma" kannst Du aber ganz einfach durch
    Verwendung von Parameter-Objekten vermeiden.

    Aus Deiner Beschreibung wird nicht ersichtlich wie Du Deine
    Eingabefelder (Textboxen?) an die zugrundeliegende DataTable
    gebunden hast, bzw. ob Du überhaupt mit Datenbindung arbeitest.

    Unter

        www.gssg.de -> Visual Basic -> VB.net
            -> Datenbank
            -> DataGridView
            -> DataTable / DataView / CurrencyManager

    findest Du eine Reihe von Beispielen bei denen Textboxen und/oder
    DataGrid/DataGridView an DataTables resp. DataViews gebunden
    sind.
    Im Beispiel "DB CommandObjekte / DataReader" siehst Du, wie Du
    direkt mit Commandobjekten u. zugehörigen Parameterobjekten
    arbeiten kannst.

    Gruß aus St.Georgen
    Peter Götz
    www.gssg.de (mit VB-Tipps u. Beispielprogrammen)

    Freitag, 16. Juli 2010 09:11
  • Hallo Peter,

    in verkürzter Form sieht das ganze so aus :

       Dim oCommandBuilder As OleDbCommandBuilder
            Dim oRow As DataRow
            dim oDataTable As New System.Data.DataTable()
     
            cPKSpalte = odbServer.aStruk(0, 0)

            oAdapter = New OleDbDataAdapter("SELECT * FROM " + odbServer.cDbName + " WHERE 1=2", frmMainWindow.odbServer.oConn)

            oCommandBuilder = New OleDbCommandBuilder(oAdapter)

            oAdapter.Fill(oDataTable)

            oRow = oDataTable.NewRow()
            oRow(cPKSpalte) = GetGuidID()
            oDataTable.Rows.Add(oRow)
            'oDataTable.Rows(0)("Rabatt") = "19.60"
            'oDataTable.Rows(0)("Rabatt") = "19,60"
            oDataTable.Rows(0)("Rabatt") = 19.60

            oAdapter.Update(oDataTable)

     

    Die Spalte unter ACCESS ist aber mit 6 Vorkommastellen und 2 Nachkommastellen definiert und lässt sich unter ACCESS auch direkt mit 19,60 Rabatt eingeben...

    Hoffe das Hilft...

    bye,

    Mario

    Mittwoch, 21. Juli 2010 09:43
  • Hallo Mario,

    erst mal verstehe ich nicht, was Du mit Deinem
    "SELECT * FROM " + odbServer.cDbName + " WHERE 1=2"
    erreichen willst.
    Du bekommst damit 0 Datensätze, da Deine Where-Klausel
    1 = 2 niemals erfüllt ist.

    Später erstellst Du mit oDataTable.NewRow eine neue DataRow
    und weist der Spalte cPKSpalte  dieser DataRow einen GUID zu.
    Soweit noch OK.
    Nun solltest Du aber nicht oDataTable.Rows.Add(oRow) ausführen,
    sondern erst mal die übrigen Felder Deines neuen Datensatzes
    mit Werten bestücken. Also oRow.Item("Rabatt") = 19.60
    und erst nachdem Du alle Felder des neuen Datensatzes mit
    Werten belegt hast diesen neuen Datensatz via oDataTable.Rows.Add(oRow)
    an die Rows-Auflistung Deiner DataTable anfügen.

    Gruß aus St.Georgen
    Peter Götz
    www.gssg.de (mit VB-Tipps u. Beispielprogrammen)

    Mittwoch, 21. Juli 2010 11:44
  • Hallo Mario,

    Deine 6 Vorkammastellen und 2 Nachkommastellen in Access
    sind eine ganz andere Baustelle und haben nichts mit Deinem
    Problem zu tun. Dies Vor- u. Nachkommastellen sind rein
    Access-interne Formatierungen, die sich in keinster Weise auf
    die Columns Deiner DataRows aus Deiner DataTable auswirken.

    Gruß aus St.Georgen
    Peter Götz
    www.gssg.de (mit VB-Tipps u. Beispielprogrammen)

    Mittwoch, 21. Juli 2010 11:47
  • Hallo Peter,

    ohne

    erst mal verstehe ich nicht, was Du mit Deinem
    "SELECT * FROM " + odbServer.cDbName + " WHERE 1=2"
    erreichen willst.

    und einem Datafill kennt die Datatable doch gar nicht die Spalte "Rabatt" ... irgendwie muss ich ja die Struktur und die verfügbaren Felder mit den entsprechenden Werttypen in die Datatable bekommen um dann wieder per Row darauf zugreifen zu können...

    Mario

     

     

    Mittwoch, 21. Juli 2010 12:31
  • Noch mal ich,

    sind eine ganz andere Baustelle und haben nichts mit Deinem
    Problem zu tun. Dies Vor- u. Nachkommastellen sind rein
    Access-interne Formatierungen, die sich in keinster Weise auf
    die Columns Deiner DataRows aus Deiner DataTable auswirken.

    Warum nicht ? Muss ich denn jetzt die gesamte Tabellenstruktur wiederum händisch in VB nachstellen in einem Dataset, damit ich Spaltentypen wie Datum, Numerische oder Logische Columns haben? Das wird wohl auch der grund erstmal sein, das numerische Spalten irgendwie linksbündig und nicht rechtsbündig im Datagrid dargestellt werden?

     

     

    Mittwoch, 21. Juli 2010 12:46
  • Hi Mario,
    SQL kennt keine Vor- und Nachkommastellen. Das ist Sache der Bedienoberfläche und damit auf Access-Seite eine access-interne Sache. Wenn Du eine .NET-Windows-Anwendung erstellst, dann musst Du in der Oberfläche die Formatierung festlegen (UI-Design). Eine Datenbankabfrage kann Dir nicht die Access-Interna der Oberfläche bereitstellen. Auch die Orientierung ist Sache der Oberfläche und wird auch nicht von einer Datenbankabfrage unterstützt. Für die Gestaltung der Oberfläche ist der Designer verantwortlich; die Daten stellt SQL bereit.
     

    Viele Gruesse
    Peter

    Mittwoch, 21. Juli 2010 19:55
  • Hi Mario,
    im Standardfall wird in der Client-Anwendung eine Inline-Datenbank auf Basis der im Projekt abzubildenden Prozesse erstellt. Da werden Tabellen mit Spalten und deren Typen festgelegt. Diese Inline-Datenbank kann über unterschiedliche Wege gefüllt werden, so z.B. auch über ein DataAdapter.Fill aus einer externen Datenbank. Eine �?bereinstimmung zwischen Tabellennamen, Feldnamen und Feldtypen zwischen Inline- und externer Datenbank ist nicht zwingend, kann aber sein. Ein Sonderfall liegt vor, wenn von einer externen Datenbank geladen wird und in der Inleine-Datenbank Tabellen und Spalten fehlen. Um in diesem Fall keinen Fehler zu werfen, hat man sich entschieden, die fehlenden Objekte implizit so anzulegen, dass danach ein fehlerfreier Import der Daten möglich ist. 
     

    Viele Gruesse
    Peter

    Mittwoch, 21. Juli 2010 20:02
  • Hallo Peter,

    hmm ja soweit ok... Es lösst nur mein Problem nicht das ich einfach keine lächerliche Rabatt Zahl in einem Datenbankfeld speichern kann mit zwei Nachkommastellen...

    Woran kann es denn liegen ?

    Das Create Statement für die ACCESS Tabelle habe ich schon mit Decimal(6,2) oder auch Numeric(6,2) ausprobiert. Im Programmcode VOR dem AddRow den Wert 19.2 oder 19.55 reingeschrieben...Update läuft..und in der Tabelle taucht eine 192,00 oder 1955,00 auf...

    bye,

    Mario

     

    Donnerstag, 22. Juli 2010 07:17
  • Hi Mario,
    ich vermute mal, dass Du entweder ohne Parameter-Objekte arbeitest oder eine ältere Version der Jet nutzt.
     
    Schreib mal, welche Version der Jet Du nutzt und wie Du in die mdb schreibst.
     

    Viele Gruesse
    Peter

    Donnerstag, 22. Juli 2010 07:37
  • Hallo,

    Du musst nicht die gesamte Tabellenstruktur händisch
    in VB nachstellen. Das kann Dein DataAdapter mit Hilfe
    von DataAdapter.FillSchema(). Die Online-Hilfe zu .Fillschema()
    gibt umfassende Auskunft, auf welche Weise Du damit ein
    Tabellenschema aus Deiner Datenbank in Deine lokale
    DataTable übertragen kannst.

    Gruß aus St.Georgen
    Peter Götz
    www.gssg.de (mit VB-Tipps u. Beispielprogrammen)

    Donnerstag, 22. Juli 2010 08:25
  • Hallo Mario,

    wie schon mehrfach angesprochen, gibt es in einer Jet-DB
    keine Vor- oder Nachkommastellen. Dies sind rein Access-
    interne Formatierungsanweisungen. Für das Speichern von
    Zahlenwerten mit beliebiger Anzahl von Vor- und Nachkommastellen
    brauchst Du einfach ein Feld vom Typ Single, Double oder Währung
    (currency).

    Um einen neuen Datensatz in der DB zu speichern, brauchst Du
    einen Insert-Command. Um einen vorhandenen Datensatz in der
    DB zu verändern (eines oder auch mehrere Felder) brauchst Du
    einen Update-Command. Wenn es nur darum geht, brauchst Du
    weder einen DataAdapter noch eine DataTable.

    Unter

        www.gssg.de -> Visual Basic -> VB.net
            -> Datenbank
                -> DB CommandObjekt / DataReader

    findest Du ein Programm in dem Du Dir die Arbeitsweise der
    verschiedenen Commands (Insert, Update, Delete) ansehen
    kannst.
    Um von vorneherein erst gar kein Problem mit unterschiedlichen
    Dezimaltrennern (Punkt, Komma) entstehen zu lassen, solltest Du
    Werte nicht direkt in Deine CommandTexte eintragen, sondern
    immer mit Parameter-Objekten arbeiten. Auch das siehst Du in
    dem o.g. Beispiel.

    Gruß aus St.Georgen
    Peter Götz
    www.gssg.de (mit VB-Tipps u. Beispielprogrammen)

    Donnerstag, 22. Juli 2010 08:35
  • Hallo Peter,

    cPKSpalte = odbServer.aStruk(0, 0)

            'oDataTable = New System.Data.DataTable
            oAdapter = New OleDbDataAdapter("SELECT * FROM " + odbServer.cDbName + " WHERE 1=2", frmMainWindow.odbServer.oConn)

            oCommandBuilder = New OleDbCommandBuilder(oAdapter)

            oAdapter.FillSchema(oDataSet, SchemaType.Mapped)


            'MessageBoxStop(oDataSet.Tables.Count, "")

            'oAdapter.Fill(oDataTable)
            oDataTable = oDataSet.Tables(0)

            oRow = oDataTable.NewRow()

            oRow.Item(cPKSpalte) = GetGuidID()
            oRow.Item("MwStSatz") = 19.22

            oDataTable.Rows.Add(oRow)
            oAdapter.Update(oDataTable)

    In etwa so mit dem Schema ? Geht nicht :((( ...

    Donnerstag, 22. Juli 2010 08:59
  • ich habs !!!...

    im create statement für die ACCESS Mappe hatte ich ja ein Numeric(6,2)...das habe ich geändert auf Double... jetzt kann ich auch Werte aus VB heruas mit Nachkommastellen speichern...

    kenn VB vieleicht diesen Datentypfeld nicht ?

     

     

    Donnerstag, 22. Juli 2010 11:14
  • Hallo,

    Hier mal ein kompl. ablauffähiges Beispiel, mit dem Du
    einen neuen Datensatz in die Tabelle "Tabelle" einer Access.mdb
    schreiben kannst.
    Die Tabelle muss ein Feld "ID" vom Typ Integer enthalten,
    welches auch als Primärschlüssel definiert ist. Ein als
    Primärschlüssel definiertes Feld ist für den CommandBuilder
    erforderlich, damit er mit den von ihm gebildeten Commands
    jeweils einen ganz bestimmten Datensatz eindeutig adressieren kann.

    Public Class Form1
        Private mDA As OleDb.OleDbDataAdapter
        Private mDT As DataTable
        Private mCB As OleDb.OleDbCommandBuilder
        Private mCNN As OleDb.OleDbConnection
        Private DGV As DataGridView
        Private WithEvents BtnNew As Button

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

            DGV = New DataGridView
            With DGV

                .SetBounds _
                        (10, 10, _
                         Me.ClientSize.Width - 20, _
                         Me.ClientSize.Height - 70)

                .Anchor = _
                        AnchorStyles.Left Or _
                        AnchorStyles.Top Or _
                        AnchorStyles.Right Or _
                        AnchorStyles.Bottom

                .AllowUserToAddRows = False

            End With
            Me.Controls.Add(DGV)

            BtnNew = New Button
            With BtnNew
                .Font = New Font("Arial", 10)
                .Name = "BtnNew"
                .SetBounds(10, DGV.Bottom + 10, 120, 40)
                .Text = "New Record"

                .Anchor = _
                        AnchorStyles.Left Or _
                        AnchorStyles.Bottom

            End With
            Me.Controls.Add(BtnNew)

            CreateData()

            DGV.DataSource = mDT
        End Sub


        Private Sub Form1_FormClosing _
                (ByVal sender As Object, _
                 ByVal e As System.Windows.Forms.FormClosingEventArgs _
                ) Handles Me.FormClosing

            If mCNN IsNot Nothing Then

                If mCNN.State And ConnectionState.Open = _
                        ConnectionState.Open Then

                    mCNN.Close()
                End If

            End If
        End Sub


        Private Sub BtnNew_Click _
                (ByVal sender As Object, _
                 ByVal e As System.EventArgs _
                ) Handles BtnNew.Click

            ' Neuen Datensatz erstellen und in der DB speichern
            InsertNewRecord()

        End Sub

        Private Sub Form1_Click _
                (ByVal sender As Object, _
                 ByVal e As System.EventArgs _
                 ) Handles Me.Click

            ' zum Testen der Function GetNextID
            MsgBox(GetNextID, MsgBoxStyle.Information)
        End Sub

        Private Function GetNextID() As Integer
            ' Liefert die in der DB-Tabelle enthaltene höchste ID + 1
            Dim Cmd As New OleDb.OleDbCommand _
                    ("Select Max(ID) From Tabelle", mCNN)

            Dim Ret As Object

            Ret = Cmd.ExecuteScalar
            If Ret = Nothing Then
                Return 1
            Else
                Return CInt(Ret) + 1
            End If
        End Function

        Private Sub InsertNewRecord()
            Dim DR As DataRow
            DR = mDT.NewRow
            Dim ID As Integer = GetNextID()

            With DR
                .Item(0) = ID
                .Item(1) = "Hallo Welt"
                .Item(2) = 25.4
                .Item(3) = "Admin"
                .Item(4) = Now
            End With

            mDT.Rows.Add(DR)

            MsgBox _
                (mCB.GetInsertCommand.CommandText, _
                 MsgBoxStyle.Information)

            mDA.Update(mDT)

        End Sub

        Private Sub CreateData()
            mCNN = GetConnection("D:\DataBases\DB2002.mdb")
            mCNN.Open()

            mDA = _
                    New OleDb.OleDbDataAdapter _
                    ("Select * From Tabelle", mCNN)

            mDA.MissingSchemaAction = _
                    MissingSchemaAction.AddWithKey


            mDT = New DataTable
            mDA.FillSchema(mDT, SchemaType.Mapped)

            mCB = New OleDb.OleDbCommandBuilder(mDA)
        End Sub

        Private Function GetConnection _
                (ByVal FileName As String) As OleDb.OleDbConnection

            Dim CSB As New OleDb.OleDbConnectionStringBuilder
            Dim CNN As OleDb.OleDbConnection

            With CSB
                .DataSource = FileName
                .Provider = "Microsoft.Jet.OLEDB.4.0"

                ' Connectionpooling ausschalten
                .OleDbServices = -4

                ' DB im geteilten Modus öffnen
                .Add("Mode", "Share Deny None")

                ' Pagelocking ab Access-Version 2000
                .Add("Jet OLEDB:Database Locking Mode", 1)
            End With

            CNN = New OleDb.OleDbConnection(CSB.ConnectionString)
            Return CNN
        End Function

    End Class

    Nach dem Programmstart siehst Du eine Form mit einem
    DataGridView sowie einem Button "New Record".
    Das DataGridView ist nach dem Programmstart erst mal
    leer, da mit DataAdapter.FillSchema nur das Tabellenschema
    jedoch keine Daten in die DataTable (mDT) geladen werden.
    Mit jedem Klick auf den Button "New Record" kannst Du
    nun einen neuen Datensatz erzeugen, der sofort im DGV
    sichtbar wird und auch gleich in der DB-Tabelle gespeichert
    wird.

    Gruß aus St.Georgen
    Peter Götz
    www.gssg.de (mit VB-Tipps u. Beispielprogrammen)

    Donnerstag, 22. Juli 2010 11:29
  • Hallo Mario,

    au weia,
    ich denke, ich habe Dir mehr als einmal geschrieben,
    dass Du ein numerisches Feld vom Typ Single, Double
    oder Currency brauchst um Deine num. Werte mit
    Vor- u. Nachkommastellen zu speichern.

    Gruß aus St.Georgen
    Peter Götz
    www.gssg.de (mit VB-Tipps u. Beispielprogrammen)

    Donnerstag, 22. Juli 2010 11:32
  • Hallo Peter,

    magst du mir noch einmal verzeihen? Ich glaube vor lauter Hitze habe ich nicht jedes Wort gelesen und du hast ja recht, die Lösung steckte schon in deiner Antwort. Nur war und bin ich immer noch drauf fixiert Datenbankfelder nur so anzulegen, mit dem Speicher-Platz den ich brauche und ich halte ein Feldtyp Double für einen Rabatt einfach zu groß.

    Ich komme aus der dBase - Umgebung und dort gibts halt die Möglichkeit ein numerisches Feld mit 6 Vorkomma und 2 Nachkommastellen anzulegen ; zumal das gleiche augenscheinlich in ACCESS geht und ich unter ACCESS direkt auch ein 19,22 eintragen konnte nur unter VB halt nicht :)

    Anyhow, auch dein Beispiel mit dem Anlegen des Datensatzes, den solltest du mal auf diese Homepage www.gssg.de  reingeben, denke das ist für viele Anfänger (inklusive mir) viel viel verständlicher als diese ganzen anderen Beispiele, denn es beschränkt sich auf das was man erstmal machen möchte :) Eine Tabelle darstellen und einen Datensatz anlegen ...

    ein schönes Wochenende ! und danke allen anderen aus diesem Thread für die Antworten !

    Mario

     

     

    Freitag, 23. Juli 2010 08:03