Как я могу извлечь файл, хранящийся в виде BLOB-объекта в таблице FoxPro?

У меня есть несколько таблиц Foxpro, одна из которых включает поле Blob. Я знаю тип данных, хранящийся в Blob (файле MapPoint), но не знаю, как его извлечь, потому что у меня нет FoxPro (я не могу легко его получить).

Есть ли способ взять файлы .DBF и .FPT и извлечь файлы MapPoint, хранящиеся в них?


person Tom W    schedule 24.11.2011    source источник


Ответы (3)


Вы можете использовать C # и ADO.NET для извлечения данных в файлы. Вот пример кода:

using System;
using System.Data;
using System.Data.OleDb;
using System.IO;

namespace SaveFoxProMemoFieldAsFile
{
    class Program
    {
        static void Main(string[] args)
        {
            string connectionString = @"Provider=VFPOLEDB.1;Data Source=C:\data\;Collating Sequence=MACHINE;Null=Yes";

            string sqlSelect = "SELECT filedata FROM filelist";
            int fileNumber = 1;
            using (OleDbConnection connection = new OleDbConnection(connectionString))
            {
                using(OleDbCommand command = connection.CreateCommand())
                {
                    command.CommandText = sqlSelect;
                    command.CommandType = CommandType.Text;

                    try
                    {
                        connection.Open();
                        using(OleDbDataReader reader = command.ExecuteReader(CommandBehavior.CloseConnection))
                        {
                            if(reader.HasRows)
                            {
                                while(reader.Read())
                                {
                                    byte[] binaryData = (byte[])reader["filedata"];

                                    FileStream fs = new FileStream(string.Format(@"C:\data\file_{0}.pdf", fileNumber++), FileMode.OpenOrCreate, FileAccess.Write);
                                    fs.Write(binaryData, 0, binaryData.Length);
                                    fs.Close();
                                }
                            }
                        }
                    }
                    catch
                    {
                        throw;
                    }
                }
            }

            Console.WriteLine("Program execution complete");
            Console.WriteLine("Press any key to end");
            Console.ReadKey();
        }
    }
}

Посетите Microsoft OLE DB Provider для Visual FoxPro 9.0, если вам нужен Драйвер FoxPro.

person DaveB    schedule 24.11.2011

В этой предыдущей ссылке показано, как подключиться к в VFP с C #. Этот ответ фактически показывает соединение с OleDbProvider, которое похоже на ответ DaveB, однако VFP НЕ является соединением с SQLServer и использует VFP OleDbProvider, который доступен по адресу веб-сайт Microsoft для VFP

Используются вместе друг с другом (подключение к VFP OleDB) и выполняющимся запросом. Строка подключения должна указывать только на физический путь, по которому находятся данные, и может запрашивать из любого .dbf в этой папке. Вам не нужно явно подключаться к реальной «базе данных», поскольку VFP подразумевает, что путь - это местоположение базы данных.

Во всяком случае, другой вопрос, связанный с Дэйвом, должен иметь возможность получить ваши данные и записать их в поток. Единственное другое предостережение заключается в том, что файловый поток, который вы пишете, также должен быть двоичным файлом. В противном случае каждый раз, когда вы пишете байт, который является ключом {enter}, может быть принудительно записан с завершающим {line feed}. Я обнаружил, что это один из трудностей давным-давно, когда писал файлы двоичных изображений при построении 2-мерных штрих-кодов, он запутался.

person DRapp    schedule 24.11.2011

Мне нужно было вытащить несколько файлов PDF, которые хранились в том, что я считаю мемо-полем в FoxPro. В схеме это поле указано как LONGVARCHAR.

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

Если бы я извлек PDF-файл в виде строки, он бы обрезался всякий раз, когда встречал значение NULL \0 в BLOB.

Вот SQL, который я использовал:

string sqlSelect = "SELECT cast(inc_rawdata as Blob) as inc_rawdata, inc_filename  FROM F2_522_SYS_MAP_FILES";
person ARU    schedule 11.09.2017