Модераторы: gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Документ WORD в БД и обратно в WORD, Как из передать в WORD  
V
    Опции темы
Doss
Дата 16.10.2011, 11:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 171
Регистрация: 5.10.2007

Репутация: нет
Всего: нет



Всем доброго и здравия!
Уважаемые форумчане, фактически получается продолжением темы по ссылке:

http://forum.vingrad.ru/forum/topic-339709...yte-bitmap.html
Однако как оказалось, не все так просто как оно видеться.
В общем, есть документ, допустим с форматом .docx (.doc), также может быть любой другой формат как (.xls, .pdf  и т.д.) не важно, но он текстовый документ.
Схожие темы, но без решения:
http://forum.vingrad.ru/topic-78943.html
http://forum.vingrad.ru/topic-55886.html

Если конкретно, то пытаюсь WORD запихать в базу, что в принципе получается, т.е. читаю как двоичные данные и записываю их в БД.
После хочу их увидеть в dgv, что не могу сделать?!!! Это вопрос  №1  smile 
Из базы читаю двоичные данные и заливаю в байт массив:
Код

 using (OleDbConnection conn = new OleDbConnection(connect))
            {
                try
                {
                    conn.Open();
                    //--------------------------------
                    OleDbCommand command = new OleDbCommand(
"SELECT Docc FROM Imeg where id=30", conn);
                    FileStream stream;
                    BinaryWriter writer;
                    OleDbDataReader datareader = command.ExecuteReader();
                    datareader.Read();
                    int bLength = (int)datareader.GetBytes(0, 0, null, 0, int.MaxValue);
                    datareader.Close();
                    int bufferSize = bLength;
                    //MessageBox.Show(bLength.ToString());
                    byte[] outByte = new byte[bLength];
                    long retval;
                    long startIndex = 0;
                    string pubID = "";
                    OleDbDataReader reader = command.ExecuteReader(CommandBehavior.SequentialAccess);

                    while (reader.Read())
                    {
                        //pubID = reader.GetString(0);
                        stream = new FileStream("Xnjnj", FileMode.OpenOrCreate, FileAccess.Write);
                        writer = new BinaryWriter(stream);
                        startIndex = 0;
                        retval = reader.GetBytes(0, startIndex, outByte, 0, bufferSize);
                        while (retval == bufferSize)
                        {
                            writer.Write(outByte);
                            writer.Flush();
                            startIndex += bufferSize;
                            retval = reader.GetBytes(0, startIndex, outByte, 0, bufferSize);
                        }
                        writer.Write(outByte, 0, (int)retval);
                        writer.Flush();
                        writer.Close();
                        stream.Close();
                    }
                   //outByte массив содержит мой документ
                    conn.Close();
                }
                catch (SqlException ex)
                {
                    MessageBox.Show(ex.Message, ex.Source);
                    conn.Close();
                }
            }
        }

 outByte массив содержит мой документ, так как же его в Word заюзать? Это вопрос №2  smile 
Прошу помочь.
Обязуюсь все коды в рабочем состоянии выложить и закрыть тему на решении. 

PM MAIL   Вверх
Doss
Дата 17.10.2011, 18:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 171
Регистрация: 5.10.2007

Репутация: нет
Всего: нет



Вопрос решен!!! smile 

В общем запись осуществил в byte []:
Код

byte[] photo = GetDOC(docFilePath);
             using (OleDbConnection connection = new OleDbConnection(connect))
            {
                OleDbCommand command = new OleDbCommand(
                "INSERT into Imeg(Docc) Values(@Docc)", connection);
                command.Parameters.Add("@Docc", OleDbType.LongVarBinary, photo.Length).Value = photo;
                connection.Open();
                command.ExecuteNonQuery();

            }

 public static byte[] GetDOC(string filePath)
        {
            FileStream fs = new FileStream(filePath, FileMode.Open, FileAccess.Read);
            BinaryReader br = new BinaryReader(fs);
            byte[] photo = br.ReadBytes((int)fs.Length);
            br.Close();
            fs.Close();
            return photo;
        }
 

