ziadb86 Ответов: 9

Диалоговое Окно Openfiledialog + Метод Oledbconnection = Как AccessViolationException


Я работаю над приложением windows WPF.

Дело в том, что у меня есть AccessViolationException при работе с OpenFileDialog и OleDbConnection объекты.

Сценарий: после запуска приложения я нажимаю на кнопку, которая отображает OpenFileDialog форма для поиска файла. После этого я использую Ан OleDbConnection для того чтобы ссылаться на файл MS Access .accdb.

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

После отладки кода я обнаружил, что при попытке открыть соединение OleDbConnection объект [ex: dbConnecntion.Open()] исключение возникает, но если его опустить, оно исчезает, даже если я закрываю соединение и избавляюсь от ресурсов.

Исключение: AccessViolationException >> попытка чтения или записи защищенной памяти. Это часто указывает на то, что другая память повреждена.

9 Ответов

Рейтинг:
74

CodeGuy

Я просто провел прошлую неделю, пытаясь избавиться от этой же проблемы. Наконец найти эта должность что указывает на то, что это ошибка в драйверах Microsoft Access Database Engine 2010. Если вы используете Вместо водителей 2007 , проблема уходит сама собой.


Nish Nishant

Предлагается в качестве ответа.

aydinsahin

спасибо,
я попробовал решение и установил его AccessDatabaseEngine.exe за 2007 г. Проблема устранена

Рейтинг:
59

naavid2000

ключ этого questiuon - "Provider=Microsoft.ACE.OLEDB.12.0; Data Source=C:\DbTest\Test.accdb; OLE DB Services=-1" проверьте это, если это было правдой, отправьте мне письмо naavid2000@yahoo.com

(Службы OLE DB=-1)


ronit12123

Это работает! Огромное спасибо!!!

JayantaChatterjee

Это работает на меня....
Наконец-то я избавляюсь от этой ошибки..
Большое спасибо....

tony4250

Пахать,
Спасибо!!!

Member 10765423

Работа

Cresmx

Это тоже сработало для меня. Спасибо.

Member 3383194

Спасибо чувак, ты спас мой день...это было круто...работал как шарм

Member 2833242

Огромное спасибо, ты спас мне жизнь.

mldisibio

2018 с Microsoft.ACE.OLEDB.16.0 как 32, так и 64 битной системой.AccessViolationException все еще была проблемой в Windows Server 2012 (64bit), и добавление этого параметра в строку подключения действительно исправило ее. Спасибо!

kdontje69

Я буквально провел целый день с этой точно такой же проблемой. Установка OLE DB Services=-1 полностью исправила мою проблему. Это доступ к двигателю 2010 DB, который вызывает эта проблема.

Member 13883851

Большое спасибо!.... очень очень Спасибо

Member 14716688

Большое спасибо!!!!

Рейтинг:
2

jportos

У меня есть похожая проблема. Мне удалось его воспроизвести. Я создаю новую форму windows, добавляю новый источник данных (файл базы данных access, только с одной таблицей). Затем перетащите таблицу в форму. Затем добавьте новую кнопку и следующий код.

private void Test()
{
	this.table1TableAdapter.GetData();
}

private void SaveDialogTest()
{

	SaveFileDialog saveFileDialog1 = new SaveFileDialog();
        saveFileDialog1.Filter = "Text File|*.txt";
        saveFileDialog1.InitialDirectory = Application.StartupPath;
        saveFileDialog1.Title = "test";
        saveFileDialog1.ShowDialog();:mad:

        if (saveFileDialog1.FileName != "")
                 { }
}

private void button1_Click(object sender, EventArgs e)
{
        Test();
	SaveDialogTest();           
}


Адаптер таблицы создается дизайнером:

private void Form1_Load(object sender, EventArgs e)
{
            // TODO: This line of code loads data into the 'testDataSet.Table1' table. You can move, or remove it, as needed.
            this.table1TableAdapter.Fill(this.testDataSet.Table1);

}


Когда я запускаю форму и нажимаю на кнопку, я получаю AccessViolationException, при вызове saveFileDialog1.ShowDialog().
Если я пошевелюсь то "Test()"метод внутри "Form1_Load"метод все работает нормально.

Кроме того, если я сначала запускаю диалог, то перед вызовом GetData() все работает нормально. Подобный этому.

SaveDialogTest();
Test();
SaveDialogTest();

Это вызовет второе SaveDialogTest() без исключения.
Кроме того, если я скомпилирую его и запущу в XP pc, все будет работать нормально.

Источник данных: файл базы данных Microsoft Access (OLE DB)
Я использую Visual Studio 2008 SP1. Windows 7


Рейтинг:
2

Cimperiali

On windows 7 (32 bit) had same problem when showing the openfiledialog from a modal form loaded for the second time with data from db in it. Solution appeared to be: do not allow autoupgrade of dialog.
Dim sfv As New System.Windows.Forms.SaveFileDialog
   With sfv
     .AutoUpgradeEnabled = False
     [...]


But error came up again. Then I noticed it was apparently randomic till I realized it did not come out ifd I was able to show a saveFileDialog or an OpenfileDialog before loading any data from db.

Thus true workaround is: before load anything on the form you're going to show, display a dialog asking user to choose a path and file you *might* need after (arrrg!). After that, load data. Now your can let users, if needed, to choose path and file with dialog again...

