Top-Themen

Aktuelle Themen (A bis Z)

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, 1842 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 ..
Ähnliche Inhalte
VB for Applications
Checkbox Text in eine Textbox
gelöst Frage von GERz0cKErZVB for Applications4 Kommentare

Hallo, ich möchte, dass wenn ich eine Checkbox anklicke der Text der Checkbox in einer Textbox erscheint, und wenn ...

Visual Studio
Inhalt einer Textbox mit einem Button kopieren?
gelöst Frage von noah1400Visual Studio2 Kommentare

Hey weiß vielleicht jemand wie man den inhalt einer Textbox koppiert ohne rechtsklick kopieren sondern indem man einfach auf ...

VB for Applications
Textbox Zelle ändern
gelöst Frage von Just4fun1990VB for Applications10 Kommentare

Hallo Administrator.de User, wieder einmal eine Frage (nimmt ja heute kein Ende :) ) Und zwar möchte ich eine ...

Visual Studio
TextBox mit eingabe Maske
gelöst Frage von DarkproduktVisual Studio3 Kommentare

Guten Abend, ich versuche gerade meiner Textbox eine "Maske" zu verpassen. Ich weis es gibt auch MaskedTextBox aber diese ...

Neue Wissensbeiträge
Windows 10

Autsch: Microsoft bündelt Windows 10 mit unsicherer Passwort-Manager-App

Tipp von kgborn vor 4 StundenWindows 10

Unter Microsofts Windows 10 haben Endbenutzer keine Kontrolle mehr, was Microsoft an Apps auf dem Betriebssystem installiert (die Windows ...

Sicherheits-Tools

Achtung: Sicherheitslücke im FortiClient VPN-Client

Tipp von kgborn vor 6 StundenSicherheits-Tools

Ich weiß nicht, wie häufig die NextGeneration Endpoint Protection-Lösung von Fortinet in deutschen Unternehmen eingesetzt wird. An dieser Stelle ...

Internet

USA: Die FCC schaff die Netzneutralität ab

Information von Frank vor 20 StundenInternet3 Kommentare

Jetzt beschädigt US-Präsident Donald Trump auch noch das Internet. Der neu eingesetzte FCC-Chef Ajit Pai ist bekannter Gegner einer ...

DSL, VDSL

ALL-BM200VDSL2V - Neues VDSL-Modem mit Vectoring von Allnet

Information von Lochkartenstanzer vor 1 TagDSL, VDSL1 Kommentar

Moin, Falls jemand eine Alternative zu dem draytek sucht: Gruß lks

Heiß diskutierte Inhalte
Netzwerkmanagement
Mehrere Netzwerkadapter in einem PC zu einem Switch zusammenfügen
Frage von prodriveNetzwerkmanagement21 Kommentare

Hallo zusammen Vorweg, ich konnte schon einige IT-Probleme mit Hilfe dieses Forums lösen. Wirklich klasse hier! Doch für das ...

Windows Server
Anmeldung direkt am DC nicht möglich
Frage von ThomasGrWindows Server16 Kommentare

Hallo, ich habe bei unserem Server 2016 Standard ein Problem. Keine Ahnung wie das auf einmal passiert ist. Ich ...

Hardware
Links klick bei Maus funktioniert nicht
gelöst Frage von Pablu23Hardware16 Kommentare

Hallo erstmal. Ich habe ein Problem mit meiner relativ alten maus jedoch denke ich nicht das es an der ...

TK-Netze & Geräte
VPN-fähige IP-Telefone
Frage von the-buccaneerTK-Netze & Geräte15 Kommentare

Hi! Weiss noch jemand ein VPN-fähiges IP-Telefon mit dem man z.B. einen Heimarbeitsplatz gesichert anbinden könnte? Habe nur einen ...