Top-Themen

AppleEntwicklungHardwareInternetLinuxMicrosoftMultimediaNetzwerkeOff TopicSicherheitSonstige SystemeVirtualisierungWeiterbildungZusammenarbeit

Aktuelle Themen

Administrator.de FeedbackApache ServerAppleAssemblerAudioAusbildungAuslandBackupBasicBatch & ShellBenchmarksBibliotheken & ToolkitsBlogsCloud-DiensteClusterCMSCPU, RAM, MainboardsCSSC und C++DatenbankenDatenschutzDebianDigitiales FernsehenDNSDrucker und ScannerDSL, VDSLE-BooksE-BusinessE-MailEntwicklungErkennung und -AbwehrExchange ServerFestplatten, SSD, RaidFirewallFlatratesGoogle AndroidGrafikGrafikkarten & MonitoreGroupwareHardwareHosting & HousingHTMLHumor (lol)Hyper-VIconsIDE & EditorenInformationsdiensteInstallationInstant MessagingInternetInternet DomäneniOSISDN & AnaloganschlüsseiTunesJavaJavaScriptKiXtartKVMLAN, WAN, WirelessLinuxLinux DesktopLinux NetzwerkLinux ToolsLinux UserverwaltungLizenzierungMac OS XMicrosoftMicrosoft OfficeMikroTik RouterOSMonitoringMultimediaMultimedia & ZubehörNetzwerkeNetzwerkgrundlagenNetzwerkmanagementNetzwerkprotokolleNotebook & ZubehörNovell NetwareOff TopicOpenOffice, LibreOfficeOutlook & MailPapierkorbPascal und DelphiPeripheriegerätePerlPHPPythonRechtliche FragenRedHat, CentOS, FedoraRouter & RoutingSambaSAN, NAS, DASSchriftartenSchulung & TrainingSEOServerServer-HardwareSicherheitSicherheits-ToolsSicherheitsgrundlagenSolarisSonstige SystemeSoziale NetzwerkeSpeicherkartenStudentenjobs & PraktikumSuche ProjektpartnerSuseSwitche und HubsTipps & TricksTK-Netze & GeräteUbuntuUMTS, EDGE & GPRSUtilitiesVB for ApplicationsVerschlüsselung & ZertifikateVideo & StreamingViren und TrojanerVirtualisierungVisual StudioVmwareVoice over IPWebbrowserWebentwicklungWeiterbildungWindows 7Windows 8Windows 10Windows InstallationWindows MobileWindows NetzwerkWindows ServerWindows SystemdateienWindows ToolsWindows UpdateWindows UserverwaltungWindows VistaWindows XPXenserverXMLZusammenarbeit
GELÖST

Anbindung von Textboxen an Datenbank

Frage Entwicklung Visual Studio

Mitglied: ForgottenRealm

ForgottenRealm (Level 1) - Jetzt verbinden

27.06.2014, aktualisiert 30.06.2014, 1647 Aufrufe, 8 Kommentare

Hallo

Ich stehe vor einem, wahrscheinlich sehr schnell zu lösendem, Problem mit ein paar TextBoxen, einer Combobox und dem CommandBuilder.

Mein Code schaut zur Zeit so aus;

01.
Option Explicit On 
02.
 
03.
'Systemobjekte 
04.
Imports System.Data 
05.
 
06.
'MS Access 
07.
Imports System.Data.OleDb 
08.
 
09.
Public Class frm_Einstellungen 
10.
 
11.
    Private Private_tbl_EMailKonten_BindingSource As New BindingSource() 
12.
    Private Private_tbl_EMailKonten_Adapter As New OleDbDataAdapter() 
13.
    Private Private_tbl_EMailKonten_CommandBuilder As New OleDbCommandBuilder() 
14.
 
15.
    Private Private_tbl_DMC_data_CurrentID As Long 
16.
 
