C# 如何从postgresql数据库中获取图片
我想选择一张图片,将其另存为postgresql数据库中的大型对象 我知道我用lo_export来做这件事 但有一个问题:我想把这张图片直接保存到我的计算机上,因为我无法访问使用Lou导出保存在服务器上的文件C# 如何从postgresql数据库中获取图片,c#,image,postgresql,get,npgsql,C#,Image,Postgresql,Get,Npgsql,我想选择一张图片,将其另存为postgresql数据库中的大型对象 我知道我用lo_export来做这件事 但有一个问题:我想把这张图片直接保存到我的计算机上,因为我无法访问使用Lou导出保存在服务器上的文件 我认为,如果通过选择查询将图片传输到我的计算机,这对我来说是最好的,我不知道如何使用C,但Npgsql手册有一个类似这样的示例,即将bytea列写入文件: command = new NpgsqlCommand("select blob from t where id = 1);", co
我认为,如果通过选择查询将图片传输到我的计算机,这对我来说是最好的,我不知道如何使用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);
在手册中搜索大型对象,您会找到它。不熟悉C,但如果您已经尝试过contrib/dblink,并且能够更好地访问单独的postgresql server,那么这可能会起作用: 从坏数据库服务器中选择大对象。 使用dblink将大型对象复制到良好的db服务器中。 在良好的数据库服务器上进行lo_导出。
如果您的图片不超过1GB,或者您不能仅访问部分字节,那么使用bytea存储它们是更好的选择
许多SQL GUI工具允许直接下载甚至直接查看bytea列的内容my c代码,它使用Npgsql dll连接到数据库。我的图片字段在数据库中的类型为“lo”,这意味着大型对象,我无法更改其类型。我的数据库中也有图片的大小。@user715878:很抱歉。我添加了一个更新,其中有一些关于大型对象的注释,我链接到的手册也涵盖了这些内容。做得很好,我的问题已经由您的更新解决方案解决了。汤克斯:对不起!你能解释一下我应该如何使用上面的方法将一个大的对象图片插入到我的数据库中吗method@user715878:在中有一个例子。在我的情况下,这个解决方案是不可能的。我只有坏的数据库服务器;你在什么地方没有托管帐户吗?没有,这个项目在一个政治安全受限的政府中心