Вот теперь документ .doc в базе в двоичном виде.
Появилась необходимость прочесть этот документ из базы и отобразить в WORD.
НО, к сожалению мне приходиться сначала сохранять на локальном диске этот файл в виде .doc, а после открывать его. Хотелось бы открывать сразу в ворде не сохраняя его на диске, держа в памяти. Пока вышел из ситуации удаляя файл.
Вот код:
Код

 using (OleDbConnection conn = new OleDbConnection(connect))
            {
                try
                {
                    conn.Open();
                    //--------------------------------
                    OleDbCommand command = new OleDbCommand("SELECT Docc FROM Imeg where id=34", conn);
                    FileStream stream;
                    BinaryWriter writer;
                    OleDbDataReader datareader = command.ExecuteReader();
                    datareader.Read();
                    int bLength = (int)datareader.GetBytes(0, 0, null, 0, int.MaxValue);
                    datareader.Close();
                    int bufferSize = bLength;
                    byte[] outByte = new byte[bLength];
                    long retval;
                    long startIndex = 0;
                    //string pubID = "";
                    OleDbDataReader reader = command.ExecuteReader(CommandBehavior.SequentialAccess);

                    while (reader.Read())
                    {
                        //pubID = reader.GetString(0);
                        stream = new FileStream("Привет.doc", FileMode.OpenOrCreate, FileAccess.Write);
                        writer = new BinaryWriter(stream);
                        startIndex = 0;
                        retval = reader.GetBytes(0, startIndex, outByte, 0, bufferSize);
                        while (retval == bufferSize)
                        {
                            writer.Write(outByte);
                            writer.Flush();
                            startIndex += bufferSize;
                            retval = reader.GetBytes(0, startIndex, outByte, 0, bufferSize);
                        }
                        writer.Write(outByte, 0, (int)retval);
                        writer.Flush();
                        writer.Close();
                        stream.Close();
                    }
                    reader.Close();
                    SaveFileDialog saveFileDlg = new SaveFileDialog();
                    saveFileDlg.Filter = "Word Documents|*.doc|Excel Worksheets|*.xls|PowerPoint Presentations|*.ppt" +
             "|Office Files|*.docx;*.xls;*.ppt" + "|All Files|*.*";
                    if (saveFileDlg.ShowDialog() == DialogResult.OK)
                    {
                        FileStream streamF = new FileStream(saveFileDlg.FileName, FileMode.OpenOrCreate);
                        BinaryWriter writerB = new BinaryWriter(streamF);
                        byte[] b1 = outByte;
                        writerB.Write(b1);
                        streamF.Close(); writerB.Close();
                        Process prEx1 = new Process();
                        prEx1.EnableRaisingEvents = true;
                        prEx1.Exited += new EventHandler(prEx1_Exited);
                        prEx1.StartInfo = new ProcessStartInfo(saveFileDlg.FileName, saveFileDlg.InitialDirectory);
                        prEx1.Start();
                        prEx1.WaitForExit();
                        string path = saveFileDlg.FileName;
                        try
                        {
                            using (StreamWriter sw = File.CreateText(path)) { }
                            string path2 = path + "temp";
                            // Ensure that the target does not exist.
                            File.Delete(path);                            
                        }
                        catch (Exception ex)
                        {
                            Console.WriteLine("The process failed: {0}", ex.ToString());
                        }
                    }
                    conn.Close();
                }
                catch (SqlException ex)
                {
                    MessageBox.Show(ex.Message, ex.Source);
                    conn.Close();
                }
            }
НУ при закрытии файла можем обновить базу


НУ при закрытии файла можем обновить базу
Код

 private static void prEx1_Exited(object sender, EventArgs e)
        {
            MessageBox.Show("Process #1 exited. Тут я зависываю данные в БД и обновляю ее");
        }


Всем доброго вечера!
С уважением....ваш Д. smile 
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
stab
mr.DUDA
Exception

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, stab, mr.DUDA, Exception.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Базы данных под .NET | Следующая тема »


 




[ Время генерации скрипта: 0.0458 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.