17.
    Private Private_ArrayDBFelder() As Control = Nothing 
18.
 
19.
    Private Sub frm_Einstellungen_Load(sender As Object, e As EventArgs) Handles MyBase.Load 
20.
 
21.
        Try 
22.
            frm_Start.Hide() 
23.
 
24.
            'Ersten Datensatz in Tabelle schreiben 
25.
            If DBExcecute("SELECT COUNT(*) AS RecordCounts FROM " & Const_tbl_EMailKonten, "RecordCounts") = 0 Then 
26.
                Call DBExcecute("INSERT INTO " & Const_tbl_EMailKonten & " (EMailKonto) VALUES (" & ConstSQLEscape & Nothing & ConstSQLEscape & ")") 
27.
            End If 
28.
 
29.
            'Datenbank anbinden 
30.
            Dim TV_SQLString As String = "SELECT * FROM " & Const_tbl_EMailKonten 
31.
            Private_tbl_EMailKonten_Adapter = New OleDbDataAdapter(TV_SQLString, Public_MSAccConnectString) 
32.
            Dim commandBuilder As New OleDbCommandBuilder(Private_tbl_EMailKonten_Adapter) 
33.
 
34.
            'Databinding 
35.
            Private_tbl_EMailKonten_BindingSource.DataSource = CreateDataTable("SELECT * FROM " & Const_tbl_EMailKonten, "DS_EMailKonten") 
36.
 
37.
            With Private_tbl_EMailKonten_BindingSource 
38.
                cb_EMailKonto.DataSource = .DataSource 
39.
                cb_EMailKonto.DisplayMember = "EMailKonto" 
40.
                cb_EMailKonto.ValueMember = "MyID" 
41.
 
42.
                Private_tbl_DMC_data_CurrentID = .DataSource.Rows(0)("MyID") 
43.
                tb_Benutzername.DataBindings.Add("Text", .DataSource, "Benutzername") 
44.
                tb_MailDomain.DataBindings.Add("Text", .DataSource, "MailDomain") 
45.
                tb_Passwort.DataBindings.Add("Text", .DataSource, "Passwort") 
46.
                tb_POPServer.DataBindings.Add("Text", .DataSource, "POPServer") 
47.
                tb_POPPort.DataBindings.Add("Text", .DataSource, "POPPort") 
48.
                tb_SMTPServer.DataBindings.Add("Text", .DataSource, "SMTPServer") 
49.
                tb_SMTPPort.DataBindings.Add("Text", .DataSource, "SMTPPort") 
50.
            End With 
51.
 
52.
            'Passwort Felder maskieren 
53.
            tb_Passwort.UseSystemPasswordChar = True 
54.
 
55.
            'Felder einfärben 
56.
            Private_ArrayDBFelder = {tb_Benutzername, tb_MailDomain, _ 
57.
                                        tb_Passwort, tb_Benutzername, _ 
58.
                                        tb_POPServer, tb_POPPort, _ 
59.
                                        tb_SMTPServer, tb_SMTPPort} 
60.
 
61.
            For Each CurrentFeld In Private_ArrayDBFelder 
62.
                If TypeOf CurrentFeld Is TextBox Then 
63.
                    If Not CurrentFeld.Text = Nothing Then 'Mit Inhalt 
64.
                        CurrentFeld.BackColor = Color.LightGreen 
65.
                    Else 'Ohne Inhalt 
66.
                        CurrentFeld.BackColor = Color.LightSalmon 
67.
                    End If 
68.
                End If 
69.
            Next CurrentFeld 
70.
 
71.
            Exit Sub 
72.
 
73.
        Catch ex As Exception 
74.
            MsgBox(ex.Message, vbOKOnly + vbCritical) 
75.
 
76.
        End Try 
77.
 
78.
    End Sub 
79.
 
