Programmfehler seit Windowsversion 1903

  • VB.NET
  • .NET 4.5

Es gibt 90 Antworten in diesem Thema. Der letzte Beitrag () ist von Westerwälder.

    Wird dann in dem Druckauftrag zugewiesen.
    Hier ein kurzes Beispiel:

    VB.NET-Quellcode

    1. Private Sub Haus_HeizungHardware()
    2. ExcelApp = New Application
    3. ExcelBuch = ExcelApp.Workbooks.Open(Pfade.Formular.Pfad & "1032.xlsx")
    4. ExcelBuch.Saved = False
    5. ExcelApp.DisplayAlerts = False
    6. ExcelApp.Visible = False
    7. ExcelSeite = CType(ExcelBuch.Worksheets("Anlage"), Worksheet)
    8. With ExcelSeite.PageSetup
    9. .LeftHeader = "&12&B" & AppName & "-Hardware Heizung"
    10. .CenterHeader = "&12&B" & "Sternweg "
    11. .RightHeader = "&12&B" & "Imob-Nr. " & Einstellungen.IMOB_Objektnummer.ToString
    12. .LeftFooter = "&8" & Vorlagen.Copyright_Lang
    13. .CenterFooter = "&8" & "Printjob " & JobNummer.ToString
    14. End With
    15. ExcelSeite.Select()
    16. With ExcelSeite
    17. Zeile = 2
    18. For I = 0 To Haus.History.Tab_Hardware.Rows.Count - 1
    19. TabellenZeile = Haus.History.Tab_Hardware.Rows(I)
    20. Zeile += 1
    21. .Cells(Zeile, 1) = TabellenZeile("Beschreibung")
    22. .Cells(Zeile, 2) = TabellenZeile("Anlagenteil")
    23. Next I
    24. End With
    25. ExcelSeite.PrintOutEx()
    26. ExcelSeite = Nothing
    27. ExcelBuch = Nothing
    28. ExcelApp.Quit()
    29. ExcelApp = Nothing
    30. End Sub


    Funktionierte bisher fehlerfrei.
    Gruß Markus
    @Westerwälder Auf welche DLL hast Du da einen Verweis gesetzt?
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    VB-Fragen über PN / Konversation werden ignoriert!
    @Westerwälder Diehabichnich.
    Hast Du da was installiert?
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    VB-Fragen über PN / Konversation werden ignoriert!
    Kann ich nun wirklich nicht mehr sagen.
    Der Verweis war schon in der Vorgängerversion meiner App gesetzt.
    Das ist drei Jahre her.

    Wenn das so weitergeht, kann ich das Programm komplett neu schreiben.
    Erst die Probleme beim Erstlauf, nun kein Exceldruck mehr möglich.
    Bekomme langsam die Krise.
    Programmierzeit 9 Monate.

    Nicht das nun alles unklar wird.
    Der Erstlauf hängt seit dem Windows-Update auf Version 1903.
    Da ich letzte Woche noch Druckaufträge ausführen konnte, kann es damit nicht zusammen hängen.

    Denke die am 27.10.2019 installierten Updates sind dafür verantwortlich, dass kein Exceldruck mehr möglich ist.
    Warum bekomme ich Updates für Office 2010 wenn Office 2016 installiert ist?
    Bilder
    • Updates.png

      83,07 kB, 1.920×1.080, 20 mal angesehen
    Gruß Markus

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „Westerwälder“ ()

    Hat denn niemand einen Vorschlag?
    Wie es ausschaut wird bei jedem Update mein Programm instabiler.

    Welche Möglichkeiten bleiben mir nun?
    Im Dezember kommen die Jahresabschlüsse, Januar Nebenkostenabrechnung und im Februar Auswertungen für den Steuerberater.
    Auch wenn mir die Zeit bliebe das Programm neu zuschreiben, ich wüßte nicht wie ich die bestehende Problematik umgehen sollte.
    Habe den Code nicht geändert, die Fehler kommen durch Microsoft-Updates.

    Wenn meine Autowerkstatt mir ein neues Update aufzieht, erwarte ich das er auf der Postion R rückwärts fährt.
    Oder sehe ich das falsch?
    Gruß Markus
    1. Nachdem in Post#59 aufkam, dass das Öffnen einer Exceldatei einen Fehler erzeugt, stellt sich die Frage, ob das auch passieren würde, wenn Dein Programm nicht automatisch startet, sondern Du über ein VB.Net-Programm versuchst, eine Exceldatei zu öffnen.
    2. Ich hatte bei mir früher (Pre-Foren-Zeit) das Problem, dass ich mit einigen Programmen auch Officeprogramme automatisierte, aber der erste Word-/Excelstart nach PC-Neustart immer mit Fehlermeldungen scheiterte. Dann habe ich ein Zusatzprogramm geschrieben, welches nach PC-Start Word und Excel immer ohne Datei startete und sofort wieder schloss. Das Problem für meine anderen Programme war damit gegessen.
    Probier die beiden Vorschläge mal aus.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Häufig von mir verwendete Abkürzungen: CEs = control elements (Labels, Buttons, DGVs, ...) und tDS (typisiertes DataSet)
    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht in den Spekulatiusmodus gehen.
    @Westerwälder
    Du schreibst, dass du für Office10 Updates bekommst obwohl du Office16 am Laufen hast...?
    Schaue einmal nach, ob du die alte Version noch installiert hast - deinstalliere diese vollständig (da gibt's im Netz eigene Deinstallationsprogramme, die spurenfrei ein altes Office entfernen und völlig aus der Registry löschen)
    VaporiZed: Danke für deine Vorschläge.
    Aber der Fehler beim Öffnen einer Exceldatei besteht nun ständig. Auch bei Zweit- oder Drittstart, selbst in der IDE.

    VB1963: Auch Dir schönen Dank.
    Schließe ich eigentlich auch aus, weil Rechner im Januar neu gekauft wurde.
    Windows 10 war vorinstalliert, Office 16 von Microsoft online
    Check das aber im Laufe des Tages.
    Was mich immer wieder irritiert ist die database enegie 2010 German, passt diese wirklich zu meinem Officepaket (siehe Post #1)?
    Gruß Markus
    Habe Office 365 (2016) komplett neu installiert.
    Microsoft Accsess databas engine 2016 (English) installiert.

    Nun schaut es wie folgt aus:

    Die Exe-Version bricht nun relativ schnell die Aufgaben ab und beendet sich ohne Fehleranzeige. (auch nach dem 3. oder weiteren Start)
    Starte ich aber nun aus der IDE raus, läuft die jetzt im Erststart fehlerfrei durch.
    Exceldruck funktioniert aus der IDE auch wieder.
    Gruß Markus
    Die IDE-Version habe ich nun gleichgesetzt mit der Exe-Version.

    Jetzt kann ich einen Fehler erkennen.

    VB.NET-Quellcode

    1. ''' <summary>
    2. ''' Datenverbindung Öffnen
    3. ''' </summary>
    4. Private Sub Oeffnen()
    5. Try
    6. With Datenverbindung
    7. If .State = ConnectionState.Open Then Exit Sub
    8. If .State = ConnectionState.Connecting Then Exit Sub
    9. .Open() ' Fehler tritt hier auf. Try catch greift nicht
    10. End With
    11. Catch ex As Exception
    12. Journal.Bankfehler.Schreiben(Now, False, "", "Öffnenfehler: " & ex.Message)
    13. End Try
    14. End Sub


    Fehler:

    System.AccessViolationException
    HResult=0x80004003
    Es wurde versucht, im geschützten Speicher zu lesen oder zu schreiben. Dies ist häufig ein Hinweis darauf, dass anderer Speicher beschädigt ist.
    Gruß Markus
    @Westerwälder Sieht aus wie eine native Exception, die in der DLL nicht in eine gemanagede Exception umgeleitet wird.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    VB-Fragen über PN / Konversation werden ignoriert!
    Der folgende Fehler tritt wohl bei dem Einfrieren ein:

    Assistent für verwaltetes Debuggen "DisconnectedContext" : "Folgender Fehler beim Übergang in den COM-Kontext 0xa97f01a8 für diesen RuntimeCallableWrapper: Systemaufruf ist fehlgeschlagen. (Ausnahme von HRESULT: 0x80010100 (RPC_E_SYS_CALL_FAILED)). Dieser tritt in der Regel auf, da der COM-Kontext 0xa97f01a8, in dem dieser RuntimeCallableWrapper erstellt wurde, getrennt wurde oder aufgrund eines anderen Vorgangs ausgelastet ist. Die Schnittstellen werden aus dem aktuellen COM-Kontext (COM-Kontext 0xa97f02d0) freigegeben. Dies kann Datenbeschädigung oder -verlust zur Folge haben. Um dieses Problem zu vermeiden, müssen Sie sicherstellen, dass alle COM-Kontexte/Apartments/Threads so lange beibehalten werden und für den Kontextübergang verfügbar sind, bis die Anwendung alle RuntimeCallableWrappers, die in ihnen enthaltene COM-Komponenten darstellen, vollständig verarbeitet hat."
    Gruß Markus
    @Westerwälder Wie ist denn .State zu diesem Zeitpunkt?
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    VB-Fragen über PN / Konversation werden ignoriert!
    Rod, ich habe die Sub Schliessen mal deaktiviert, so erhalte ich keinen Fehler mehr in der Sub Oeffnen. (Post #71)

    VB.NET-Quellcode

    1. ''' <summary>
    2. ''' Datenverbindung Schliessen
    3. ''' </summary>
    4. Public Sub Schliessen()
    5. Exit Sub '########### NEU ###############################
    6. Try
    7. Datenverbindung.Close()
    8. OleDbConnection.ReleaseObjectPool()
    9. Catch ex As Exception
    10. Journal.Bankfehler.Schreiben(Now, False, "", "Schliessfehler: " & ex.Message)
    11. End Try
    12. End Sub


    Was bleibt ist das Einfrieren (Post #73).
    Gruß Markus

    Westerwälder schrieb:

    ich habe die Sub Schliessen mal deaktiviert
    Du postest immer nur kleine Häppchen, irgenwo ist aber das Große und Ganze verquer. ;(
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    VB-Fragen über PN / Konversation werden ignoriert!
    Ist halt viel Code.

    Spoiler anzeigen


    Quellcode

    1. Public Class CDatenBank
    2. Private WithEvents Timer_Tabellenupdate As New Timer With {.Enabled = False, .Interval = 250}
    3. Private WithEvents Timer_Tabellenlesung As New Timer With {.Enabled = False, .Interval = 250}
    4. Private Istlesen As Boolean = False
    5. Private Istupdadet As Boolean = False
    6. ''' <summary>
    7. ''' True: Klasse ist initalisiert
    8. ''' False: Klasse ist nicht initalisiert
    9. ''' </summary>
    10. Public IstInitalisiert As Boolean = False
    11. ''' <summary>
    12. ''' True: Klasse wurde initalisiert
    13. ''' False: Klasse wurde nicht initalisiert
    14. ''' </summary>
    15. Public WurdeInitalisiert As Boolean = False
    16. ''' <summary>
    17. ''' True: Alle Aufgaben in MeinInstall wurden erledigt
    18. ''' False: Alle Aufgaben in MeinInstall wurden nicht erledigt
    19. ''' </summary>
    20. Public Bereit As Boolean = False
    21. ''' <summary>
    22. ''' Name der Datatabelle
    23. ''' </summary>
    24. Public TabellenName As String
    25. ''' <summary>
    26. ''' Aktuelle ausgewählte Zeile der Datatabelle
    27. ''' </summary>
    28. Public DataZeile As DataRow
    29. ''' <summary>
    30. ''' Freie Zeile zur Verfügung
    31. ''' </summary>
    32. Public FreieZeile As DataRow
    33. ''' <summary>
    34. ''' 1. Zeile bei Install-Abfragen
    35. ''' </summary>
    36. Public ErsteZeile As DataRow
    37. ''' <summary>
    38. ''' Letzte Zeile der Datatabele
    39. ''' </summary>
    40. Public LetzteZeile As DataRow
    41. ''' <summary>
    42. ''' Freie Zeile für Prüfungen/Abfragen
    43. ''' </summary>
    44. Public PruefZeile As DataRow
    45. ''' <summary>
    46. ''' Freie Zeile der Datatable (Für Neuanlage)
    47. ''' </summary>
    48. Public NeueZeile As DataRow
    49. ''' <summary>
    50. ''' Freie Zeile zum Drucken
    51. ''' </summary>
    52. Public DruckZeile As DataRow
    53. ''' <summary>
    54. ''' Freie Zeile zum Löschen
    55. ''' </summary>
    56. Public LoeschZeile As DataRow
    57. ''' <summary>
    58. ''' Gibt an, ob nummeriert wird
    59. ''' Standard: False
    60. ''' </summary>
    61. Public Wird_Nummeriert As Boolean
    62. ''' <summary>
    63. ''' Freie Suchzeilen
    64. ''' </summary>
    65. Public SuchZeile() As DataRow
    66. ''' <summary>
    67. ''' Rückmeldung Neuanlagen: Nummernkreis freie Nummer möglich
    68. ''' </summary>
    69. Public NeuanlageMoeglich As Boolean
    70. ''' <summary>
    71. ''' Startnummer aus den NummernPool
    72. ''' </summary>
    73. Public Nummer_Von As Integer
    74. ''' <summary>
    75. ''' Endnummer aus dem NummernPool
    76. ''' </summary>
    77. Public Nummer_Bis As Integer
    78. ''' <summary>
    79. ''' Bezeichnung des Nummernfeld: z.Bsp. Nummer oder Kontonummer
    80. ''' </summary>
    81. Public Nummer_Feld As String
    82. ''' <summary>
    83. ''' True: Fehlende Nummer aus dem NummernPool werden vergeben
    84. ''' False: Es wird die nächste Nummer vergeben
    85. ''' </summary>
    86. Public Nummer_Automatic As Boolean
    87. ''' <summary>
    88. ''' Fehlernummer gem. Programm-Fehlersystem
    89. ''' </summary>
    90. Public FehlerNummer As Integer
    91. ''' <summary>
    92. ''' Verbindung zwischen Datenbank und Datentabelle
    93. ''' </summary>
    94. Protected WithEvents DataAdapter As OleDbDataAdapter
    95. ''' <summary>
    96. ''' Datenbefehle Insert, Delete, Update
    97. ''' </summary>
    98. Private DataBuilder As OleDbCommandBuilder
    99. ''' <summary>
    100. ''' Datentabelle: Spiegel der Tabelle der Datenbank
    101. ''' </summary>
    102. Public DataTabelle As DataTable
    103. ''' <summary>
    104. ''' Bezeichnung des Primärschüssel (z.Bsp. ID)
    105. ''' </summary>
    106. Public PrimKeyName As String
    107. ''' <summary>
    108. ''' OleDbConnection - Datenverbindung
    109. ''' </summary>
    110. Public Datenverbindung As New OleDbConnection
    111. ''' <summary>
    112. ''' Beispiel: "Select * From Pfade Order by Nummer"
    113. ''' </summary>
    114. Private VerbindungsAuftrag As String
    115. Private Verbindungsstring As String
    116. Private Speicherversuch As Integer
    117. Private Leseversuch As Integer
    118. Public I As Integer
    119. Private BNr As Integer
    120. Private NameTabelle As String
    121. ''' <summary>
    122. ''' Datenverbindung Schliessen
    123. ''' </summary>
    124. Public Sub Schliessen()
    125. Exit Sub '########### NEU ###############################
    126. 'Try
    127. ' Datenverbindung.Close()
    128. ' OleDbConnection.ReleaseObjectPool()
    129. 'Catch ex As Exception
    130. ' Journal.Bankfehler.Schreiben(Now, False, "", "Schliessfehler: " & ex.Message)
    131. 'End Try
    132. If Datenverbindung.State <> ConnectionState.Closed Then
    133. ' If Not Journal Is Nothing Then Journal.Bankfehler.Schreiben(Now, False, "Schliesse-Status", Datenverbindung.State.ToString)
    134. If Not Datenverbindung.State = ConnectionState.Open Then MsgBox("Schliessen " & Datenverbindung.State.ToString)
    135. Try
    136. Datenverbindung.Close() ' Nun hier der Fehler
    137. Catch ex As Exception
    138. ' MsgBox(Datenverbindung.State.ToString)
    139. End Try
    140. End If
    141. End Sub
    142. ''' <summary>
    143. ''' Datenverbindung Öffnen
    144. ''' </summary>
    145. Private Sub Oeffnen()
    146. 'Try
    147. ' With Datenverbindung
    148. ' If .State = ConnectionState.Open Then Exit Sub
    149. ' If .State = ConnectionState.Connecting Then Exit Sub
    150. ' .Open() ' Fehler tritt hier auf. Try catch greift nicht
    151. ' End With
    152. 'Catch ex As Exception
    153. ' Journal.Bankfehler.Schreiben(Now, False, "", "Öffnenfehler: " & ex.Message)
    154. 'End Try
    155. If Datenverbindung.State <> ConnectionState.Open Then
    156. Schliessen()
    157. ' If Not Journal Is Nothing Then Journal.Bankfehler.Schreiben(Now, False, "Öffnen-Status", Datenverbindung.State.ToString)
    158. If Not Datenverbindung.State = ConnectionState.Closed Then MsgBox("Öffne " & Datenverbindung.State.ToString)
    159. Try
    160. Datenverbindung.Open()
    161. Catch ex As Exception
    162. ' MsgBox(Datenverbindung.State.ToString)
    163. End Try
    164. End If
    165. End Sub
    166. ''' <summary>
    167. ''' Aus Datentabelle lesen
    168. ''' </summary>
    169. ''' <param name="Banknummer"></param>
    170. ''' <param name="TabName"></param>
    171. ''' <param name="Auftrag"></param>
    172. Public Sub Laden(ByVal Banknummer As Integer, ByVal TabName As String, Optional ByVal Auftrag As String = "Select *")
    173. BNr = Banknummer
    174. NameTabelle = TabName
    175. If Auftrag = "Select *" Then
    176. VerbindungsAuftrag = Auftrag & " From " & TabName & " Order By ID"
    177. Else
    178. VerbindungsAuftrag = Auftrag
    179. End If
    180. Select Case Banknummer
    181. Case 1
    182. Verbindungsstring = Daten.Verbindungsstring_MBHome
    183. Datenverbindung = Daten.Verbindung_MBHome
    184. Case 2
    185. Verbindungsstring = Daten.Verbindungsstring_MBMein
    186. Datenverbindung = Daten.Verbindung_MBMein
    187. Case 3
    188. Verbindungsstring = Daten.Verbindungsstring_MBImob
    189. Datenverbindung = Daten.Verbindung_MBImob
    190. Case 9
    191. Verbindungsstring = Daten.Verbindungsstring_MBSoftAlt
    192. Datenverbindung = Daten.Verbindung_MBSoftAlt
    193. End Select
    194. If Istlesen Then
    195. Timer_Tabellenlesung.Enabled = True
    196. Exit Sub
    197. End If
    198. Istlesen = True
    199. Try
    200. Oeffnen()
    201. IstInitalisiert = False
    202. If PrimKeyName = Nothing Then PrimKeyName = "ID"
    203. If Nummer_Feld = Nothing Then Nummer_Feld = "Nummer"
    204. Using Datenverbindung = New OleDbConnection(Verbindungsstring)
    205. DataAdapter = New OleDbDataAdapter(VerbindungsAuftrag, Me.Datenverbindung)
    206. DataBuilder = New OleDbCommandBuilder(DataAdapter) With {.QuotePrefix = "[", .QuoteSuffix = "]"}
    207. DataAdapter.MissingSchemaAction = MissingSchemaAction.AddWithKey
    208. DataTabelle = New DataTable
    209. DataAdapter.FillSchema(DataTabelle, SchemaType.Mapped)
    210. DataAdapter.Fill(DataTabelle)
    211. DataTabelle.PrimaryKey = New DataColumn() {DataTabelle.Columns(PrimKeyName)}
    212. TabellenName = DataTabelle.TableName
    213. DataZeile = DataTabelle.NewRow
    214. IstInitalisiert = True
    215. WurdeInitalisiert = True
    216. If Not DataTabelle.Rows.Count < 1 Then
    217. ErsteZeile = DataTabelle.Rows(0)
    218. LetzteZeile = DataTabelle.Rows(DataTabelle.Rows.Count - 1)
    219. End If
    220. End Using
    221. Catch Nobject As NullReferenceException
    222. Vorlagen.JaNein = MessageBox.Show("Dem Lade-/Lesevorgang wurde" & vbNewLine &
    223. "kein Objekt zugewiesen." & vbNewLine & vbNewLine &
    224. "Möchten Sie das Programm nun beenden?", "Datenbank-Lesefehler " & Vorlagen.Copyright_Messagebox,
    225. MessageBoxButtons.YesNo, MessageBoxIcon.Question)
    226. If Vorlagen.JaNein = DialogResult.Yes Then
    227. End
    228. End If
    229. Exit Sub
    230. Catch ex As Exception
    231. Leseversuch += 1
    232. If Leseversuch < 2 Then
    233. Threading.Thread.Sleep(500)
    234. Laden(BNr, Nothing, VerbindungsAuftrag)
    235. Journal.Bankfehler.Schreiben(Now, False, DataTabelle.TableName, "Lesefehler: " & ex.Message)
    236. Schliessen()
    237. Exit Sub
    238. End If
    239. Journal.Bankfehler.Schreiben(Now, True, TabName, "Ladefehler: " & ex.Message)
    240. Leseversuch = 0
    241. Schliessen()
    242. Istlesen = False
    243. Exit Sub
    244. End Try
    245. Istlesen = False
    246. Leseversuch = 0
    247. Schliessen()
    248. MeinInstall()
    249. End Sub
    250. ''' <summary>
    251. ''' Objektspzifische Installierung von Daten und Eigenschaften
    252. ''' </summary>
    253. Protected Overridable Sub MeinInstall()
    254. End Sub
    255. Private Sub Timer_Tabellenlesung_Elapsed(sender As Object, e As ElapsedEventArgs) Handles Timer_Tabellenlesung.Elapsed
    256. If Istupdadet Then Exit Sub
    257. If Istlesen Then Exit Sub
    258. Timer_Tabellenlesung.Enabled = False
    259. Laden(BNr, NameTabelle, VerbindungsAuftrag)
    260. End Sub
    261. Private Sub Timer_Tabellenupdate_Elapsed(sender As Object, e As ElapsedEventArgs) Handles Timer_Tabellenupdate.Elapsed
    262. If Istupdadet Then Exit Sub
    263. If Istlesen Then Exit Sub
    264. Timer_Tabellenupdate.Enabled = False
    265. Speichern()
    266. End Sub
    267. ''' <summary>
    268. ''' Speichert die Datentabelle in der Datenbank
    269. ''' </summary>
    270. Public Sub Speichern()
    271. Try
    272. If Istupdadet Then
    273. Timer_Tabellenupdate.Enabled = True
    274. Exit Sub
    275. End If
    276. Istupdadet = True
    277. Oeffnen()
    278. DataAdapter.Update(DataTabelle)
    279. Istupdadet = False
    280. Speicherversuch = 0
    281. Catch Nobject As NullReferenceException
    282. 'Istupdadet = True
    283. 'Vorlagen.JaNein = MessageBox.Show("Dem Speichervorgang wurde" & vbNewLine &
    284. ' "kein Objekt zugewiesen." & vbNewLine &
    285. ' "Tabelle-Namen: " & DataTabelle.TableName & vbNewLine & vbNewLine &
    286. ' "Möchten Sie das Programm nun beenden?", "Datenbank-Speicherfehler " & Vorlagen.Copyright_Messagebox,
    287. ' MessageBoxButtons.YesNo, MessageBoxIcon.Question)
    288. 'If Vorlagen.JaNein = DialogResult.Yes Then
    289. ' End
    290. 'End If
    291. 'Istupdadet = False
    292. 'Exit Sub
    293. Catch dbcx As DBConcurrencyException
    294. Istupdadet = False
    295. Journal.Bankfehler.Schreiben(Now, False, DataTabelle.TableName, "Speicherfehler: " & dbcx.Message)
    296. ' Speichern()
    297. Exit Sub
    298. Catch ex As Exception
    299. 'If Datenverbindung.State = ConnectionState.Closed Then
    300. ' Speichern()
    301. ' Exit Sub
    302. 'End If
    303. Istupdadet = False
    304. Speicherversuch += 1
    305. If Speicherversuch < 2 Then
    306. Threading.Thread.Sleep(500)
    307. Laden(BNr, DataTabelle.TableName, VerbindungsAuftrag)
    308. Exit Sub
    309. End If
    310. 'Istupdadet = False
    311. 'Journal.Bankfehler.Schreiben(Now, True, DataTabelle.TableName, "Speicherfehler: " & ex.Message)
    312. 'Vorlagen.JaNein = MessageBox.Show("Bei dem Versuch die Datenbank zu aktualisieren ist ein Fehler aufgetreten." & vbNewLine &
    313. ' "Tabellenname: " & DataTabelle.TableName & vbNewLine &
    314. ' "Fehlermeldung:" & vbNewLine &
    315. ' ex.Message & vbNewLine &
    316. ' "Der Fehler wurde im Journal gespeichert." & vbNewLine & vbNewLine &
    317. ' "Möchten Sie nun den Thread beenden? " & vbNewLine &
    318. ' "Bei Verneinung wird das Datenmodell neu geladen." & vbNewLine,
    319. ' "Datenbankmanagement " & Vorlagen.Copyright_Messagebox, MessageBoxButtons.YesNo, MessageBoxIcon.Error)
    320. 'If Vorlagen.JaNein = DialogResult.Yes Then
    321. ' Application.ExitThread()
    322. ' Exit Sub
    323. 'End If
    324. 'If Vorlagen.JaNein = DialogResult.No Then
    325. ' Laden(BNr, TabellenName, VerbindungsAuftrag)
    326. 'End If
    327. End Try
    328. Istupdadet = False
    329. Schliessen()
    330. End Sub
    331. Private _IdentityCommand As New OleDbCommand("SELECT @@IDENTITY")
    332. Private Sub _RowUpdated(ByVal sender As Object, ByVal e As OleDbRowUpdatedEventArgs) Handles DataAdapter.RowUpdated
    333. If e.StatementType = StatementType.Insert Then
    334. _IdentityCommand.Connection = e.Command.Connection
    335. _IdentityCommand.Transaction = e.Command.Transaction
    336. e.Row(e.Row.Table.PrimaryKey(0)) = CInt(_IdentityCommand.ExecuteScalar())
    337. End If
    338. End Sub
    339. ''' <summary>
    340. ''' Datentabelle erneut aus Datenbank lesen
    341. ''' </summary>
    342. Public Sub Neuladen()
    343. Try
    344. IstInitalisiert = False
    345. If PrimKeyName = Nothing Then PrimKeyName = "ID"
    346. If Nummer_Feld = Nothing Then Nummer_Feld = "Nummer"
    347. Using Datenverbindung = New OleDbConnection(Verbindungsstring)
    348. DataAdapter = New OleDbDataAdapter(VerbindungsAuftrag, Me.Datenverbindung)
    349. DataBuilder = New OleDbCommandBuilder(DataAdapter) With {.QuotePrefix = "[", .QuoteSuffix = "]"}
    350. DataAdapter.MissingSchemaAction = MissingSchemaAction.AddWithKey
    351. DataTabelle = New DataTable
    352. DataAdapter.FillSchema(DataTabelle, SchemaType.Mapped)
    353. DataAdapter.Fill(DataTabelle)
    354. DataTabelle.PrimaryKey = New DataColumn() {DataTabelle.Columns(PrimKeyName)}
    355. TabellenName = DataTabelle.TableName
    356. DataZeile = DataTabelle.NewRow
    357. IstInitalisiert = True
    358. WurdeInitalisiert = True
    359. If Not DataTabelle.Rows.Count < 1 Then
    360. ErsteZeile = DataTabelle.Rows(0)
    361. LetzteZeile = DataTabelle.Rows(DataTabelle.Rows.Count - 1)
    362. End If
    363. End Using
    364. Catch Nobject As NullReferenceException
    365. Vorlagen.JaNein = MessageBox.Show("Dem Lade-/Lesevorgang wurde" & vbNewLine &
    366. "kein Objekt zugewiesen." & vbNewLine & vbNewLine &
    367. "Möchten Sie das Programm nun beenden?", "Datenbank-Lesefehler " & Vorlagen.Copyright_Messagebox,
    368. MessageBoxButtons.YesNo, MessageBoxIcon.Question)
    369. If Vorlagen.JaNein = DialogResult.Yes Then
    370. End
    371. End If
    372. Exit Sub
    373. Catch ex As Exception
    374. Leseversuch += 1
    375. If Leseversuch = 1 Then
    376. Threading.Thread.Sleep(500)
    377. Schliessen()
    378. Neuladen()
    379. Journal.Bankfehler.Schreiben(Now, False, DataTabelle.TableName, "Neuladefehler: " & ex.Message)
    380. Exit Sub
    381. End If
    382. MessageBox.Show("Fehler Datenbank Neu-Laden: " & vbNewLine & ex.Message, AppName, MessageBoxButtons.OK, MessageBoxIcon.Hand)
    383. Journal.Bankfehler.Schreiben(Now, True, DataTabelle.TableName, "Neuladefehler: " & ex.Message)
    384. Leseversuch = 0
    385. Schliessen()
    386. Exit Sub
    387. End Try
    388. Schliessen()
    389. End Sub
    390. ''' <summary>
    391. ''' DataTabelle und DataQuelle werden zerstört
    392. ''' </summary>
    393. Public Sub Entladen()
    394. DataTabelle = New DataTable
    395. IstInitalisiert = False
    396. MeinEntladen()
    397. End Sub
    398. ''' <summary>
    399. ''' Entladen von objektspezifischen Elementen
    400. ''' </summary>
    401. Protected Overridable Sub MeinEntladen()
    402. End Sub
    403. ''' <summary>
    404. ''' Gibt wieder, ob Datentabelle Datensätze beinhaltet
    405. ''' </summary>
    406. ''' <returns></returns>
    407. Property HatDaten As Boolean
    408. Get
    409. If AnzahlDatensaetze = 0 Then
    410. Return False
    411. Else
    412. Return True
    413. End If
    414. End Get
    415. Private Set(value As Boolean)
    416. End Set
    417. End Property
    418. ''' <summary>
    419. ''' Liefert die Anzahl der Datensäte in der Datentabelle
    420. ''' </summary>
    421. ''' <returns></returns>
    422. Property AnzahlDatensaetze As Integer
    423. Get
    424. If DataTabelle Is Nothing Then
    425. Return 0
    426. Exit Property
    427. End If
    428. Return DataTabelle.Rows.Count
    429. End Get
    430. Private Set(value As Integer)
    431. End Set
    432. End Property
    433. ''' <summary>
    434. ''' Liefert die neue neue Nummer lt. Datenpool der Anwendung
    435. ''' </summary>
    436. ''' <returns></returns>
    437. Property NummerNeu As Integer
    438. Get
    439. NeuanlageMoeglich = False
    440. Dim NP As Integer = Daten.NeueNummer_Ermittlung(DataTabelle, Nummer_Von, Nummer_Bis, Nummer_Automatic, Nummer_Feld)
    441. If NP = -1 Then
    442. MessageBox.Show("Eine Neuanlage ist nicht möglich, da keine Nummer" & vbNewLine &
    443. "aus dem Nummernkreis mehr zur Verfügung steht.",
    444. "Datenbankmanagment", MessageBoxButtons.OK, MessageBoxIcon.Error)
    445. NeuanlageMoeglich = False
    446. Return -1
    447. Exit Property
    448. End If
    449. NeuanlageMoeglich = True
    450. Return NP
    451. End Get
    452. Private Set(value As Integer)
    453. End Set
    454. End Property
    455. End Class




    Gruß Markus

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „Westerwälder“ ()

    Westerwälder schrieb:

    ich habe die Sub Schliessen mal deaktiviert
    Meine Open/Close-Mechanismen sehen normalerweise so ähnlich aus

    VB.NET-Quellcode

    1. Function OpenConnection(Optional ForceReconnect As Boolean=False) As Boolean
    2. If ForceReconnect OrElse DbConnection.State <> ConnectionState.Open Then
    3. CloseConnection
    4. DbConnection.Open
    5. End If
    6. Return DbConnection.State = ConnectionState.Open
    7. End Function
    8. Sub CloseConnection()
    9. If DbConnection.State <> ConnectionState.Closed Then DbConnection.Close
    10. End Sub
    Da passieren keine ungewollten Statusveränderungen.
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „petaod“ ()

    Hallo petaod, habe das bei mir übernommen, erhalte doch einen Fehler.

    VB.NET-Quellcode

    1. ''' <summary>
    2. ''' Datenverbindung Schliessen
    3. ''' </summary>
    4. Public Sub Schliessen()
    5. 'Exit Sub '########### NEU ###############################
    6. 'Try
    7. ' Datenverbindung.Close()
    8. ' OleDbConnection.ReleaseObjectPool()
    9. 'Catch ex As Exception
    10. ' Journal.Bankfehler.Schreiben(Now, False, "", "Schliessfehler: " & ex.Message)
    11. 'End Try
    12. If Datenverbindung.State <> ConnectionState.Closed Then Datenverbindung.Close() ' Nun hier der Fehler
    13. End Sub
    14. ''' <summary>
    15. ''' Datenverbindung Öffnen
    16. ''' </summary>
    17. Private Sub Oeffnen()
    18. 'Try
    19. ' With Datenverbindung
    20. ' If .State = ConnectionState.Open Then Exit Sub
    21. ' If .State = ConnectionState.Connecting Then Exit Sub
    22. ' .Open() ' Fehler tritt hier auf. Try catch greift nicht
    23. ' End With
    24. 'Catch ex As Exception
    25. ' Journal.Bankfehler.Schreiben(Now, False, "", "Öffnenfehler: " & ex.Message)
    26. 'End Try
    27. If Datenverbindung.State <> ConnectionState.Open Then
    28. Schliessen()
    29. Datenverbindung.Open()
    30. End If
    31. End Sub


    Fehler bei Schliessen Datenverbindung.Close() ' Nun hier der Fehler
    Assistent für verwaltetes Debuggen "RaceOnRCWCleanup"
    Nachricht = Assistent für verwaltetes Debuggen "RaceOnRCWCleanup" : "Es wurde versucht, einen RCW freizugeben, der derzeit benutzt wird. Der RCW wird im aktiven Thread oder einem anderen Thread verwendet. Der Versuch, einen RCW freizugeben, der gerade verwendet wird, kann Datenbeschädigung oder -verlust zur Folge haben."
    Gruß Markus