Форум программистов, компьютерный форум, киберфорум
C#: Базы данных, ADO.NET
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/6: Рейтинг темы: голосов - 6, средняя оценка - 4.67
7 / 7 / 8
Регистрация: 11.04.2012
Сообщений: 87
1

Ошибка открытия нескольких файлов из БД

04.12.2012, 12:16. Показов 1235. Ответов 8
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
И так. В БД есть файлы. Их можно открыть, изменить и файл перезаписывается в БД.
Все работает, но когда открываешь 2 файла, то выскакивает ошибка.
C#
1
2
3
4
5
6
7
8
9
private void gvFiles_MouseDoubleClick(Object sender, MouseEventArgs e)
        {
            if (e.Button == MouseButtons.Left)
            {
                Thread _thread = new Thread(delegate() { Opening(); });
                _thread.IsBackground = true;
                _thread.Start();
            }
        }
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
public void Opening()
        {
            string ID = this.gvFiles.SelectedRows[0].Cells["ID"].Value.ToString(); //id выбранного файла в dgv
            string way = ""; //строка пути до файла
            if (ActiveDirectory.UserCheck(iFunctions.GetWriteRigthGroup())) //если пользователь принадлежит группе
            {
                if (iFunctions.Semaphor(ID)) //если файл не используется другим пользователем
                {
                    using (var conn = new MySql.Data.MySqlClient.MySqlConnection(Properties.Settings.Default.ConnectionString))
                    {
                        conn.Open();
                        using (var cmd = new MySql.Data.MySqlClient.MySqlCommand(String.Format("SELECT Files.Info, Filestorage.Text FROM Files, Filestorage WHERE Files.ID = '{0}' AND Files.ID = Filestorage.FID;", ID), conn))
                        {
                            using (var dr = cmd.ExecuteReader())
                            {
                                while (dr.Read())
                                {
                                    if (dr.IsDBNull(1)) //если файла не существует
                                    {
                                        RadMessageBox.Show("Файл не найден", "Ошибка", MessageBoxButtons.OK, RadMessageIcon.Info);
                                        return;
                                    }
 
                                    try
                                    {
                                        //записать 1 в бд с файлом (используется)
                                        iFunctions.Insert(String.Format("UPDATE Files SET Used='{0}' WHERE ID ='{1}'", 1, ID));
                                        
                                        //в массив байтов GetData записываем содержимое файла
                                        byte[] GetData = Convert.FromBase64String(dr.GetString(1));
                                        
                                        Random rand = new Random();
                                        //строка пути до файла "C:\Temp\" + рандомное значение + название + расширение
                                        way = @"C:\Temp\" + rand.Next(0, 20).ToString() + dr.GetString(0).Substring(0, 10) + dr.GetString(0).Substring(11, 4);
                                        
                                        //записываем массив байтов в файл
                                        File.WriteAllBytes(way, GetData);
                                        //стартуем процесс
                                        Process myProc = Process.Start(way);
                                        
                                        //ждем, пока файл не будет закрыт
                                        do
                                        {
                                            if (!myProc.HasExited)
                                            {
                                                myProc.Refresh();
                                            }
                                        } while (!myProc.WaitForExit(1000));
                                        
                                        //в массив байтов bytes записываем содержимое файла
                                        byte[] bytes = File.ReadAllBytes(way);
                                        string data = Convert.ToBase64String(bytes);
                                        
                                        //перезаписываем содержимое файла в бд
                                        iFunctions.Insert(String.Format("UPDATE Filestorage SET Text='{0}' WHERE FID='{1}'", data, ID));
                                        //записать 0 в бд с файлом (не используется)
                                        iFunctions.Insert(String.Format("UPDATE Files SET Used='{0}' WHERE ID ='{1}'", 0, ID));
                                        //удаляем файл
                                        File.Delete(way);
                                    }
                                    catch (Exception ex)
                                    {
                                        RadMessageBox.Show(ex.Message, "Ошибка", MessageBoxButtons.OK, RadMessageIcon.Error);
                                        throw;
                                    }
                                }
                            }
                        }
                    }
                }
                else
                    RadMessageBox.Show("Файл редактируется другим пользователем", "Уведомление", MessageBoxButtons.OK, RadMessageIcon.Info);
            }
        }