80.
End Class
Ich bin mir nicht sicher, ob es so richtig ist, aber das Binding an die Textfelder und die Combobox funktioniert. Wenn ich den Datensatz in der Combobox wechsle dann werden die Änderungen auch wie gewünscht übernommen, allerdings wird nichts gespeichert wenn ich in dem Datensatz bleibe und das Speichern über einen Button mit dem Dataadapter.update ausführe.

01.
    Private Sub btn_Speichern_Click(sender As Object, e As EventArgs) Handles btn_Speichern.Click 
02.
 
03.
        Dim commandBuilder = New OleDbCommandBuilder(Private_tbl_EMailKonten_Adapter) 
04.
 
05.
        Private_tbl_EMailKonten_Adapter.Update(Private_tbl_EMailKonten_DataSet, "DS_EMailKonten") 'Datenherkunft aus DataSet 
06.
 
07.
        Private_tbl_EMailKonten_Adapter.Update(CType(Private_tbl_EMailKonten_BindingSource.DataSource, DataTable)) 'Datenherkunft aus BindingSource 
08.
 
09.
        MsgBox(commandBuilder.GetUpdateCommand.CommandText) 
10.
 
11.
    End Sub 
12.
 
13.
Der Commandbuilder gibt mir als Updatetext nur ? als Wert für die Felder zurück.
Ich probiere seit fast 30 Stunden jetzt immer wieder hin und her, komme aber nicht weiter leider. Ich hoffe, ihr könnt mir helfen.

Freundliche Grüße!
Mitglied: colinardo
27.06.2014, aktualisiert um 11:20 Uhr
Hallo ForgottenRealm,
du benötigst noch die eigentliche Update-Routine für den OleDbDataAdapter, sonst weiß dieser ja nicht wie er die Werte in der DB updaten soll. Diese kannst du mit einem OleDbCommandBuilder automatisch generieren lassen:

Beispiel:
01.
Dim da As New OleDb.OleDbDataAdapter("SQL String") 
02.
Dim builder As OleDb.OleDbCommandBuilder = New OleDb.OleDbCommandBuilder(da) 
03.
da.UpdateCommand = builder.GetUpdateCommand()
Danach kannst du mit der Update() Methode des DataAdapter den Datensatz in der DB aktualisieren.

Noch ein Hinweis: Du benötigst für jeden Vorgang den du in der Datenbank machen möchtest (Update,Insert,Delete) jeweils solch eine Routine für den DataAdapter. Diese kannst du ebenfalls vom OleDbCommandBuilder automatisch erstellen lassen, siehe dazu die oben verlinkte Referenzseite.

Grüße Uwe
Bitte warten ..
Mitglied: ForgottenRealm
27.06.2014 um 12:28 Uhr
Hallo Uwe,

Ich dachte mir schon, dass ich irgend etwas vergessen habe ...

Allerdings steh ich grad echt auf dem Schlauch, wo muss ich in meinem Code damit hin?

Mein Code sieht grad so aus;

01.
Option Explicit On 
02.
 
03.
'Systemobjekte 
04.
Imports System.Data 
05.
 
06.
'MS Access 
07.
Imports System.Data.OleDb 
08.
 
09.
Public Class frm_Einstellungen 
10.
 
11.
    Private Private_tbl_EMailKonten_BindingSource As New BindingSource() 
12.
    Private Private_tbl_EMailKonten_Adapter As New OleDbDataAdapter() 
13.
    Private Private_tbl_EMailKonten_CommandBuilder As New OleDbCommandBuilder() 
14.
 
15.
    Private Private_tbl_EMailKonten_DataSet As New DataSet 
16.
 
17.
    Private Private_tbl_DMC_data_CurrentID As Long 
18.
 
19.
    Private Private_ArrayDBFelder() As Control = Nothing 
20.
 
21.
    Private Sub frm_Einstellungen_Load(sender As Object, e As EventArgs) Handles MyBase.Load 
22.
 
23.
        Try 
24.
            frm_Start.Hide() 
