有关如何将BLOB导出为文件的基本信息

时间:2015-03-23 13:58:46

标签: sql firebird

我研究过如何将BLOB导出到图像。 DB有一个IMAGE列,存储数千个图像。我想导出表但我在BLOB中为Interbase和Firebird收到EMS SQL Manager文件错误。

有好的帖子,但我仍未能成功。

  1. SQL scripts to insert File to BLOB field and export BLOB to File
  2. 此示例出现在许多页面上,包括microsoft的网站。我正在使用INTERBASE(火鸟)。我没有找到与为firebird启用xp_shell相关的任何内容,或者对于interbase和firebir(我也已安装)发现了EMS SQL Manager。我的猜测是:它不可能。我还尝试了安装SQL Server expressSQL Server 2008SQL Server 2012。我甚至没有连接到服务器就走到了尽头。原因是我没有设法启动服务器。遵循technet.microsoft上的指南:How to: Start SQL Server Agent但右侧窗格中没有任何服务。

    1. PHP file下载整个专栏(由于代理限制,可能不会发布链接)。
    2. 它有一个令我不满的mysql连接部分。我的电脑上有数据库。作为GDB文件,我也有XAMPP。我可以找到一种方法将其用作localhost env。我希望这是有道理的。

      1. 最后的解决方案是USE bcp,这个想法发布在Stack溢出标题为:将blob从表导出到单个文件的最快方法。我阅读了文档,安装了它,但无法连接到服务器。我使用-S PC-PC -U xxx -P xxx(服务器必须是错误的)但我发现的信息都使用-T(Windows身份验证)
      2. 总结。我正在使用firebird,EMS SQL Manager。我尝试将图像表中的所有图像提取到单个文件中。这些工具都有SQL个脚本屏幕。但它似乎与xp shell结合使用。你会建议什么?我使用错误的SQL管理器来完成这个?

1 个答案:

答案 0 :(得分:2)

有几种方法:

  • 使用isql命令BLOBDUMP将blob写入文件
  • 使用客户端库(例如,用于Java的Jaybird,用于C#的Firebird .net提供程序)来检索数据,
  • 使用PHP,您可以在循环中使用ibase_blob_get从blob中获取字节,并将其写入文件。

我不使用也不了解EMS SQL Manager,因此我不知道是否(以及如何)可以导出blob。

您链接到的示例,您提到的几乎所有工具都是针对Microsoft SQL Server,而不是针对Firebird;所以难怪那些不起作用。

Java中的示例

使用Java 8将blob保存到磁盘的基本示例(可能也适用于Java 7)将是:

/**
 * Example to save images to disk from a Firebird database.
 * <p>
 * Code assumes a table with the following structure:
 * <pre>
 * CREATE TABLE imagestorage (
 *     filename VARCHAR(255),
 *     filedata BLOB SUB_TYPE BINARY
 * );
 * </pre>
 * </p>
 */
public class StoreImages {
    // Replace testdatabase with alias or path of database
    private static final String URL = "jdbc:firebirdsql://localhost/testdatabase?charSet=utf-8";
    private static final String USER = "sysdba";
    private static final String PASSWORD = "masterkey";
    private static final String DEFAULT_FOLDER = "D:\\Temp\\target";

    private final Path targetFolder;

    public StoreImages(String targetFolder) {
        this.targetFolder = Paths.get(targetFolder);
    }

    public static void main(String[] args) throws IOException, SQLException {
        final String targetFolder = args.length == 0 ? DEFAULT_FOLDER : args[0];
        final StoreImages storeImages = new StoreImages(targetFolder);
        storeImages.store();
    }

    private void store() throws IOException, SQLException {
        if (!Files.isDirectory(targetFolder)) {
            throw new FileNotFoundException(String.format("The folder %s does not exist", targetFolder));
        }
        try (
            Connection connection = DriverManager.getConnection(URL, USER, PASSWORD);
            Statement stmt = connection.createStatement();
            ResultSet rs = stmt.executeQuery("SELECT filename, filedata FROM imagestorage")
        ) {
            while (rs.next()) {
                final Path targetFile = targetFolder.resolve(rs.getString("FILENAME"));
                if (Files.exists(targetFile)) {
                    System.out.printf("File %s already exists%n", targetFile);
                    continue;
                }
                try (InputStream data = rs.getBinaryStream("FILEDATA")) {
                    Files.copy(data, targetFile);
                }
            }
        }
    }
}

C#

中的示例

以下是C#中的示例,它与上面的代码类似。

class StoreImages
{
    private const string DEFAULT_FOLDER = @"D:\Temp\target";
    private const string DATABASE = @"D:\Data\db\fb3\fb3testdatabase.fdb";
    private const string USER = "sysdba";
    private const string PASSWORD = "masterkey";

    private readonly string targetFolder;
    private readonly string connectionString;

    public StoreImages(string targetFolder)
    {
        this.targetFolder = targetFolder;
        connectionString = new FbConnectionStringBuilder
        {
            Database = DATABASE,
            UserID = USER,
            Password = PASSWORD
        }.ToString();
    }

    static void Main(string[] args)
    {
        string targetFolder = args.Length == 0 ? DEFAULT_FOLDER : args[0];
        var storeImages = new StoreImages(targetFolder);
        storeImages.store();
    }

    private void store()
    {
        if (!Directory.Exists(targetFolder))
        {
            throw new FileNotFoundException(string.Format("The folder {0} does not exist", targetFolder), targetFolder);
        }
        using (var connection = new FbConnection(connectionString))
        {
            connection.Open();
            using (var command = new FbCommand("SELECT filename, filedata FROM imagestorage", connection))
            using (var reader = command.ExecuteReader())
            {
                while (reader.Read())
                {
                    string targetFile = Path.Combine(targetFolder, reader["FILENAME"].ToString());
                    if (File.Exists(targetFile))
                    {
                        Console.WriteLine("File {0} already exists", targetFile);
                        continue;
                    }

                    using (var fs = new FileStream(targetFile, FileMode.Create))
                    {
                        byte[] filedata = (byte[]) reader["FILEDATA"];
                        fs.Write(filedata, 0, filedata.Length);
                    }
                }
            }
        }
    }
}