MKP75 Ответов: 1

System.accessviolationexception попытался прочитать или записать защищенную память. Это часто указывает на то, что другая память повреждена


привет.
Я совершенно новичок в visual studio.

Мой код показан ниже.

ports System.IO
Imports System.Data
Imports System.Data.OleDb

Public Class ImportData1

    Private Sub ImportData1_Load(sender As Object, e As EventArgs) Handles MyBase.Load

        TxtFilePath.Text = "Place your file in D:\FileToImport Folder. File name should be MatRegFile.csv"

    End Sub

    Private Sub btnCancel_Click(sender As Object, e As EventArgs) Handles btnCancel.Click

        Me.Close()

    End Sub

    Private Sub btnImport_Click(sender As Object, e As EventArgs) Handles btnImport.Click

        Dim conn As New OleDbConnection(“Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\Users\Mihir\Documents\MiniAGAppDB.accdb;Persist Security Info=True”)
        Dim cmd As OleDbCommand
        Dim querryStr As String

        Try

            querryStr = "Select * InTo Temp1 From [Text;FMT=Delimited;Database=D:\FileToImport;HDR=Yes].[MatRegFile.csv]"
            MessageBox.Show(querryStr)
            cmd = New OleDbCommand(querryStr, conn)
            conn.Open()
            cmd.ExecuteNonQuery()
            conn.Close()

            querryStr = "Insert InTo MaterialRegister ([Company_Code],[Company_Name],[Material_Code],[Material_Name],[Credit_Qty],[Debit_Qty],[Material_Count],[Material_Flag],[Material_Date],[Material_Inv_No],[Material_Party_Code],[Material_Party_Name],[Remark],[Entry_Flag],[Creation_Date],[User_Name]) Select [Company_Code],[Company_Name],[Material_Code],[Material_Name],[Credit_Qty],[Debit_Qty],[Material_Count],[Material_Flag],[Material_Date],[Material_Inv_No],[Material_Party_Code],[Material_Party_Name],[Remark],[Entry_Flag],[Creation_Date],[User_Name] From Temp1"
            cmd = New OleDbCommand(querryStr, conn)
            conn.Open()
            cmd.ExecuteNonQuery()
            conn.Close()

            querryStr = "Drop Table Temp1"
            cmd = New OleDbCommand(querryStr, conn)
            conn.Open()
            cmd.ExecuteNonQuery()
            conn.Close()

        Catch ex As Exception

            MessageBox.Show(ex.Message)

        End Try

    End Sub

End Class


Когда я запускаю приложение windows form я получаю следующее сообщение об ошибке в строке
cmd.ExecuteNonQuery() код ниже "вставить в MaterialRegister"


"
Visual studio 2017 System.AccessViolationException 'Attempted to read or write protected memory. This is often an indication that other memory is corrupt.'
"

Я использую windows 7 ultimate 64 bit edition с пакетом обновления 1, Visual Studio 2017 и .Net framework 4.6 с базой данных MS access и Crystal report.

Пожалуйста помочь......

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

Я не знаю, что попробовать, так как я совершенно новичок в visual studio.

1 Ответов

Рейтинг:
1

Richard MacCutchan

Скорее всего, что предыдущее SELECT INTO команда не создала данные, которые вы ожидаете. Вам нужно проверить возвращаемое значение от каждого вызова к ExecuteNonQuery чтобы убедиться, что это удалось.


MKP75

Спасибо за ответ. Оператор Select into Temp1 создает таблицу Temp1 в базе данных access, и данные также вставляются в таблицу Temp1 из CSV-файла.

Затем он приходит к Insert into MaterialRegister оператор после этого ошибка выбрасывается на ExecuteNonQuery оператор.

На самом деле код работал первые 2 раза, а затем начал выдавать ошибку.

Richard MacCutchan

Хорошо, но единственный способ узнать, почему возникает ошибка, - это использовать отладчик для проверки обрабатываемых данных. И, как я уже говорил ранее, проверьте возвращаемые значения из ваших системных/библиотечных вызовов. Не думайте, что только потому, что они не бросают исключение, что они сделали то, что вы думаете.

MKP75

Dim querryStr1 как строка

MKP75

Спасибо, я сделаю это и вернусь. Спасибо

MKP75

Вот что я получаю, когда отлаживаю программу

'MiniAGApp.exe' (CLR v4.0.30319: DefaultDomain): загружен 'C:\Windows\Microsoft.Net\assembly\GAC_32\mscorlib\v4.0_4.0.0.0__b77a5c561934e089\mscorlib.dll". Пропущенные символы загрузки. Модуль оптимизирован, и включена опция отладчика "только мой код".
'MiniAGApp.exe' (CLR v4.0.30319: DefaultDomain): загружен 'C:\Users\Mihir\Documents\Visual студия 2017\Projects\MiniAGApp\MiniAGApp\bin\Debug\MiniAGApp.exe". Символы загружены.
'MiniAGApp.exe' (CLR v4.0.30319: MiniAGApp.exe): загружено 'C:\Windows\Microsoft.Net\assembly\GAC_MSIL\Microsoft.VisualBasic\v4.0_10.0.0.0__b03f5f7f11d50a3a\Microsoft.VisualBasic.dll'. Пропущенные символы загрузки. Модуль оптимизирован, и включена опция отладчика "только мой код".
'MiniAGApp.exe' (CLR v4.0.30319: MiniAGApp.exe): заряжен 'C:\Windows\Microsoft.Net\assembly\GAC_MSIL\System\v4.0_4.0.0.0__b77a5c561934e089\System.dll". Пропущенные символы загрузки. Модуль оптимизирован, и включена опция отладчика "только мой код".
'MiniAGApp.exe' (CLR v4.0.30319: MiniAGApp.exe): заряжен 'C:\Windows\Microsoft.Net\assembly\GAC_MSIL\System-да.Core\v4.0_4.0.0.0__b77a5c561934e089\System.Core.dll". Пропущенные символы загрузки. Модуль оптимизирован, и включена опция отладчика "только мой код".
'MiniAGApp.exe' (CLR v4.0.30319: MiniAGApp.exe): заряжен 'C:\Windows\Microsoft.Net\assembly\GAC_MSIL\System-да.Окна.Формы\v4.0_4.0.0.0__b77a5c561934e089\система.Окна.Forms.dll". Пропущенные символы загрузки. Модуль оптимизирован, и включена опция отладчика "только мой код".
'MiniAGApp.exe' (CLR v4.0.30319: MiniAGApp.exe): заряжен 'C:\Windows\Microsoft.Net\assembly\GAC_MSIL\System-да.Чертеж\v4.0_4.0.0.0__b03f5f7f11d50a3a\система.Drawing.dll". Пропущенные символы загрузки. Модуль оптимизирован, и включена опция отладчика "только мой код".
'MiniAGApp.exe' (CLR v4.0.30319: MiniAGApp.exe): заряжен 'C:\Windows\Microsoft.Net\assembly\GAC_MSIL\System.Runtime-да.Дистанционное управление\v4.0_4.0.0.0__b77a5c561934e089\System.Runtime.Remoting.dll". Пропущенные символы загрузки. Модуль оптимизирован, и включена опция отладчика "только мой код".
'MiniAGApp.exe' (CLR v4.0.30319: MiniAGApp.exe): заряжен 'C:\Windows\Microsoft.Net\assembly\GAC_32\System.Data\v4.0_4.0.0.0__b77a5c561934e089\System.Data.dll". Пропущенные символы загрузки. Модуль оптимизирован, и включена опция отладчика "только мой код".
'MiniAGApp.exe' (CLR v4.0.30319: MiniAGApp.exe): загружено 'C:\Windows\Microsoft.Net\assembly\GAC_MSIL\System.Xml\v4.0_4.0.0.0__b77a5c561934e089\System.Xml.dll'. Пропущенные символы загрузки. Модуль оптимизирован, и включена опция отладчика "только мой код".
'MiniAGApp.exe' (CLR v4.0.30319: MiniAGApp.exe): загружено 'C:\Windows\Microsoft.Net\assembly\GAC_MSIL\System.Data.DataSetExtensions\v4.0_4.0.0.0__b77a5c561934e089\System.Data.DataSetExtensions.dll'. Пропущенные символы загрузки. Модуль оптимизирован, и включена опция отладчика "только мой код".
'MiniAGApp.exe' (CLR v4.0.30319: MiniAGApp.exe): заряжен 'C:\Windows\Microsoft.Net\assembly\GAC_MSIL\System-да.Цифры\v4.0_4.0.0.0__b77a5c561934e089\система.Numerics.dll". Пропущенные символы загрузки. Модуль оптимизирован, и включена опция отладчика "только мой код".
'MiniAGApp.exe' (CLR v4.0.30319: MiniAGApp.exe): заряжен 'C:\Windows\Microsoft.Net\assembly\GAC_MSIL\System-да.Конфигурация\v4.0_4.0.0.0__b03f5f7f11d50a3a\система.Configuration.dll". Пропущенные символы загрузки. Модуль оптимизирован, и включена опция отладчика "только мой код".
'MiniAGApp.exe' (CLR v4.0.30319: MiniAGApp.exe): заряжен 'C:\Windows\Microsoft.Net\assembly\GAC_32\System.Транзакции\v4.0_4.0.0.0__b77a5c561934e089\система.Transactions.dll". Пропущенные символы загрузки. Модуль оптимизирован, и включена опция отладчика "только мой код".
'MiniAGApp.exe' (CLR v4.0.30319: MiniAGApp.exe): заряжен 'C:\Windows\Microsoft.Net\assembly\GAC_32\System.EnterpriseServices\v4.0_4.0.0.0__b03f5f7f11d50a3a\система.EnterpriseServices.dll". Пропущенные символы загрузки. Модуль оптимизирован, и включена опция отладчика "только мой код".
'MiniAGApp.exe' (среда CLR версии 4.0.30319: мин

Richard MacCutchan

Это не отладочная информация. Вам нужно установить точку останова в своем коде и пошагово просмотреть, какие данные обрабатываются на каждом шаге и каков результат каждого из системных вызовов.

MKP75

Я поставил точку останова на 4 строках, то есть querrystr, cmd = New OleDbCommand(querryStr, conn), conn.Откройте() и cmd.Метод executenonquery()

Ниже приведено то, что я получаю

Необработанное Исключение: Система.AccessViolationException: попытка чтения или записи защищенной памяти. Это часто указывает на то, что другая память повреждена.
в System.Data.Общий.Небезопасные методы.Icommandtext для.Выполнить(указателя IntPtr pUnkOuter, идентификатор GUID&амп; riid, tagDBPARAMS pDBParams, указателя IntPtr&амп; pcRowsAffected, объект&амп; ppRowset)
в System.Data.Oledb для.Объект oledbcommand.ExecuteCommandTextForSingleResult(tagDBPARAMS dbParams, Object& executeResult)
в System.Data.Oledb для.Объект oledbcommand.ExecuteCommandText(Object& executeResult)
в System.Data.Oledb для.Объект oledbcommand.Метод executecommand(поведение метода commandbehavior, объект&амп; executeResult)
в System.Data.Oledb для.Объект oledbcommand.ExecuteReaderInternal(поведение CommandBehavior, строковый метод)
в System.Data.Oledb для.Объект oledbcommand.Метод executenonquery()
в MiniAGApp.ImportData1.btnImport_Click(отправитель объекта, EventArgs e) в C:\Users\Mihir\Documents\Visual Studio 2017\Projects\MiniAGApp\MiniAGApp\Form14.vb:строка 92
в системе.Окна.Формы.Контроль.OnClick(EventArgs e)
в системе.Окна.Формы.Кнопка.OnClick(EventArgs e)
в системе.Окна.Формы.Кнопка.OnMouseUp(MouseEventArgs mevent)
в системе.Окна.Формы.Контроль.WmMouseUp(Message& m, кнопка MouseButtons, Int32 клика)
в системе.Окна.Формы.Контроль.WndProc(сообщение& m)
в системе.Окна.Формы.ButtonBase.WndProc(сообщение& m)
в системе.Окна.Формы.Кнопка.WndProc(сообщение& m)
в системе.Окна.Формы.Контроль.ControlNativeWindow.OnMessage(сообщение& m)
в системе.Окна.Формы.Контроль.ControlNativeWindow.WndProc(сообщение& m)
в системе.Окна.Формы.Родное окно.DebuggableCallback(hwnd элемента указателя IntPtr, int32 и глутамат натрия, указателя IntPtr параметр wparam, указателя IntPtr lparam должен)
в системе.Окна.Формы.Небезопасные методы.DispatchMessageW(MSG& msg)
в системе.Окна.Формы.Приложение.ComponentManager.Система.Окна.Формы.Небезопасные методы.IMsoComponentManager.FPushMessageLoop(IntPtr dwComponentID, Int32 reason, Int32 pvLoopData)
в системе.Окна.Формы.Приложение.ThreadContext.RunMessageLoopInner(Int32 причина, контекст ApplicationContext)
в системе.Окна.Формы.Приложение.ThreadContext.RunMessageLoop(Int32 причина, контекст ApplicationContext)
в корпорации Microsoft.На языке VisualBasic.ApplicationServices.WindowsFormsApplicationBase.Онран()
в корпорации Microsoft.На языке VisualBasic.ApplicationServices.WindowsFormsApplicationBase.DoApplicationModel()
в корпорации Microsoft.На языке VisualBasic.ApplicationServices.WindowsFormsApplicationBase.Run(строка[] командная строка)
в MiniAGApp.My.MyApplication.Main(String[] Args) in :строка 81
Программа '[6108] MiniAGApp.exe' вышел с кодом 0 (0x0).

Richard MacCutchan

Очевидно, что проблема возникает до того, как она достигнет точки останова, поэтому вам нужно остановить ее раньше.

MKP75

привет. Я попытался отладить каждую строку кода этой конкретной формы. Нет никаких ошибок или исключений, за исключением

Система Visual studio 2017.AccessViolationException 'попытка чтения или записи защищенной памяти. Это часто указывает на то, что другая память повреждена.'

на cmd.Оператор ExecuteNonQuery ().

Я этого не понимаю.

Я даже пытался вставить данные из DataGridview1 один за другим, но та же ошибка
происходит на cmd.Строка ExecuteNonQuery.

Есть ли другой способ сделать это? Пожалуйста, совет. Я застрял.

Richard MacCutchan

Извините, но без вашего кода и всех данных это невозможно. И, как я уже не раз говорил, вам нужно посмотреть на переменные, которые используются кодом. Нарушения доступа вызываются попыткой чтения или записи с недопустимого адреса памяти, что обычно означает неверное значение параметра, передаваемое системному вызову. Но только вы можете определить, что это за ценность.

И, пожалуйста, постарайтесь перестать публиковать свои комментарии дважды. Если система работает медленно, она не работает лучше, перепечатывая.

MKP75

Хорошо. Большое спасибо.

MKP75

Привет.

Проблема решена. Как вы сказали, я продолжал смотреть глубже в программу и прибил ее.

Ниже приведена рабочая программа для вашей справки.


Система Импорта.ИО
Система Импорта.Сведения
Импортирует System.Data.Для oledb

Открытый Класс ImportData1

Дим Конн как новый объект oledbconnection(“поставщик=Майкрософт.Туз.Oledb для.12.0;Источник Данных=С:\Пользователи\\Mihir Документы\MiniAGAppDB.# то#; сохранять сведения о безопасности=true в”)
Dim cmd как OleDbCommand
Dim querryStr1 как строка
Dim querryStr2 как строка
Dim querryStr3 как строка

Частная суб ImportData1_Load(отправителя как объект, а равно EventArgs) обрабатывает ключевое слово mybase.Загрузить

TxtFilePath.Text = "поместите свой файл в D:\FileToImport папка. Имя файла должно быть MatRegFile.csv"

Конец Подводной Лодки

Private Sub BtnCancel_Click(sender As Object, e As EventArgs) обрабатывает btnCancel.Щелчок

Меня.Рядом()

Конец Подводной Лодки

Private Sub BtnShow_Click(sender As Object, e As EventArgs) обрабатывает btnShow.Щелчок

Попробуй

Коннектикут.Открыть()
Дим практическое руководство как объекта DataTable = соед.GetOleDbSchemaTable(OleDb.OleDbSchemaGuid.Таблицы, Новый Объект() {Ничего, ничего, "Temp1", "таблица"})
Коннектикут.Закрывать()

Ящик для сообщений.Показать(практическое руководство.Строк.Рассчитывать)

Если дбщема.строк.Тогда считайте > 0

querryStr1 = "Drop Table Temp1"
cmd = New OleDbCommand(querryStr1, conn)
Коннектикут.Открыть()
УМК.Метод executenonquery()
Коннектикут.Закрывать()

querryStr2 = "выбрать * в Temp1 из [текста;ДРМ=разграничена;базы данных=D:\в FileToImport;режим HDR=да].[MatRegFile.csv]"
cmd = New OleDbCommand(querryStr2, conn)
Коннектикут.Открыть()
УМК.Метод executenonquery()
Коннектикут.Закрывать()

Еще

querryStr2 = "выбрать * в Temp1 из [текста;ДРМ=разграничена;базы данных=D:\в FileToImport;режим HDR=да].[MatRegFile.csv]"
cmd = New OleDbCommand(querryStr2, conn)
Коннектикут.Открыть()
УМК.Метод executenonquery()
Коннектикут.Закрывать()

Конец, Если

'Показать Данные Из Temp1 В Таблице Данных
Дим objda как объект oledbdataadapter = новый объект oledbdataadapter
Дим кон как новый oledb для.Метод Oledbconnection(“Поставщик=Майкрософт.Туз.Oledb для.12.0;Источник Данных=С:\Пользователи\\Mihir Документы\MiniAGAppDB.# то#; сохранять сведения о безопасности=true в”)
Дим objdataset как набор данных = новый набор данных
Dim dv как DataView
против.Открыть()
обьда.SelectCommand = New OleDbCommand("Select * From Temp1", con)
objda.Fill(objdataset, "Temp1")
dv = New DataView(objdataset.Таблицы("Temp1"))
DataGridView1.Источник данных = ДВ
против.Закрывать()
против.Располагать()

Поймать ex как исключение

Ящик для сообщений.Показать(напр.сообщение)
Коннектикут.Закрывать()

Конец Попытки


Конец Подводной Лодки

Private Sub btnImport_Click(sender As Object, e As EventArgs) обрабатывает btnImport.Щелчок

Коннектикут.Открыть()
Дим практическое руководство как объекта DataTable = соед.GetOleDbSchemaTable(OleDb.OleDbSchemaGuid.Таблицы, Новый Объект() {Ничего, ничего, "Temp1", "таблица"})
Коннектикут.Закрывать()

Попробуй

Коннектикут.Открыть()
Для каждого rw как DataGridViewRow в DataGridView1.Rows
Если rw.Ячейки(1).Значение <> "" Тогда
cmd = New OleDbCommand("Insert Into MaterialRegister (Company_Code,Company_Name,Material_Code,Material_Name,Credit_Qty,Debit_Qty,Material_Count,Material_Flag,Material_Date,Material_Inv_No,Material_Party_Code,Material_Party_Name,Remark,Entry_Flag,Creation_Date,User_Name) values ('" & rw.Cells(1).Value & "','" & rw.Cells(2).Value & "','" & rw.Cells(3).Value & "','" & rw.Cells(4).Value & "','" & rw.Cells(5).Value & "','" & rw.Cells(6).Value & "','" & rw.Cells(7).Value & "','" & rw.Cells(8).Value & "','" & rw.Cells(9).Value & "','" & rw.Cells(10).Value &am