eramm01 Ответов: 2

Сбой обновления Vb NET


У меня есть программа, которую я использую для мониторинга моего домашнего пивоварения. Ему уже двадцать лет, но в прошлом году я переписал его с помощью V2017. Он использует базу данных DAO 3.6.
Две недели назад он начал отказывать с обновлениями без всякой причины - всегда, возможно, обновление W-10.
Когда я перехожу в ту часть программы, где сбой находится в режиме отладки, я получаю следующую ошибку при команде "обновить "" система.AccessViolationException: 'попытка чтения или записи защищенной памяти."
Это происходит только с одним файлом в базе данных. Другие файлы обновляются идеально.
Я проверил файл с помощью Visual Data Manager (инструмент, который поставляется вместе с VB6), и он выглядит идеально.
Помогите !

Я скопировал полную информацию об исключении ниже:

-		$exception	{"Attempted to read or write protected memory. This is often an indication that other memory is corrupt."}	System.AccessViolationException
+		Data	{System.Collections.ListDictionaryInternal}	System.Collections.IDictionary {System.Collections.ListDictionaryInternal}
		HResult	-2147467261	Integer
		HelpLink	Nothing	String
+		IPForWatsonBuckets	&H00000000	System.UIntPtr
+		InnerException	Nothing	System.Exception
		IsTransient	False	Boolean
		Message	"Attempted to read or write protected memory. This is often an indication that other memory is corrupt."	String
		RemoteStackTrace	Nothing	String
		Source	"BOOZ"	String
		StackTrace	"   at DAO.Recordset.Update(Int32 UpdateType, Boolean Force)" & vbCrLf & "   at BOOZ.frmMaster.UpdateSaveToolStripMenuItem_Click(Object sender, EventArgs e) in C:\Users\Ned\Documents\Development\BOOZ303 - VB-Net 2017\BOOZ\BOOZ\bzMaster.vb:line 342" & vbCrLf & "   at System.Windows.Forms.ToolStripItem.RaiseEvent(Object key, EventArgs e)" & vbCrLf & "   at System.Windows.Forms.ToolStripMenuItem.OnClick(EventArgs e)" & vbCrLf & "   at System.Windows.Forms.ToolStripItem.HandleClick(EventArgs e)" & vbCrLf & "   at System.Windows.Forms.ToolStripItem.HandleMouseUp(MouseEventArgs e)" & vbCrLf & "   at System.Windows.Forms.ToolStripItem.FireEventInteractive(EventArgs e, ToolStripItemEventType met)" & vbCrLf & "   at System.Windows.Forms.ToolStripItem.FireEvent(EventArgs e, ToolStripItemEventType met)" & vbCrLf & "   at System.Windows.Forms.ToolStrip.OnMouseUp(MouseEventArgs mea)" & vbCrLf & "   at System.Windows.Forms.ToolStripDropDown.OnMouseUp(MouseEventArgs mea)" & vbCrLf & "   at System.Windows.Forms.Control.WmMouseUp(Message& m, MouseButtons button, Int32 clicks)" & vbCrLf & "   at System.Windows.Forms.Control.WndProc(Message& m)" & vbCrLf & "   at System.Windows.Forms.ScrollableControl.WndProc(Message& m)" & vbCrLf & "   at System.Windows.Forms.ToolStrip.WndProc(Message& m)" & vbCrLf & "   at System.Windows.Forms.ToolStripDropDown.WndProc(Message& m)" & vbCrLf & "   at System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)" & vbCrLf & "   at System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)" & vbCrLf & "   at System.Windows.Forms.NativeWindow.DebuggableCallback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)" & vbCrLf & "   at System.Windows.Forms.UnsafeNativeMethods.DispatchMessageW(MSG& msg)" & vbCrLf & "   at System.Windows.Forms.Application.ComponentManager.System.Windows.Forms.UnsafeNativeMethods.IMsoComponentManager.FPushMessageLoop(IntPtr dwComponentID, Int32 reason, Int32 pvLoopData)" & vbCrLf & "   at System.Windows.Forms.Application.ThreadContext.RunMessageLoopInner(Int32 reason, ApplicationContext context)" & vbCrLf & "   at System.Windows.Forms.Application.ThreadContext.RunMessageLoop(Int32 reason, ApplicationContext context)" & vbCrLf & "   at Microsoft.VisualBasic.ApplicationServices.WindowsFormsApplicationBase.OnRun()" & vbCrLf & "   at Microsoft.VisualBasic.ApplicationServices.WindowsFormsApplicationBase.DoApplicationModel()" & vbCrLf & "   at Microsoft.VisualBasic.ApplicationServices.WindowsFormsApplicationBase.Run(String[] commandLine)" & vbCrLf & "   at BOOZ.My.MyApplication.Main(String[] Args) in :line 81"	String
+		TargetSite	{Void Update(Int32, Boolean)}	System.Reflection.MethodBase {System.Reflection.RuntimeMethodInfo}
+		WatsonBuckets	{Length=5616}	Object {Byte()}
		_HResult	-2147467261	Integer
		_accessType	0	Integer
		_className	Nothing	String
+		_data	{System.Collections.ListDictionaryInternal}	System.Collections.IDictionary {System.Collections.ListDictionaryInternal}
		_dynamicMethods	Nothing	Object
+		_exceptionMethod	{Void Update(Int32, Boolean)}	System.Reflection.MethodBase {System.Reflection.RuntimeMethodInfo}
		_exceptionMethodString	Nothing	String
		_helpURL	Nothing	String
+		_innerException	Nothing	System.Exception
+		_ip	&H0F3FB4A8	System.IntPtr
+		_ipForWatsonBuckets	&H00000000	System.UIntPtr
		_message	"Attempted to read or write protected memory. This is often an indication that other memory is corrupt."	String
		_remoteStackIndex	0	Integer
		_remoteStackTraceString	Nothing	String
+		_safeSerializationManager	{System.Runtime.Serialization.SafeSerializationManager}	System.Runtime.Serialization.SafeSerializationManager
		_source	"BOOZ"	String
+		_stackTrace	{Length=768}	Object {SByte()}
		_stackTraceString	Nothing	String
+		_target	&H0000002C	System.IntPtr
+		_watsonBuckets	{Length=5616}	Object {Byte()}
		_xcode	-1073741819	Integer
+		_xptrs	&H010FD52C	System.IntPtr


Что я уже пробовал:

Я попытался изменить dll - файлы на другую версию в случае, если она повреждена-никакой радости

2 Ответов

Рейтинг:
1

eramm01

Решено - один из индексов в моей базе данных был поврежден. Я удалил его, и программа работала нормально. Это, должно быть, было вызвано чем-то вроде обновления Microsoft Windows, потому что резервные копии базы данных, возвращающиеся много лун назад, показали ту же проблему, но работали нормально месяц назад.
Я, вероятно, все еще буду переписывать более современный код (я хорошо в этом разбираюсь), но давление отпадает.
Спасибо за вашу помощь.


Рейтинг:
0

Dave Kreskowiak

С помощью только трассировки стека и сообщения об ошибке en невозможно сказать вам, что происходит.

Там что-то происходит со словарем, который вы используете где-то в frmMaster.UpdateSaveToolStripMenuItem_Click код или какой-то фрагмент кода, который он вызывает. Мы не видим кода, поэтому не можем сказать, что не так.

Дао мертв уже очень давно. Я бы предложил переделать код базы данных с помощью ADO.NET. Вы все еще можете использовать базу данных Access, которую вы использовали (предположение!) но просто перепишите код доступа к базе данных в своем приложении, чтобы устранить зависимость от DAO.


eramm01

Спасибо, что откликнулись. Могу ли я предложить вам что-нибудь еще, что могло бы помочь?
Поскольку он работал, я не изменил никакого кода, и теперь я получаю одно и то же сообщение об ошибке как против моей живой базы данных, так и против копий базы данных, сделанных в прошлом, - так что это не то, что случилось с моим кодом или с базой данных.
Я бы предпочел не переписывать в АДО

Dave Kreskowiak

Вероятно, это было обновление, которое сломало ваш код. Проблема с использованием очень старых библиотек, таких как DAO, заключается в том, что новые обновления могут привести к тому, что старая библиотека перестанет работать. Старый код, подобный этому, не был обновлен, чтобы закрыть дыры в безопасности, и на самом деле может зависеть от старого плохого кода, чтобы продолжать работать. Вот почему я говорю, что выход из DAO - лучший вариант.

eramm01

Возможно, вы правы, и мне нужно расследовать переезд в АДО. Я вижу, что на сайте Microsoft есть много документов об этом. Это единственное программное обеспечение, которое мне нужно ADO.NET Entity Framework 4.1 ?

Dave Kreskowiak

Вам не нужен Entity Framework, и вам нечего скачивать. ADO.NET встроен в платформу .NET Framework.

Я предполагаю, что вы используете базу данных Access, и в этом случае вы бы использовали поставщика OleDb. Например: https://docs.microsoft.com/en-us/dotnet/framework/data/adonet/ado-net-code-examples#oledb

eramm01

Спасибо