Извлечь файл из коррумпированных объекта 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
но ведьмин код, который я написал, чтобы открыть файл?