Ошибка вылетает в строке if (!myProc.HasExited) - Ссылка на объект не указывает на экземпляр объекта.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
04.12.2012, 12:16
Ответы с готовыми решениями:

StreamREader для открытия нескольких файлов
Использую openFiledialog.FileNames для открытия нескольких файлов. считываю данные в string ...

Затратность открытия нескольких файлов
У меня есть набор файлов, которые надо объединять в один. Каждый файл делится на блоки, и, при...

Ошибка открытия .jpg файлов
Имеется установленная библиотека Qt 4.8.6 для vs2010, установленный qt-vs-addin-1.1.11, работа и...

Ошибка при попытке открытия файлов
Программа содержит две дочерние формы: для открытия картинок и для работы с текстовыми файлами. При...

8
608 / 583 / 157
Регистрация: 29.06.2010
Сообщений: 1,620
04.12.2012, 12:40 2
а до этого программа в цикл заходила, или вылетает при первой же попытке войти в цикл, при открытии второго файла?
0
7 / 7 / 8
Регистрация: 11.04.2012
Сообщений: 87
04.12.2012, 13:07  [ТС] 3
Получается так. Открываем первый файл (он создается), а затем открываем второй файл (он тоже создается) и сразу же ругается на второй файл "Ссылка на объект не указывает на экземпляр объекта".
Ничего не перезаписывается и файлы не удаляются после закрытия.
0
608 / 583 / 157
Регистрация: 29.06.2010
Сообщений: 1,620
04.12.2012, 13:58 4
я не совсем про это. сколько раз, при открытии второго файла, происходят действия
C#
1
2
3
4
5
6
{
         if (!myProc.HasExited)
         {
                  myProc.Refresh();
         }
}
при первой попытке вылетает? или проверяет раз 30, и ошибка уже потом? или счетчик туда всунь, или брекпоинт.
просто если первое - то необходимо думать над объявлением переменной процесса, если второе - над циклом её обработки.
1
Эксперт .NET
17689 / 12874 / 3366
Регистрация: 17.09.2011
Сообщений: 21,138
05.12.2012, 11:02 5
Цитата Сообщение от ToN.FiER Посмотреть сообщение
Ошибка вылетает в строке if (!myProc.HasExited) - Ссылка на объект не указывает на экземпляр объекта.
Process.Start вовзращает null, если процесс не удалось запустить или он уже запущен.
0
7 / 7 / 8
Регистрация: 11.04.2012
Сообщений: 87
05.12.2012, 11:09  [ТС] 6
kolorotur, Второй файл открывается и вылетает ошибка.
И еще:
Например, если уже открыт файл word. Запускаешь программу, открываешь первый файл, ошибка:
"Процесс не может получить доступ к файлу "C:\Temp\1СОТРУДНИКИ.doc", так как этот файл используется другим процессом."
0
Заблокирован
05.12.2012, 18:37 7
Исключении летит от того, что файлы word умеют(по умолчанию) открываться в одном процессе. А у Вас во втором случае уже процесс ворда застарчен и ссылка на process у вас не валидная.

Добавлено через 4 минуты
Да и с синхронизацией потоков у Вас проблема
iFunctions.Semaphor(ID) вот эта проверка может и не отработать как Вы ожидаете.

Добавлено через 4 минуты
проблему можно решить с помощью передачи параметров в командной строке. подробнее : http://office.microsoft.com/ru... 64010.aspx

Добавлено через 1 час 40 минут
вот примерчик.
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
    class Program
    {
        static class FileManager
        {
            public static bool TryStart(string path)
            {
                const string processName = @"c:\Program Files\Microsoft Office\Office14\WINWORD.EXE"; //заменить на свой путь к процессу WINWORD.EXE
                try
                {
                    if (!File.Exists(path)) return false;
                    var p = new Process();
                    var pInfo = new ProcessStartInfo(processName, string.Format("/t \"{0}\"", path));
                    p.StartInfo = pInfo;
                    var started = p.Start();
                    if (!started) return false;
                    p.WaitForExit();
                    return true;
                }
                catch (Exception ex)
                {
                    Console.WriteLine(ex.Message);
                    return false;
                }
            }
        }
 
        static void Main()
        {
            const string path2 = @"d:\Doc2.docx";
            const string path = @"d:\Doc1.docx";
            new Thread( () => FileManager.TryStart(path)){IsBackground = true}.Start();
            new Thread(() => FileManager.TryStart(path2)) { IsBackground = true }.Start();
            Console.ReadKey();  
        }  
    }
