Необработанное исключение типа ‘System.AccessViolationException’ произошло в System.Data.dll

#.net #vb.net #visual-studio-2012 #datagridview #odbc

#.net #vb.net #visual-studio-2012 #datagridview #odbc

Вопрос:

** Я ПОЛУЧИЛ ЭТУ ОШИБКУ в Da.Fill (Ds, «tbl_user»): необработанное исключение типа ‘System.AccessViolationException’ произошло в System.Data.dll

Дополнительная информация: попытка чтения или записи защищенной памяти. Это часто указывает на то, что другая память повреждена. **

 Public Conn As OdbcConnection
    Public Da As OdbcDataAdapter
    Public Ds As DataSet
    Public Dr As OdbcDataReader
    Public CMD As OdbcCommand

    Public MyDB As String


    Public Sub Connection()
        MyDB = "Driver={Mysql ODBC 5.1 driver};database=uas;server=localhost;uid=root"
        Conn = New OdbcConnection(MyDB)
        'jika koneksinya tertutup maka akan di open
        If Conn.State = ConnectionState.Closed Then Conn.Open()
    End Sub
  
  Private Sub FormMasterAdmin_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        Call closeField()
        Call Connection()
        Da = New OdbcDataAdapter("Select username,fullname,level From tbl_user", Conn)
        Ds = New DataSet
        Da.Fill(Ds, "tbl_user")
        DataGridView1.DataSource = Ds.Tables("tbl_user")
        DataGridView1.ReadOnly = True
    End Sub
  

Комментарии:

1. Есть ли конкретная причина, по которой вы используете ODBC вместо выделенного MySQL ADO.NET провайдер?

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

Ответ №1:

В верхней части вашего файла кода добавьте…

 Imports MySql.Data.MySqlClient
  

Call Ключевое слово используется только в особых случаях. Обычно в этом нет необходимости.

Сохраняйте объекты вашей базы данных локальными для метода, в котором они используются. Объекты базы данных необходимо закрыть и удалить. Using...End Using блоки позаботятся об этом за вас. В этом коде и соединение, и команда включены в Using блок. Обратите внимание на запятую в конце первой строки Using .

 Private MyDB As String = "Driver={Mysql ODBC 5.1 driver};database=uas;server=localhost;uid=root"

Private Sub FormMasterAdmin_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    Dim dt As New DataTable
    Using Conn As New MySqlConnection(MyDB),
            cmd As New MySqlCommand("Select username, fullname, level From tbl_user", Conn)
        Conn.Open()
        dt.Load(cmd.ExecuteReader)
    End Using
    DataGridView1.DataSource = dt
    DataGridView1.ReadOnly = True
End Sub
  

Вам нужно будет исправить строку подключения в формат, требуемый поставщиком MySQL. См . https://www.connectionstrings.com/mysql-connector-net-mysqlconnection /