Unbehandelte Ausnahme: System.TypeInitializationException

  • VB.NET
  • .NET 5–6

Es gibt 10 Antworten in diesem Thema. Der letzte Beitrag () ist von Typhoon.

    Unbehandelte Ausnahme: System.TypeInitializationException

    Hallo liebes Forum

    Da ich michnoch immer mit der Fehlerbehebung "Option Strict ON" auseinandersetzt und doch noch so einige Fehler zu beheben sind hänge ich leider wieder an einer Stelle, die ansonsten immer Funktioniert hat.

    Verbindung zur Datenbank über das Modul "dbConnect" Hier der Code:

    VB.NET-Quellcode

    1. 'importieren von MySql
    2. Imports MySql.Data.MySqlClient
    3. Module dbConnect
    4. 'die Verbindung zur Datenbank definieren, damit von überall her darauf zugegriffen werden kann
    5. Public con As New MySqlConnection
    6. Public Function ConnectDatabase() As String
    7. 'array defninieren
    8. Dim mysqlError As String
    9. LeseIni()
    10. Try
    11. 'Testen ob die Verbindung noch offen ist, wenn nein dann
    12. If con.State = ConnectionState.Closed Then
    13. 'VerbindungsString erstellen
    14. con.ConnectionString = "SERVER=" & druckereimanagerConnection.serverName & "; PORT=" & druckereimanagerConnection.serverPort & "; USER ID=" & druckereimanagerConnection.userName & "; PASSWORD=" & druckereimanagerConnection.userPassWd & "; CHARSET=" & druckereimanagerConnection.charset & ";"
    15. 'Verbindung öffnen
    16. con.Open()
    17. End If
    18. 'und wahr zurückgeben
    19. Return CStr(True)
    20. 'Fehler abfangen
    21. Catch myerror As MySqlException
    22. 'fehler meldung und fehlercode in array schreiben
    23. mysqlError = myerror.Message & " " & myerror.Number.ToString
    24. 'und fehler zurück geben
    25. Return mysqlError
    26. End Try
    27. End Function
    28. End Module


    Wenn ich das Programm ausführe wird an der Stelle "con.open()" ein Fehler ausgeworfen.

    System.TypeInitializationException: "Der Typeninitialisierer für "MySql.Data.MySqlClient.Replication.ReplicationManager" hat eine Ausnahme verursacht."

    3 inneren Ausnahmen

    1. TypeInitializationException: Der Typeninitialisierer für "MySql.Data.MySqlClient.MySqlConfiguration" hat eine Ausnahme verursacht.
    2. ConfigurationErrorsException: Das Konfigurationssystem konnte nicht initialisiert werden.
    3. ConfigurationErrorsException: Unbekannter Konfigurationsabschnitt "userSettings". (C:\Users\gebha\AppData\Local\Druckereimanager\Druckereimanager.exe_Url_5yrwbnf5yzfthjgwi3y0gzhlxsgojh2z\1.0.0.0\user.config line 3)

    Kann mir bitte jemand einen Tipp geben? Ich komme leider mit google und co nicht weiter.

    Danke Gebhard

    Typhoon schrieb:

    Unbekannter Konfigurationsabschnitt "userSettings". (C:\Users\gebha\AppData\Local\Druckereimanager\Druckereimanager.exe_Url_5yrwbnf5yzfthjgwi3y0gzhlxsgojh2z\1.0.0.0\user.config line 3)
    Was steht denn in der user.config in Zeile#3, wenn der Compiler schon so konkrete Ursachendaten ausspuckt?
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    Hallo VaporiZed

    Das steht in der user.config drinnen.

    XML-Quellcode

    1. <?xml version="1.0" encoding="utf-8"?>
    2. <configuration>
    3. <userSettings>
    4. <Druckereimanager.My.MySettings>
    5. <setting name="AutoUpdate" serializeAs="String">
    6. <value>False</value>
    7. </setting>
    8. </Druckereimanager.My.MySettings>
    9. </userSettings>
    10. </configuration>


    Gruss Gebhard
    das ist für eine Config wohl unvollständig. Hier eine App.Config von mir:

    XML-Quellcode

    1. <?xml version="1.0" encoding="utf-8" ?>
    2. <configuration>
    3. <configSections>
    4. <sectionGroup name="userSettings" type="System.Configuration.UserSettingsGroup, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" >
    5. <section name="DbRestorer.My.MySettings" type="System.Configuration.ClientSettingsSection, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" allowExeDefinition="MachineToLocalUser" requirePermission="false" />
    6. </sectionGroup>
    7. </configSections>
    8. <startup>
    9. <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5.2" />
    10. </startup>
    11. <userSettings>
    12. <DbRestorer.My.MySettings>
    13. <setting name="TestSetting" serializeAs="String">
    14. <value>False</value>
    15. </setting>
    16. </DbRestorer.My.MySettings>
    17. </userSettings>
    18. </configuration>
    Du siehst: Die SectionGroup <userSettings> muss quasi 'angemeldet' sein (unter Angabe eines Datentyps), damit das Configurations-System das lesen kann.
    Hallo ErfinderDesRades

    Danke für dein Post. Hat leider nicht funktioniert. Copy and Past und ein paar Änderungen z.B. DbRestorer.My.MySettings in Druckereimanager.My.MySettings geändert ergab danach ein Fehler in Zeile 5.

    Ich war mutig und habe die ganze user.config gelöscht und siehe da..... Jetzt funktionierte dasd Program wieder.

    Noch eine Frage. Gibt es eine Möglichkeit eine Textbox zu aktualisieren wie eine Datagridview?

    Ich lese einen Wert aus meiner DB und gib den Inhalt in der Textbox aus. Jetzt schreibe ich einen neuen Wert in die DB und dann sollte auch der Textbox.Text aktualisiert werden nach dem drückern des Buttons Speichern. Ich bekommen das nicht hin. Mit Form.Refresh(), Form.Load() klappt alles nicht.

    Hier mein Code für das lesen und einfügen in die DB:

    VB.NET-Quellcode

    1. Imports MySql.Data.MySqlClient
    2. Public Class FrmFeuchtraum
    3. Private Sub FrmFeuchtraum_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    4. Dim AktFldNme As String = String.Empty
    5. Dim MyReader As MySqlDataReader = Nothing
    6. Dim cmd As New MySqlCommand
    7. Dim sql As String = "Select * FROM `DWP`.`feuchtmittelmessung` WHERE tank = 'T1' ORDER BY datum DESC LIMIT 1"
    8. Try
    9. If CBool(ConnectDatabase()) Then
    10. cmd = New MySqlCommand With {
    11. .Connection = con,
    12. .CommandText = sql
    13. }
    14. MyReader = cmd.ExecuteReader
    15. With MyReader
    16. While .Read
    17. For N As Integer = 0 To .FieldCount - 1
    18. AktFldNme = .GetName(N)
    19. Select Case AktFldNme.ToLower
    20. Case "datum".ToLower
    21. lblDatumT1.Text = .GetDateTime(N).ToString("g") '"dd/MM/yyyy HH:mm:ss"
    22. Case "leitwert".ToLower
    23. lbltnk1lwt.Text = .GetInt32(N).ToString("D")
    24. End Select
    25. Next
    26. End While
    27. End With
    28. End If
    29. Catch ex As MySqlException
    30. MsgBox(ex.Message, MsgBoxStyle.Critical, "Error [" & ex.GetType.Name & ", Akt. Feld: """ & AktFldNme & """]")
    31. Finally
    32. If MyReader IsNot Nothing Then
    33. MyReader.Close()
    34. MyReader = Nothing
    35. End If
    36. If cmd IsNot Nothing Then
    37. cmd.Dispose()
    38. cmd = Nothing
    39. End If
    40. End Try
    41. End Sub
    42. Private Sub BtnSpeichern_Click(sender As Object, e As EventArgs) Handles BtnSpeichern.Click
    43. Dim cmd As New MySqlCommand("INSERT INTO `DWP`.`feuchtmittelmessung`(tank, leitwert)Values('T1', @leitwert)", con)
    44. If CheckValidInput(txttnk1lwt.Text) = CStr(True) Then
    45. Try
    46. cmd.Parameters.AddWithValue("leitwert", txttnk1lwt.Text.Replace(",", "."))
    47. Catch myerror As MySqlException
    48. 'fehler meldung und fehlercode anzeigen
    49. MessageBox.Show("Es ist ein Fehler aufgetreten" & vbCrLf & myerror.Message & vbCrLf & "Errorcode: " & myerror.Number, "MySQL Fehler", MessageBoxButtons.OK, MessageBoxIcon.Error)
    50. End Try
    51. cmd.ExecuteNonQuery()
    52. MessageBox.Show("Messungen erfolgreich eingetragen", "Information", MessageBoxButtons.OKCancel, MessageBoxIcon.Information)
    53. Else
    54. MessageBox.Show("Es ist ein Fehler aufgetreten" & vbCrLf & "Nicht alle Angaben enthalten gültige Werte.", "Eingabefehler", MessageBoxButtons.OK, MessageBoxIcon.Error)
    55. End If
    56. End Sub
    57. End Class


    Bei einer Datagridview funktioniert das doch mit Fill wie z.B.

    VB.NET-Quellcode

    1. Public Sub Disp_data()
    2. Dim cmd As New MySqlCommand("SELECT * FROM `DWP`.`gummituchwechsel` WHERE druckeinheit = 'DE1'", con)
    3. cmd.ExecuteNonQuery()
    4. Dim dt As New DataTable
    5. Dim da As New MySqlDataAdapter(cmd)
    6. da.Fill(dt)
    7. DataGridViewlistede1.DataSource = dt
    8. DataGridViewlistede1.CurrentCell = DataGridViewlistede1.Item(0, DataGridViewlistede1.Rows.Count - 1)
    9. End Sub


    Git es soetwas auch für Texboxen?

    Gruß und Danke

    Gebhard
    Das Zauberwort heißt DataBinding. Ja, das gibt es auch für TextBox und viele andere Controls. Es gibt verschiedene Arten von DataBinding. Simple, List und Complex. Du brauchst SimpleDataBinding, bei dem ein Wert eines Datenpakets im Zielcontrol angezeigt (und ggf. geändert) wird. Grundsätzlich läuft jede Art von WinForms-DataBinding nach dem Schema:
    • Daten in eine geeignete Datenstruktur laden, also z.B. eine Datensatzklasseninstanz (sog.POCOs oder hier wohl POVOs) oder eine Liste von Datensatzklasseninstanzen
    • Datensatz(liste) über eine BindingSource dem GUI zugänglich machen
    • Control(s) an den gewünschten BindingSource-Teil binden
    Die BindingSource (BS) nimmt als Datenquelle entweder einen Datensatz (Datenklasseninstanz) oder eine Liste davon. Die Position der BS bestimmt, welcher Eintrag der Liste im Current der BS steht. Hast Du eine List(Of Foo) und 12 Foos in jener Liste und legst diese List(Of Foo) als DataSource der BS fest, kannst Du über die Position nun z.B. Position 0 festlegen. Damit wäre im BS-Current der erste Listeneintrag "drin", also über Current zugänglich. Mit den BS.Move…-Befehlen oder über Setzen der Position kannst Du über Code den Listeneintrag wählen, der im BS-Current drinstecken soll.
    Im GUI kannst Du für Deine TextBox nun über die Property DataBinding festlegen, welche TextBox-Eigenschaft mit welcher Foo-Eigenschaft verbunden werden soll. So wird bei TextBoxen sehr häufig die Text-Property verbunden, sodass eben die gewählte Foo-Property in der TextBox gezeigt wird.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    Hallo VaporiZed

    Danke für deine Bemühungen. Ich bin jetzt etwas überfordert da ich nicht genau weiß ob ich die Frage aus Post 5 richtig gestellt habe, oder mich falsch ausdrückte.
    Ich versuche es hinzubekommen das wenn ich einen neuen Messwert (123) eingebe und mit Eintragen & Speichern in die db schreibe der Wert der vorher angezeigt wird (258) aktualisiert wird.
    Im Moment muss ich das Fenster schliessen und neu aufmachen, damit mir der neu eingegebene Wert (123) angezeigt wird. Der Wert wird in einem Label ausgegeben. (lbltnk1lwt)
    So wir Refresh oder frmForm1_load.Load() aber das klaptt nicht.
    Gruß Gebhard

    Typhoon schrieb:

    Im Moment muss ich das Fenster schliessen und neu aufmachen
    Und was passiert da konkret als Code? Das sollte eben statt dort im Button-EventHandler passieren. Also einfach den Code verschieben. Oder besser in eine passende Methode verschieben und über den Button nur jene Methode aufrufen.

    btw:

    Typhoon schrieb:

    wird in einem Label ausgegeben. (lbltnk1lwt)
    Mit der Labelbezeichnung willst Du wahrscheinlich einen Kryptowettbewerb gewinnen. Warum werden derartige Controlbenennungen eigentlich noch verwendet? Hirntraining?
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    Und was passiert da konkret als Code?

    Beim aufrufen der Form wird folgeneder Code ausgeführt:

    VB.NET-Quellcode

    1. Imports MySql.Data.MySqlClient
    2. Public Class FrmFeuchtraum
    3. Private Sub FrmFeuchtraum_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    4. Dim AktFldNme As String = String.Empty
    5. Dim MyReader As MySqlDataReader = Nothing
    6. Dim cmd As New MySqlCommand
    7. Dim sql As String = "Select * FROM `DWP`.`feuchtmittelmessung` WHERE tank = 'T1' ORDER BY datum DESC LIMIT 1"
    8. Try
    9. If CBool(ConnectDatabase()) Then
    10. cmd = New MySqlCommand With {
    11. .Connection = con,
    12. .CommandText = sql
    13. }
    14. MyReader = cmd.ExecuteReader
    15. With MyReader
    16. While .Read
    17. For N As Integer = 0 To .FieldCount - 1
    18. AktFldNme = .GetName(N)
    19. Select Case AktFldNme.ToLower
    20. Case "datum".ToLower
    21. lblDatumT1.Text = .GetDateTime(N).ToString("g") '"dd/MM/yyyy HH:mm:ss"
    22. Case "leitwert".ToLower
    23. lbltnk1lwt.Text = .GetInt32(N).ToString("D")
    24. End Select
    25. Next
    26. End While
    27. End With
    28. End If
    29. Catch ex As MySqlException
    30. MsgBox(ex.Message, MsgBoxStyle.Critical, "Error [" & ex.GetType.Name & ", Akt. Feld: """ & AktFldNme & """]")
    31. Finally
    32. If MyReader IsNot Nothing Then
    33. MyReader.Close()
    34. MyReader = Nothing
    35. End If
    36. If cmd IsNot Nothing Then
    37. cmd.Dispose()
    38. cmd = Nothing
    39. End If
    40. End Try
    41. End Sub


    Der holt sich immer den letzten eintrag aus der db und wirft den in der Textbox aus.

    Der neue Eintrag wird mit folgendem Code in die db geschrieben:

    VB.NET-Quellcode

    1. Private Sub BtnSpeichern_Click(sender As Object, e As EventArgs) Handles BtnSpeichern.Click
    2. Dim cmd As New MySqlCommand("INSERT INTO `DWP`.`feuchtmittelmessung`(tank, leitwert)Values('T1', @leitwert)", con)
    3. If CheckValidInput(txttnk1lwt.Text) = CStr(True) Then
    4. Try
    5. cmd.Parameters.AddWithValue("leitwert", txttnk1lwt.Text.Replace(",", "."))
    6. Catch myerror As MySqlException
    7. 'fehler meldung und fehlercode anzeigen
    8. MessageBox.Show("Es ist ein Fehler aufgetreten" & vbCrLf & myerror.Message & vbCrLf & "Errorcode: " & myerror.Number, "MySQL Fehler", MessageBoxButtons.OK, MessageBoxIcon.Error)
    9. End Try
    10. cmd.ExecuteNonQuery()
    11. MessageBox.Show("Messungen erfolgreich eingetragen", "Information", MessageBoxButtons.OKCancel, MessageBoxIcon.Information)
    12. txttnk1lwt.Clear()
    13. Else
    14. MessageBox.Show("Es ist ein Fehler aufgetreten" & vbCrLf & "Nicht alle Angaben enthalten gültige Werte.", "Eingabefehler", MessageBoxButtons.OK, MessageBoxIcon.Error)
    15. End If
    16. End Sub


    Danach sollte die Form aktualisiert werden ohne das ich immer die Form schließen und dann wieder zu öffnen.

    Mit der Labelbezeichnung willst Du wahrscheinlich einen Kryptowettbewerb gewinnen.


    lbltnk1lwt = LabelTank1Leitwert vielleicht wäre besser lblt1lwt

    Gruß Gebhard
    Das mit der Labelbezeichnung musst Du für Dich wissen und entscheiden …
    Der ganze Code aus dem FormLoad-EventHandler kann doch in eine Sub namens … keine Ahnung, ReloadData. Und den Code von BtnSpeichern_Click in eine namens SaveData. Das kannst Du dann vom FormLoad-EventHandler aus aufrufen, aber eben auch nach dem Speichern über den Button. Also

    VB.NET-Quellcode

    1. Private Sub FrmFeuchtraum_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    2. ReloadData()
    3. End Sub
    4. Private Sub BtnSpeichern_Click(sender As Object, e As EventArgs) Handles BtnSpeichern.Click
    5. SaveData()
    6. ReloadData()
    7. End Sub
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.