ie:
  Private Sub frmReport_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
     txtFilePathName.Text = "Export_" & Now.ToString("yyyy_MM_dd_HH_mm_ss", CultureInfo.GetCultureInfo("it-It")) & ".csv"
     txtFilePathName.Text = GetSaveFileName(txtFilePathName.Text, ".csv", "Choose a csv File to save exported data", "csv |*.csv|All |*.*")
     'now load data in forms, where you can also have a button to call again the GetSaveFileName
[...]

Private Function GetSaveFileName(ByVal fileName As String,
                                    ByVal defaultExtension As String,
                                   ByVal title As String,
                                   ByVal filter As String) As String
        Dim sfv As New System.Windows.Forms.SaveFileDialog
        With sfv
            .RestoreDirectory = True
            .AddExtension = True
            .DefaultExt = defaultExtension
            .FileName = fileName
            .Title = title
            .Filter = filter
            .CheckPathExists = True
            .OverwritePrompt = True
            .ShowHelp = False

            If (.ShowDialog = DialogResult.OK) Then
                fileName = .FileName
            End If
        End With
        Return fileName
    End Function
Cimperiali


vijayr

@Cimperiali: я также сталкиваюсь с той же проблемой с AccessViolationException, и Ваше предложение прекрасно, и оно работает хорошо.
Вот мой вопрос, почему он выбрасывает ошибку в OpenFileDialog ? потому что нет никакой связи между базой данных и OpenFileDialog.
А еще я нашел еще одно решение(но оно не очень хорошее)
Вот этот код

открытый класс OpenDialogBox
{
public string _filter { get; set; }
публичная строка _selectedFile { get; set; }
государственная система.Окна.Формы.DialogResult _dialog { get; set; }

общественного недействительными OpenDig()
{
пробовать
{
Система.Нарезание резьбы.Поток th = новая система.Нарезание резьбы.Поток(новая система.Нарезание резьбы.ThreadStart(Папка));
th.IsBackground = true;
й.Начать();
Система.Нарезание резьбы.Нить.Спать(1000);
если (th.Isalive в)
{
й.Прервать();
}
}
улов (система.Нарезание резьбы.ThreadAbortException ex)
{

}
//Папка();
Система.Окна.Формы.OpenFileDialog of = новая система.Окна.Формы.Диалоговое окно openfiledialog();
ОТ.Фильтр = _filter;
ОТ.AutoUpgradeEnabled = false;
ОТ.InitialDirectory = "C:\\";
_dialog = из.Метод showdialog();
_selectedFile = OF.FileName;
//Система.Окна.Форм.Функции MessageBox.Показать(_selectedFile);
//Система.Окна.Форм.Функции MessageBox.Шоу(оф.имя файла.Метод toString());
}

пустая папка()
{
пробовать
{
Система.Окна.Формы.FolderBrowserDialog fd = новая система.Окна.Формы.FolderBrowserDialog();
ФД.Метод showdialog();
}
поймать (исключение бывший)
{

}

}
}

Рейтинг:
2

vijayr

Привет,

Создайте библиотеку dll для приведенного ниже кода и вызовите ее, нажав кнопку Обзор


public class OpenDialogBox { public string _filter { get; set; } public string _selectedFile { get; set; } public System.Windows.Forms.DialogResult _dialog { get; set; } public void OpenDig() { try { System.Threading.Thread th = new System.Threading.Thread(new System.Threading.ThreadStart(Folder)); th.IsBackground = true; th.Start(); System.Threading.Thread.Sleep(1000); if (th.IsAlive) { th.Abort(); } } catch (System.Threading.ThreadAbortException ex) { } //Folder(); System.Windows.Forms.OpenFileDialog OF = new System.Windows.Forms.OpenFileDialog(); OF.Filter = _filter; OF.AutoUpgradeEnabled = false; OF.InitialDirectory = "C:\\"; _dialog = OF.ShowDialog(); _selectedFile = OF.FileName; //System.Windows.Forms.MessageBox.Show(_selectedFile); //System.Windows.Forms.MessageBox.Show(OF.FileName.ToString()); } void Folder() { try { System.Windows.Forms.FolderBrowserDialog fd = new System.Windows.Forms.FolderBrowserDialog(); fd.ShowDialog(); } catch (Exception ex) { } } }


Спасибо
Виджай Р


Рейтинг:
1

sds1920

Привет.
Удалите предыдущую версию Microsoft Access Database Engine 2010 и загрузите новое обновление по этой ссылке http://www.microsoft.com/en-us/download/details.aspx?id=13255[^]

Это хорошо сработало для меня.


Рейтинг:
0

maultby

Взгляните на это:

https://connect.microsoft.com/VisualStudio/feedback/details/624503/oledb-operations-cause-accessviolationexception-during-savefiledialog?ва=wsignin1.0

И, пожалуйста, проголосуйте за исправление - с помощью кнопки "я могу воспроизвести эту ошибку" и зеленой галочки


Nish Nishant

Предлагается в качестве альтернативного ответа.

Рейтинг:
0

danilmanuel

После операции чтения или записи необходимо всегда закрывать файл.


ziadb86

Я закрываю соединение и распоряжаюсь его ресурсами. Исключение создается только тогда, когда я открываю соединение. Если я опущу oledbConnection.Open() исключение не будет вызвано.

Рейтинг:
0

hanzzoid

У меня была та же проблема; переустановка движок доступа к БД 2010 проблема решена.

Забавно, но я даже не смог уловить исключение, окно просто погасло.