none
Странная ошибка (system.data.oledb.oledbexception не удается найти файл), не могу понять... RRS feed

  • Общие обсуждения

  • Приветствую. Пишу программу которая работает с базой данных Access, в базе хранятся данные и небольшие картинки(фото). В общем все работает нормально, в базу сохраняю данные и добавляю без проблем, но есть оно но... программа была протестирована на разных компьютерах и операционных системах, везде все работает отлично кроме одного компьютера и какая то странная ошибка, которая возникает если в базу добавляю картинку: system.data.oledb.oledbexception  не удается найти файл( далее путь к картинке, только заместо картинки в конце имя базы bd.mdb. Операционная система на том компьютере где ошибка Windows XP SP2, хотя на виртуалке с такой же системой все работает нормально. Приложение на NET 4.0, на всех системах установлен Клиентский профиль Microsoft .NET Framework 4. Ошибка происходит только когда пытаюсь сохранить картинку вот таким методом:

    BitmapSource imgSource = ImageFoto.Source as BitmapSource;
    byte[] dataFoto;
    JpegBitmapEncoder encoder = new JpegBitmapEncoder();
    encoder.Frames.Add(BitmapFrame.Create(imgSource));
    using (MemoryStream ms = new MemoryStream())
    {
    encoder.Save(ms);
    dataFoto = ms.ToArray();
    }
    BDCommand.Parameters.AddWithValue("@Фото", dataFoto);

    В остальных случаях все остальные манипуляции с базой работают без проблем.

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




    • Изменено vik12 2 июня 2013 г. 22:03
    • Изменен тип Crystal Wan 19 июня 2013 г. 2:20
    2 июня 2013 г. 21:58

Все ответы

  • My two suggestions:

    1. Use English for parameter name

    2. Don't use AddWithValue, use Add method and specify type and size (if needed) explicitly.


    For every expert, there is an equal and opposite expert. - Becker's Law


    My blog

  • Оба варианта пробовались, та же ошибка. Повторю, что данная ошибка только на одном компьютере, на всех остальных все нормально.

    Both options were tried, the same mistake. I will repeat that this mistake only on one computer, on all the others everything is normal.

    3 июня 2013 г. 14:52
  • Yes, I was not expecting them to fix the problem, this was more of a suggestion for best practices.

    For every expert, there is an equal and opposite expert. - Becker's Law


    My blog

    3 июня 2013 г. 14:59
  • All the same thanks for participation.
    3 июня 2013 г. 15:51
  • Уточните, пожалуйста, на какой строчке выбрасывается исключение? И если можно, то выложите полный StackTrace исключения.

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


  • Вот тут похожая проблема. Попробую тоже использовать Оператор lock, после тестов отпишусь.
    4 июня 2013 г. 13:24

  • Вот тут похожая проблема. Попробую тоже использовать Оператор lock, после тестов отпишусь.

    В общем все равно ошибка: system.data.oledb.oledbexception  не удается найти файл( далее путь к картинке, только заместо картинки в конце имя базы bd.mdb

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

    BitmapSource imgSource = ImageFoto.Source as BitmapSource;
    byte[] dataFoto;
    JpegBitmapEncoder encoder = new JpegBitmapEncoder();
    encoder.Frames.Add(BitmapFrame.Create(imgSource));
    using (MemoryStream ms = new MemoryStream())
    {
    encoder.Save(ms);
    dataFoto = ms.ToArray();
    }
    BDCommand.Parameters.AddWithValue("@Фото", dataFoto);
    Повторюсь, что ошибка эта только на одном компьютере, на других (проверял наверное на 10-ти) все нормально.

    • Изменено vik12 7 июня 2013 г. 20:13
    7 июня 2013 г. 20:08
  • Могу предположить, что проблема может быть в строке соединения к базе данных. Можете привести код, с помощью которого вы подключаетесь к базе данных? Также приведите, пожалуйста, полный StackTrace исключения.
  • Олег, спасибо за участие. Вот пример сохранения изображения в базе:

    string BDString = @"Provider=Microsoft.Jet.OLEDB.4.0; Data Source=Default.mdb";
    OleDbConnection BDConnection = new OleDbConnection();
    BDConnection.ConnectionString = BDString;  
    OleDbCommand BDCommand = BDConnection.CreateCommand();
    BDCommand.CommandText = "UPDATE tUser SET Фото=@Фото" +
    			"WHERE UserID=10";
    BDConnection.Open();
    if (Convert.ToString(ImageFoto.Source) != "pack://application:,,,/image/no_photo.jpg")        
    	{
    		BitmapSource imgSource = ImageFoto.Source as BitmapSource;
                    byte[] dataFoto;
                    JpegBitmapEncoder encoder = new JpegBitmapEncoder();
                    encoder.Frames.Add(BitmapFrame.Create(imgSource));
                    using (MemoryStream ms = new MemoryStream())
                    {
                        encoder.Save(ms);
                        dataFoto = ms.ToArray();
                    }
                        BDCommand.Parameters.AddWithValue("@Фото", dataFoto);
                    }
                    else
                    {
                        BDCommand.Parameters.AddWithValue("@Фото", DBNull.Value);
                    }               
            BDCommand.ExecuteNonQuery();
            BDConnection.Close();

    Изображение в ImageFoto добавляю так:

    OpenFileDialog OFD = new OpenFileDialog();
    OFD.Filter = "Изображения|*.jpg;*.png;*.bmp|JPG (*.jpg)|*.jpg|PNG (*.png)|*.png|BMP (*.bmp)|*.bmp";
    OFD.ShowDialog();
    if (OFD.FileName != "")
        {
            BitmapImage bi = new BitmapImage();
            bi.BeginInit();
            bi.UriSource = new Uri(OFD.FileName, UriKind.RelativeOrAbsolute);
            bi.EndInit();
            ImageFoto.Source = bi;        
        }

    То есть, я сначала изображение помещаю в Image с именем ImageFoto, затем от туда перевожу в байты и сохраняю в базу в поле объекта OLE.

    Ошибка:

    Причем строка: system.data.oledb.oledbexception  не удается найти файл - указывает на путь к изображению которое я добавляю в ImageFoto через OpenFileDialog, только за место имени изображения в конце имя базы Default.mdb.

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


    • Изменено vik12 8 июня 2013 г. 16:39
    8 июня 2013 г. 15:15
  • Скорее всего проблемы именно в доступе. У вас случаем не Silverlight-приложение? Если так, то попробуйте положить БД в папку App_Data, а строку соединения написать так:

    string BDString = @"Provider=Microsoft.Jet.OLEDB.4.0; Data Source=|DataDirectory|\Default.mdb";

    Если же у вас Desktop-приложение, то в качестве эксперимента можно попробовать положить БД в папку, к которой точно имеется полный доступ(к примеру, в корень другого логического диска, в папку пользователя, ...), и в строке соединения прописать полный путь к БД. К примеру, БД положить в папку 'Мои документы', а строку соединения написать так:

    string BDString = @"Provider=Microsoft.Jet.OLEDB.4.0; Data Source=C:\Documents and Settings\Папа\Мои документы\Default.mdb";
    8 июня 2013 г. 18:39
  • Приложение на WPF, первый вариант попробую как доберусь до того компьютера на котором наблюдается проблема, второй вариант пробовал уже, та же ошибка.

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

    Интересно почему эта ошибка только на одном компьютере, а на других все нормально.


    • Изменено vik12 8 июня 2013 г. 21:59
    8 июня 2013 г. 21:54
  • Have you tried to re-install OleDB on that computer?

    For every expert, there is an equal and opposite expert. - Becker's Law


    My blog


    My TechNet articles

  • Уважаемый пользователь!

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

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


    Если вам помог чей-либо ответ, пожалуйста, не забывайте жать на кнопку "Предложить как ответ" или "Проголосовать за полезное сообщение"

    17 июня 2013 г. 13:17
    Модератор