mb_force2 Ответов: 0

Извлечь файл из коррумпированных объекта Ole поле


Привет, у меня проблема, кто-нибудь может мне помочь?

Код ниже-это кнопка для сохранения файлов, таких как pdf; word; xls; txt и т. д. В ole-объект в accdb, он хорошо сохраняется, но я не знаю, как получить файл из БД с помощью другой кнопки

    Try
        Using conn As New OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=|DataDirectory|\SIGCB.accdb")
            conn.Open()
            Dim command As New OleDbCommand("insert into Data_Ficheiros ([IDB_NINT], [IDB_NMECAN], [IDB_NOMEABV], [ARQ_TIPO], [ARQ_DESC], [ARQ_DATA], [ARQ_FILE]) values (@IDB_NINT, @IDB_NMECAN, @IDB_NOMEABV, @ARQ_TIPO, @ARQ_DESC, @ARQ_DATA, @ARQ_FILE)", conn)
            With command.Parameters
                .AddWithValue("@IDB_NINT", Nº_Interno_TB.Text)
                .AddWithValue("@IDB_NMECAN", Nº_Mecanográfico_TB.Text)
                .AddWithValue("@IDB_NOMEABV", Nome_TB.Text)
                .AddWithValue("@ARQ_TIPO", Tipo_Ficheiro_TB.Text)
                .AddWithValue("@ARQ_DESC", Descrição_Ficheiro_TB.Text)
                .AddWithValue("@ARQ_DATA", Data_Ficheiro_TB.Text)

                Try
                    Dim fs As New FileStream(Localização_do_Ficheiro_TB.Text, FileMode.Open, FileAccess.Read)
                    Dim byteArr(CInt(fs.Length)) As Byte
                    fs.Read(byteArr, 0, fs.Length)
                    fs.Close()
                    .AddWithValue("@ARQ_FILE", byteArr)
                Catch ex As Exception
                    MsgBox(ex.ToString)
                End Try
            End With
            command.ExecuteNonQuery()
            MessageBox.Show("Guardado Com Sucesso.", "INFO", MessageBoxButtons.OK, MessageBoxIcon.Information)
            command.Dispose()
            conn.Close()
        End Using
    Catch ex As Exception
        MessageBox.Show(ex.Message, "Erro ao Guardar", MessageBoxButtons.OK, MessageBoxIcon.Error)
    End Try

    Me.Validate()
    Me.Data_FicheirosBindingSource.EndEdit()
    Me.TableAdapterManager.UpdateAll(Me.SIGCBDataSet)

End Sub


Заранее спасибо

Что я уже пробовал:

я пытаюсь это сделать, но не получается

Dim cn As New OleDbConnection With {.ConnectionString = Builder.ConnectionString}
    Dim cmd As New OleDbCommand With _
        { _
            .Connection = cn, _
            .CommandText = "SELECT ARQ_FILE FROM Data_Ficheiros Where ARQ_FILE " _
        }
Dim dr As OleDbDataReader = Nothing
Dim FileStream As System.IO.FileStream
Dim Reader As OleDbDataReader
Dim Data() As Byte = Nothing
Dim Writer As System.IO.BinaryWriter = Nothing
Dim bufferSize As Integer = 1000
Dim buffer(bufferSize - 1) As Byte
Dim startIndex As Long = 0
Dim numberOfBytes As Long = 0
    cn.Open()
    Reader = cmd.ExecuteReader(CommandBehavior.SequentialAccess)
    Reader.Read()
    FileStream = New System.IO.FileStream(
        IO.Path.Combine(Application.StartupPath, "Data", "EU.xls"),
        System.IO.FileMode.OpenOrCreate, System.IO.FileAccess.Write)
    Writer = New System.IO.BinaryWriter(FileStream)
    Do
        numberOfBytes = Reader.GetBytes(0, startIndex, buffer, 0, bufferSize)
        If numberOfBytes = 0 Then
            Exit Do
        End If
        Writer.Write(buffer, 0, CInt(Fix(numberOfBytes)))
        startIndex += numberOfBytes
    Loop While True
    Writer.Flush()
    If Writer IsNot Nothing Then
        Writer.Close()
    End If
    If FileStream IsNot Nothing Then
        FileStream.Close()
    End If
    If Reader IsNot Nothing Then
        Reader.Close()
    End If
    cn.Close()
    MessageBox.Show("Done")

End Sub

Richard MacCutchan

Что "но не работай" значит?

mb_force2

Не просматривайте файл

mb_force2

хорошо я покажу вам свой код для сохранения файла в поле ole object


Частный Строитель Как Новый OleDbConnectionStringBuilder С _
{ _
.Источник данных = ИО.Путь.Комбайн (Приложение.StartupPath, " SIGCB. accdb"), _
.Поставщик = "Майкрософт.Туз.Oledb для.12.0" _
}

Private Sub Button2_Click (sender As Object, e As EventArgs) обрабатывает Button2. Click

Dim cn как новый OleDbConnection с {. ConnectionString = Builder.Параметр connectionString}
Dim cmd как новая OleDbCommand с {. Connection = cn}
Dim dr As OleDbDataReader = ничего
Дим Файлового Потока Как Системы.ИО.Хранилище FileStream
Dim Reader как System.IO. BinaryReader = ничего
Dim Data() As Byte = Nothing
Хранилище FileStream = Новая Система.ИО.Хранилище FileStream(
ИО.Путь.Комбайн (Приложение.StartupPath, Localização_do_Ficheiro_TB. Text),
Системы.ИО.Содержит filemode.Открытые, Системы.ИО.Флагами fileaccess.Читать)
Читатель = Новый Система.ИО.BinaryReader(Файлового Потока)
Данные = Читатель.ReadBytes(Кинт(Файлового Потока.Длина))
спицы.Открыть()
УМК.CommandText = " вставить в Data_Ficheiros (IDB_NINT, IDB_NMECAN, IDB_NOMEABV, ARQ_DATA, ARQ_DESC, ARQ_FILE) значения (@IDB_NINT,@IDB_NMECAN,@IDB_NOMEABV,@ARQ_DATA,@ARQ_DESC,@ARQ_FILE)"
УМК.Соединение = cn
УМК.Параметры.Добавить("@IDB_NMECAN", система.Данных.Oledb для.OleDbType.Тип данных wchar)
УМК.Параметры(0).Значение = Nº_Interno_TB.Текст
УМК.Параметры.Добавить("@IDB_NMECAN", система.Данных.Oledb для.OleDbType.Тип данных wchar)
УМК.Параметров(1).Значение = Nº_Mecanográfico_TB.Текст
УМК.Параметры.Добавить("@IDB_NOMEABV", система.Данных.Oledb для.OleDbType.Тип данных wchar)
УМК.Параметров(2).Значение = Nome_TB.Текст
УМК.Параметры.Добавить("@ARQ_DATA", система.Данных.Oledb для.OleDbType.Тип данных wchar)
УМК.Параметров(3).Значение = Data_Ficheiro_TB.Текст
УМК.Параметры.Добавить("@ARQ_DESC", система.Данных.Oledb для.OleDbType.Тип данных wchar)
УМК.Параметры(4).Значение = Descrição_Ficheiro_TB.Текст
УМК.Параметры.Добавить("@ARQ_FILE", система.Данных.Oledb для.OleDbType.Image вам необходимо выбрать)
cmd. Parameters(5). Value = Data
УМК.Метод executenonquery()
спицы.Рядом()

Конец Подводной Лодки


А это для чтения


Dim cn как новый OleDbConnection с {. ConnectionString = Builder.Параметр connectionString}
Dim cmd как новая OleDbCommand с _
{ _
.Подключение = СN, _
.CommandText = " выберите ARQ_FILE из Data_Ficheiros, где ARQ_FILE= ARQ_FILE" _
}
Dim dr As OleDbDataReader = ничего
Дим Файлового Потока Как Системы.ИО.Хранилище FileStream
Тусклый Читатель Как OleDbDataReader
Dim Data() As Byte = Nothing
Дим Писателя Как Системы.ИО.BinaryWriter = Ничего
Dim bufferSize As Integer = 1000
Тусклый буфер (bufferSize-1) в виде байта
Dim startIndex As Long = 0
Dim numberOfBytes As Long = 0
спицы.Открыть()
Reader = cmd.ExecuteReader(CommandBehavior.Последовательный процесс)
Читатель.Читать()
Хранилище FileStream = Новая Система.ИО.Хранилище FileStream(
ИО.Путь.Комбайн (Приложение.StartupPath, Localização_do_Ficheiro_TB. Text),
Системы.ИО.Содержит filemode.Открытые, Системы.ИО.Флагами fileaccess.Писать)
Писатель = Новая Система.ИО.BinaryWriter(Файлового Потока)
Делать
numberOfBytes = Reader.Метод getbytes(0, параметр startindex, буфер, 0, параметр bufferSize)
Если numberOfBytes = 0, то
Выход Делать
Конец, Если
Писатель.Write(buffer, 0, CInt(Fix(numberOfBytes)))
startIndex += numberOfBytes
Цикл В То Время Как Истина
Писатель.Промывать()
Если Писатель Не Ничто Тогда
Писатель.Закрывать()
Конец, Если
Если FileStream - Это Не Ничто, То
файловый поток.Закрывать()
Конец, Если
Если Читатель Не Ничто Тогда
Читатель.Закрывать()
Конец, Если
спицы.Рядом()
Ящик для сообщений.Показать ("Готово")

Конец Подводной Лодки

все работает нормально, но после прочтения Как я открываю файл?

[no name]

Да... похоже, что ваше утверждение SELECT является неполным.

mb_force2

Что вы имеете в виду

Richard MacCutchan

Dim cmd As New OleDbCommand With _
{ _
.Connection = cn, _
.CommandText = "SELECT ARQ_FILE FROM Data_Ficheiros Where ARQ_FILE " _
}

Посмотри на него ... он упускает конец.

