0

我想选择一张在 postgresql 数据库中保存为大对象的图片。

我知道我使用 lo_export 来做到这一点。

但有一个问题:我想将这张图片直接保存到我的电脑,因为我无法使用 lo_export 访问保存在服务器上的文件

(我认为如果通过选择查询将图片传输到我的计算机,这对我来说是最好的)

4

3 回答 3

2

我不完全了解 C# 的方式,但 Npgsql 手册有一个类似于将bytea列写入文件的示例:

command = new NpgsqlCommand("select blob from t where id = 1);", conn);
Byte[] result = (Byte[])command.ExecuteScalar();

FileStream fs = new FileStream(args[0] + "database", FileMode.Create, FileAccess.Write);
BinaryWriter bw = new BinaryWriter(new BufferedStream(fs));

bw.Write(result);
bw.Flush();
fs.Close();
bw.Close();

因此,您只需像任何其他列一样从数据库中读取它并将其写入本地文件。该示例位于我链接到的页面的一半左右,只需搜索“bytea”即可找到它。

更新:对于大型对象,该过程似乎相似,但不太像 SQL。该手册(如上链接)包括一些大型对象示例:

NpgsqlTransaction t = Polacz.BeginTransaction();

LargeObjectManager lbm = new LargeObjectManager(Polacz);
LargeObject lo = lbm.Open(takeOID(idtowaru),LargeObjectManager.READWRITE); //take picture oid from metod takeOID

byte[] buf = new byte[lo.Size()];
buf = lo.Read(lo.Size());

MemoryStream ms = new MemoryStream();
ms.Write(buf,0,lo.Size());

// ...

Image zdjecie = Image.FromStream(ms);

在手册中搜索“大物体”,您会找到它。

于 2011-05-09T04:14:08.683 回答
0

不熟悉 C#,但如果你有 contrib/dblink 并更好地访问单独的 postgresql 服务器,这可能会起作用:

  1. 从坏的数据库服务器中选择大对象。
  2. 使用 dblink 将大对象复制到好的数据库服务器中。
  3. lo_export 在良好的数据库服务器上。
于 2011-05-09T12:05:05.647 回答
0

如果您的图片不超过 1GB(或者如果您不只访问部分字节),那么使用bytea是存储它们的更好选择。

很多 SQL GUI 工具允许直接下载(甚至查看)bytea 列的内容

于 2011-05-11T18:58:19.907 回答