Добавлено через 1 минуту
т.е. идея в том, чтобы застартить отдельно процесс, и открыть в этом процессе файл.
1
7 / 7 / 8
Регистрация: 11.04.2012
Сообщений: 87
05.12.2012, 18:57  [ТС] 8
adm_loro,
C#
1
2
3
4
const string path2 = @"d:\Doc2.docx";
            const string path = @"d:\Doc1.docx";
            new Thread( () => FileManager.TryStart(path)){IsBackground = true}.Start();
            new Thread(() => FileManager.TryStart(path2)) { IsBackground = true }.Start();
Хм, а если мне надо будет больше, чем 2 ворда открывать?
0
Заблокирован
05.12.2012, 19:24 9
да блин.. на это не надо стмотреть

Добавлено через 42 секунды
вот то, что Вам нужно, а уж дальше сами решайте что и как открывать
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
 class Program
    {
        static class FileManager
        {
            public static bool TryStart(string path)
            {
                const string processName = @"c:\Program Files\Microsoft Office\Office14\WINWORD.EXE"; //заменить на свой путь к процессу WINWORD.EXE
                try
                {
                    if (!File.Exists(path)) return false;
                    var p = new Process();
                    var pInfo = new ProcessStartInfo(processName, string.Format("/t \"{0}\"", path));
                    p.StartInfo = pInfo;
                    var started = p.Start();
                    if (!started) return false;
                    p.WaitForExit();
                    return true;
                }
                catch (Exception ex)
                {
                    Console.WriteLine(ex.Message);
                    return false;
                }
            }
        }
Добавлено через 16 минут
разбейте ваш огромный метод на отдельный подзадачи, все равно он будет время от времени падать.. т.к. синхронизации ни какой.
Алгоритм:
1. Получить ID выбранного файла из gv - монопольно(используем lock)
2. Взять блокировку на файл, я бы вообще не в базу писал (0, 1), а создавал именованный мьютекс имя файла + id, если такой мьютекс есть, значит файл юзается, нет - создаем. - это все тоже должно делаться в критической секции.
3. Читаем базу и получаем инфу по файлу - закрываем подключение, на фига нам его держать? т.е. это явно напрашивается в отдельный метод хотябы. Блокировки тут не нужны.
4. Стартим процесс - ждем его(это мега плохо, но я уже не буду рассказывать как этого избежать) .
5. Дождались - вошли монопольно - удалили мьютекс или обновили бд, как в Вашем случае, обновили в Бд инфу по файлу.

Я насчитал, как минимум 3 отдельных класса. Прежде, чем решать задачу, следует ее сформулировать и понять.
0
05.12.2012, 19:24
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
05.12.2012, 19:24
Помогаю со студенческими работами здесь

Ошибка компиляции нескольких файлов
Добрый день. Изучаю книгу Харви С++ в теме отделение "интерфейса от реализации" возникла проблема с...

Ошибка загрузки нескольких файлов
Здравствуйте! Когда делаю загрузку на сервер один файл ссылка на бд выводит правильно. А если делаю...

Проект из нескольких файлов ( ошибка с <windows.h> )
Помогите разобраться с проектом из нескольких файлов. На паре написал вот такую програмку main.c...

Ошибка при сборке программы из нескольких файлов
А точнее, компилятор возвращает такую ошибку: ОС: Mac OS X 10.9.5 IDE: Xcode 6.2 ...

При создании нескольких word-файлов вылетает ошибка-сервер RPC недоступен!?
В программе создаю последовательно сначала один документ и вывожу его в формате ворд, далее пытаюсь...

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


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru