我研究过如何将BLOB导出到图像。 DB有一个IMAGE
列,存储数千个图像。我想导出表但我在BLOB
中为Interbase和Firebird收到EMS SQL Manager
文件错误。
有好的帖子,但我仍未能成功。
此示例出现在许多页面上,包括microsoft的网站。我正在使用INTERBASE
(火鸟)。我没有找到与为firebird启用xp_shell相关的任何内容,或者对于interbase和firebir(我也已安装)发现了EMS SQL Manager
。我的猜测是:它不可能。我还尝试了安装SQL Server express
,SQL Server 2008
和SQL Server 2012
。我甚至没有连接到服务器就走到了尽头。原因是我没有设法启动服务器。遵循technet.microsoft上的指南:How to: Start SQL Server Agent但右侧窗格中没有任何服务。
PHP file
下载整个专栏(由于代理限制,可能不会发布链接)。它有一个令我不满的mysql连接部分。我的电脑上有数据库。作为GDB
文件,我也有XAMPP
。我可以找到一种方法将其用作localhost env。我希望这是有道理的。
bcp
,这个想法发布在Stack溢出标题为:将blob从表导出到单个文件的最快方法。我阅读了文档,安装了它,但无法连接到服务器。我使用-S PC-PC -U xxx -P xxx
(服务器必须是错误的)但我发现的信息都使用-T
(Windows身份验证)总结。我正在使用firebird,EMS SQL Manager
。我尝试将图像表中的所有图像提取到单个文件中。这些工具都有SQL
个脚本屏幕。但它似乎与xp shell结合使用。你会建议什么?我使用错误的SQL管理器来完成这个?
答案 0 :(得分:2)
有几种方法:
BLOBDUMP
将blob写入文件ibase_blob_get
从blob中获取字节,并将其写入文件。我不使用也不了解EMS SQL Manager,因此我不知道是否(以及如何)可以导出blob。
您链接到的示例,您提到的几乎所有工具都是针对Microsoft SQL Server,而不是针对Firebird;所以难怪那些不起作用。
使用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#中的示例,它与上面的代码类似。
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);
}
}
}
}
}
}