25.
 
26.
            'Ersten Datensatz in Tabelle schreiben 
27.
            If DBExcecute("SELECT COUNT(*) AS RecordCounts FROM " & Const_tbl_EMailKonten, "RecordCounts") = 0 Then 
28.
                Call DBExcecute("INSERT INTO " & Const_tbl_EMailKonten & " (EMailKonto) VALUES (" & ConstSQLEscape & Nothing & ConstSQLEscape & ")") 
29.
            End If 
30.
 
31.
            'Datenbank anbinden 
32.
            Dim TV_SQLString As String = "SELECT * FROM " & Const_tbl_EMailKonten 
33.
 
34.
			 
35.
            'Databinding 
36.
            Private_tbl_EMailKonten_BindingSource.DataSource = CreateDataTable(TV_SQLString, "DS_EMailKonten") 
37.
			 
38.
            'Command Builder 
39.
            Private_tbl_EMailKonten_Adapter = New OleDbDataAdapter(TV_SQLString, Public_MSAccConnectString) 
40.
            Private_tbl_EMailKonten_Adapter.Fill(Private_tbl_EMailKonten_DataSet, "DS_EMailKonten") 
41.
 
42.
 
43.
            '################## Hier ist der neue teil 
44.
            Private_tbl_EMailKonten_CommandBuilder = New OleDbCommandBuilder(Private_tbl_EMailKonten_Adapter 
45.
            '################## Hier ist der neue teil 
46.
 
47.
            With Private_tbl_EMailKonten_BindingSource 
48.
                cb_EMailKonto.DataSource = .DataSource 
49.
                cb_EMailKonto.DisplayMember = "EMailKonto" 
50.
                cb_EMailKonto.ValueMember = "MyID" 
51.
 
52.
                Private_tbl_DMC_data_CurrentID = .DataSource.Rows(0)("MyID") 
53.
                tb_Benutzername.DataBindings.Add("Text", .DataSource, "Benutzername") 
54.
                tb_MailDomain.DataBindings.Add("Text", .DataSource, "MailDomain") 
55.
                tb_Passwort.DataBindings.Add("Text", .DataSource, "Passwort") 
56.
                tb_POPServer.DataBindings.Add("Text", .DataSource, "POPServer") 
57.
                tb_POPPort.DataBindings.Add("Text", .DataSource, "POPPort") 
58.
                tb_SMTPServer.DataBindings.Add("Text", .DataSource, "SMTPServer") 
59.
                tb_SMTPPort.DataBindings.Add("Text", .DataSource, "SMTPPort") 
60.
            End With 
61.
			 
62.
			... 
63.
 
64.
        Catch ex As Exception 
65.
            MsgBox(ex.Message, vbOKOnly + vbCritical) 
66.
 
67.
        End Try 
68.
 
69.
    End Sub 
70.
 
71.
    Private Sub btn_Speichern_Click(sender As Object, e As EventArgs) Handles btn_Speichern.Click 
72.
 
73.
        Private_tbl_EMailKonten_Adapter.UpdateCommand = Private_tbl_EMailKonten_CommandBuilder.GetUpdateCommand() 
74.
 
75.
        Private_tbl_EMailKonten_Adapter.Update(CType(Private_tbl_EMailKonten_BindingSource.DataSource, DataTable)) 'Datenherkunft aus BindingSource 
76.
 
77.
    End Sub 
78.
 
79.
End Class

Aus dem Link bin ich leider nicht schlauer geworden, da dort alles noch etwas anders aufgebaut ist. Könntest du mir evtl. den Code soweit zusammenschieben, dass es passen müsste?
Bitte warten ..
Mitglied: colinardo
27.06.2014, aktualisiert um 13:18 Uhr
also ein bisschen mitdenken erwarte ich hier eigentlich schon, hatte dir ja schon die Vorlage geliefert.

ab Zeile 39
01.
Private_tbl_EMailKonten_Adapter = New OleDbDataAdapter(TV_SQLString, Public_MSAccConnectString)  
02.
Private_tbl_EMailKonten_Adapter.Fill(Private_tbl_EMailKonten_DataSet, "DS_EMailKonten") 
03.
Dim builder As OleDb.OleDbCommandBuilder = New OleDb.OleDbCommandBuilder(Private_tbl_EMailKonten_Adapter) 
04.
Private_tbl_EMailKonten_Adapter.UpdateCommand = builder.GetUpdateCommand()
und Zeile 73 wech ...

Grüße Uwe
Bitte warten ..
Mitglied: ForgottenRealm
27.06.2014 um 13:42 Uhr
So rum hatte ich es schon probiert, leider ebenfalls ohne Erfolg.

Die Daten sind nach dem Öffnen der Maske wieder so wie sie vorher waren, anscheinend wird nichts gespeichert.


Mit kommt das Verhalten sehr merkwürdig vor, da beim Wechseln des Datensatzes über die Combobox die Daten gespeichert werden, unabhängig davon ob ich irgendwo etwas speichere oder nicht. Ich werde gleich nochmal ein komplett neues Projekt anfangen und dort nur den Teil verwenden, der so funktionieren müsste, möglicherweise ist bei meinem Programm einfach zu viel durcheinander.

Vielleicht siehst du ja noch etwas, woran es liegen könnte bei dem bestehenden Code ...

Freundliche Grüße
Bitte warten ..
Mitglied: ForgottenRealm
30.06.2014, aktualisiert um 14:02 Uhr
Moinmoin

Ich habs heute früh noch mal probiert, in einem neuen Projekt und nur mit den Wichtigsten Sachen.

01.
Option Explicit On 
02.
 
03.
'Systemobjekte 
04.
Imports System.Data 
05.
 
06.
'MS Access 
07.
Imports System.Data.OleDb 
08.
 
09.
Public Class Form1 
10.
 
11.
    Private Private_tbl_EMailKonten_DA As New OleDbDataAdapter() 
12.
    Private Private_tbl_EMailKonten_DS As New DataSet 
13.
    Private Private_tbl_EMailKonten_RS As String = "DS_EMailKonten" 
14.
 
15.
    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load 
16.
 
17.
        Dim SQLString As String = "SELECT * FROM tbl_EVA_EMailKonten" 
18.
        Dim SQLConString As String = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & "C:\Test\EVADat_vbNet.mdb" & ";Jet OLEDB:Engine Type=5" 
19.
 
20.
        Private_tbl_EMailKonten_DA = New OleDbDataAdapter(SQLString, SQLConString) 
21.
        Private_tbl_EMailKonten_DA.Fill(Private_tbl_EMailKonten_DS, Private_tbl_EMailKonten_RS) 
22.
 
23.
        Dim builder As OleDb.OleDbCommandBuilder = New OleDb.OleDbCommandBuilder(Private_tbl_EMailKonten_DA) 
24.
        Private_tbl_EMailKonten_DA.UpdateCommand = builder.GetUpdateCommand() 
25.
 
26.
        Dim dt As DataTable = Private_tbl_EMailKonten_DS.Tables(Private_tbl_EMailKonten_RS) 
27.
 
28.
        'Combobox binden 
29.
        ComboBox1.DataSource = dt 
30.
        ComboBox1.DisplayMember = "Benutzername" 
31.
        ComboBox1.ValueMember = "MyID" 
32.
 
33.
        'Textfelder binden 
34.
        With Private_tbl_EMailKonten_DS 
35.
            TextBox1.DataBindings.Add("Text", .Tables(Private_tbl_EMailKonten_RS), "Benutzername") 
36.
            TextBox2.DataBindings.Add("Text", .Tables(Private_tbl_EMailKonten_RS), "MailDomain") 
37.
        End With 
38.
 
39.
        ComboBox1.DisplayMember = "EMailKonto" 
40.
        ComboBox1.ValueMember = "MyID" 
41.
 
42.
    End Sub 
43.
 
44.
    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click 
45.
 
46.
        Private_tbl_EMailKonten_DA.Update(Private_tbl_EMailKonten_DS, Private_tbl_EMailKonten_RS) 
47.
 
48.
    End Sub 
49.
 
50.
End Class
Die Änderungen werden gespeichert, sobald ich den Datensatz durchwechsle. Beim Klicken auf den Button1 passiert mit dem aktuell ausgewähltem Datensatz leider rein gar nichts.

Ich bin langsam echt ratlos, da ich den Fehler einfach nicht finde ... so schwer kann das doch nicht sein, oder stell ich mich echt so dämlich an?

Freundliche Grüße!
Bitte warten ..
Mitglied: colinardo
LÖSUNG 30.06.2014, aktualisiert um 15:28 Uhr
Ach stimmt da fehlt in diesem Fall vor dem Update noch ein EndEdit() der BindingSource und danach noch ein AcceptChanges() des DataSets.
http://stackoverflow.com/questions/260000/updating-a-database-from-data ...
Bitte warten ..
Mitglied: ForgottenRealm
30.06.2014 um 15:29 Uhr
Hallo Uwe und vielen Dank für die Hilfe, genau das war es

Hätte mir von VBA her eigentlich noch klar sein müssen, war mir aber nicht bekannt ob dies bei VB.net auch nötig war.
Bitte warten ..
Mitglied: ForgottenRealm
01.07.2014 um 12:47 Uhr
Moinmoin

Leider gibt es doch noch ein Problem, wenn ich vom ersten auf einen anderen Datensatz wechsle und diesen mit;

01.
            Private_tbl_EMailKonten_BindingSource.EndEdit() 
02.
            Private_tbl_EMailKonten_Adapter.Update(CType(Private_tbl_EMailKonten_BindingSource.DataSource, DataTable)) 
03.
            Private_tbl_EMailKonten_DataSet.AcceptChanges()
speichern möchte, werden keinerlei Änderungen gespeichert.

Änderungen im ersten Datensatz werden richtig gespeichert, nur bei allen anderen nicht. Diese kann ich nur speichern, wenn der Datensatz gewechselt wird.
Allerdings erhalte ich auch keine Fehlermeldung. Hast du eine Idee, wo der Fehler ist?

Freundliche Grüße
Bitte warten ..
Neuester Wissensbeitrag
Humor (lol)

Linkliste für Adventskalender

(3)

Information von nikoatit zum Thema Humor (lol) ...

Ähnliche Inhalte
LAN, WAN, Wireless
Client Mode oder Bridge Mode bei Anbindung an einen AP per W Lan (3)

Frage von xpstress zum Thema LAN, WAN, Wireless ...

Exchange Server
Exchange 2007 Datenbank restore ohne Exchange zu verändern - SBS2008

Frage von pitamerica zum Thema Exchange Server ...

Hyper-V
Grundsatz Frage Anbindung Hyper V Hosts ans Netzwerk (7)

Frage von Eifeladmin zum Thema Hyper-V ...

Datenbanken
Datenbank API Automation

Link von Frank zum Thema Datenbanken ...

Heiß diskutierte Inhalte
Windows Server
DHCP Server switchen (25)

Frage von M.Marz zum Thema Windows Server ...

SAN, NAS, DAS
gelöst HP-Proliant Microserver Betriebssystem (14)

Frage von Yannosch zum Thema SAN, NAS, DAS ...

Grafikkarten & Monitore
Win 10 Grafikkarte Crash von Software? (13)

Frage von Marabunta zum Thema Grafikkarten & Monitore ...

Windows 7
Verteillösung für IT-Raum benötigt (12)

Frage von TheM-Man zum Thema Windows 7 ...