postgre 二进制存储

show client_encoding;

set client_encoding='UTF8';


show server_encoding;


SELECT E'\\xDEADBEEF';

 

CREATE TABLE tbl_image_t
(
  id bigserial NOT NULL,
  name character varying(32),
  thumb bytea
)


insert into "tbl_image_t" values(4,'中文', E'\\x15191a1b')

SELECT id, name,  encode(thumb, 'hex')  FROM "tbl_image_t";

.net写入读取

 public void Save(string imageName, string imageFilePath)
        {
            using (NpgsqlConnection pgConnection = new NpgsqlConnection(ConnString))
            {
                try
                {
                    using (FileStream pgFileStream = new FileStream(imageFilePath, FileMode.Open, FileAccess.Read))
                    {
                        using (BinaryReader pgReader = new BinaryReader(new BufferedStream(pgFileStream)))
                        {
                            byte[] pgByteA = pgReader.ReadBytes(Convert.ToInt32(pgFileStream.Length));
                            using (NpgsqlCommand pgCommand = new NpgsqlCommand("INSERT INTO \"tbl_image_t\" (name, thumb) SELECT @Name, @Image", pgConnection))
                            {
                                pgCommand.Parameters.AddWithValue("@Name", imageName);
                                pgCommand.Parameters.AddWithValue("@Image", pgByteA);
                                try
                                {
                                    pgConnection.Open();
                                    pgCommand.ExecuteNonQuery();
                                }
                                catch
                                {
                                    throw;
                                }
                            }
                        }
                    }
                }
                catch
                {
                    throw;
                }
            }
        }

        public Image Get(string imageName)
        {
            using (NpgsqlConnection pgConnection = new NpgsqlConnection(ConnString))
            {
                try
                {
                    using (NpgsqlCommand pgCommand = new NpgsqlCommand("SELECT thumb FROM \"tbl_image_t\" WHERE name=@imageName;", pgConnection))
                    {
                        pgCommand.Parameters.AddWithValue("@imageName", imageName);
                        try
                        {
                            pgConnection.Open();
                            Byte[] productImageByte = (Byte[])pgCommand.ExecuteScalar();
                            if (productImageByte != null)
                            {
                                using (Stream productImageStream = new System.IO.MemoryStream(productImageByte))
                                {
                                    return Image.FromStream(productImageStream);
                                }
                            }
                        }
                        catch
                        {
                            throw;
                        }
                    }
                }
                catch
                {
                    throw;
                }
            }
            return null;
        }

 

blob

  private static void WriteLargeObject()
        {
            newcon.Open();
            NpgsqlTransaction transaction = newcon.BeginTransaction();
            LargeObjectManager largeObjectManager = new LargeObjectManager(newcon);

            int noid = largeObjectManager.Create(LargeObjectManager.READWRITE);
            LargeObject lo = largeObjectManager.Open(noid, LargeObjectManager.READWRITE);

            FileStream fs = File.OpenRead(FileName);

            byte[] buf = new byte[fs.Length];
            fs.Read(buf, 0, (int)fs.Length);

            lo.Write(buf);
            lo.Close();
            transaction.Commit();


            transaction = newcon.BeginTransaction();

            lo = largeObjectManager.Open(noid, LargeObjectManager.READWRITE);

            FileStream fsout = File.OpenWrite(FileName + "database");

            buf = lo.Read(lo.Size());

            fsout.Write(buf, 0, (int)lo.Size());
            fsout.Flush();
            fsout.Close();
            lo.Close();
            transaction.Commit();
            newcon.Close();

            DeleteLargeObject(noid);

            Console.WriteLine("noid: {0}", noid);
        }

        public static void DeleteLargeObject(Int32 noid)
        {
            //NpgsqlConnection conn = new NpgsqlConnection("server=localhost;user id=npgsql_tests;password=npgsql_tests");

            newcon.Open();
            NpgsqlTransaction t = newcon.BeginTransaction();
            LargeObjectManager largeObjectManager = new LargeObjectManager(newcon);
            largeObjectManager.Delete(noid);

            t.Commit();

            newcon.Close();

        }

 

posted @ 2013-10-12 10:30  ^^!  阅读(879)  评论(0编辑  收藏  举报