mb_force2

Ладно... вот в чем проблема, я не знаю, как я это сделал

можете ли вы помочь мне, пожалуйста

Richard MacCutchan

Помочь в чем? Просто исправьте свой оператор SELECT, чтобы он получал правильную запись из базы данных.

mb_force2

Попробуй
Использование conn в качестве нового OleDbConnection ("Provider=Microsoft. ACE.OLEDB. 12. 0;data Source=|DataDirectory|\SIGCB. accdb")
Коннектикут.Открыть()
Команда Dim как новая OleDbCommand("вставить в Data_Ficheiros ([IDB_NINT], [IDB_NMECAN], [IDB_NOMEABV], [ARQ_TIPO], [ARQ_DESC], [ARQ_DATA], [ARQ_FILE]) значения (@IDB_NINT, @IDB_NMECAN, @IDB_NOMEABV, @ARQ_TIPO, @ARQ_DESC, @ARQ_DATA, @arq_file)", Conn)
С помощью команды.Параметры
.AddWithValue("@IDB_NINT", Nº_Interno_TB.Текст)
.AddWithValue("@IDB_NMECAN", Nº_Mecanográfico_TB.Текст)
.AddWithValue("@IDB_NOMEABV", Nome_TB.Текст)
.AddWithValue("@ARQ_TIPO", Tipo_Ficheiro_TB.Текст)
.AddWithValue("@ARQ_DESC", Descrição_Ficheiro_TB.Текст)
.AddWithValue("@ARQ_DATA", Data_Ficheiro_TB.Текст)

Попробуй
Дим FS в качестве нового типа FileStream(Localização_do_Ficheiro_TB.Текста, Содержит Filemode.Открытия, Флагами Fileaccess.Читать)
Dim byteArr(CInt (fs.Length)) Как Байт
fs. Read(byteArr, 0, FS. Length)
ПС.Рядом()
.AddWithValue ("@ARQ_FILE", byteArr)
Поймать ex как исключение
MsgBox(ex. ToString)
Конец Попытки
Конец С
команда.Метод executenonquery()
Ящик для сообщений.Show ("Guardado Com Sucesso.", "INFO", MessageBoxButtons.Хорошо, MessageBoxIcon.Информация)
команда.Располагать()
Коннектикут.Закрывать()
Конец Использования
Поймать ex как исключение
Ящик для сообщений.Show (ex. Message, "Erro ao Guardar", MessageBoxButtons.Хорошо, MessageBoxIcon.Ошибка)
Конец Попытки

Этот код работает правильно для сохранения файлов в поле ole object в accdb
но ведьмин код, который я написал, чтобы открыть файл?

mb_force2

Попробуй
Использование conn в качестве нового OleDbConnection ("Provider=Microsoft. ACE.OLEDB. 12. 0;data Source=|DataDirectory|\SIGCB. accdb")
Коннектикут.Открыть()
Команда Dim как новая OleDbCommand("вставить в Data_Ficheiros ([IDB_NINT], [IDB_NMECAN], [IDB_NOMEABV], [ARQ_TIPO], [ARQ_DESC], [ARQ_DATA], [ARQ_FILE]) значения (@IDB_NINT, @IDB_NMECAN, @IDB_NOMEABV, @ARQ_TIPO, @ARQ_DESC, @ARQ_DATA, @arq_file)", Conn)
С помощью команды.Параметры
.AddWithValue("@IDB_NINT", Nº_Interno_TB.Текст)
.AddWithValue("@IDB_NMECAN", Nº_Mecanográfico_TB.Текст)
.AddWithValue("@IDB_NOMEABV", Nome_TB.Текст)
.AddWithValue("@ARQ_TIPO", Tipo_Ficheiro_TB.Текст)
.AddWithValue("@ARQ_DESC", Descrição_Ficheiro_TB.Текст)
.AddWithValue("@ARQ_DATA", Data_Ficheiro_TB.Текст)

Попробуй
Дим FS в качестве нового типа FileStream(Localização_do_Ficheiro_TB.Текста, Содержит Filemode.Открытия, Флагами Fileaccess.Читать)
Dim byteArr(CInt (fs.Length)) Как Байт
fs. Read(byteArr, 0, FS. Length)
ПС.Рядом()
.AddWithValue ("@ARQ_FILE", byteArr)
Поймать ex как исключение
MsgBox(ex. ToString)
Конец Попытки
Конец С
команда.Метод executenonquery()
Ящик для сообщений.Show ("Guardado Com Sucesso.", "INFO", MessageBoxButtons.Хорошо, MessageBoxIcon.Информация)
команда.Располагать()
Коннектикут.Закрывать()
Конец Использования
Поймать ex как исключение
Ящик для сообщений.Show (ex. Message, "Erro ao Guardar", MessageBoxButtons.Хорошо, MessageBoxIcon.Ошибка)
Конец Попытки

Этот код работает правильно для сохранения файлов в поле ole object в accdb
но ведьмин код, который я написал, чтобы открыть файл?

0 Ответов