// pobierz: download // Rysunek: drawing //take a picture from database and convert to Image type public System.Drawing.Image GetDrawing(int idOfOID) { System.Drawing.Image img; using (Npgsql.NpgsqlConnection connection = new Npgsql.NpgsqlConnection(GetConnectionString())) { if (connection.State != System.Data.ConnectionState.Open) { connection.Open(); } using (Npgsql.NpgsqlTransaction trans = connection.BeginTransaction()) { NpgsqlTypes.LargeObjectManager lbm = new NpgsqlTypes.LargeObjectManager(connection); NpgsqlTypes.LargeObject lo = lbm.Open(takeOID(idOfOID), NpgsqlTypes.LargeObjectManager.READWRITE); //take picture oid from metod takeOID byte[] buf = new byte[lo.Size()]; buf = lo.Read(lo.Size()); using (System.IO.MemoryStream ms = new System.IO.MemoryStream()) { ms.Write(buf, 0, lo.Size()); img = System.Drawing.Image.FromStream(ms); } // End Using ms lo.Close(); trans.Commit(); if (connection.State != System.Data.ConnectionState.Closed) { connection.Close(); } } // End Using trans } // End Using connection return(img); } // End Function GetDrawing
} // End Function GetLargeDrawing // http://stackoverflow.com/questions/14509747/inserting-large-object-into-postgresql-returns-53200-out-of-memory-error // https://github.com/npgsql/Npgsql/wiki/User-Manual public int InsertLargeObject() { int noid; byte[] BinaryData = new byte[123]; // Npgsql.NpgsqlCommand cmd ; // long lng = cmd.LastInsertedOID; using (Npgsql.NpgsqlConnection connection = new Npgsql.NpgsqlConnection(GetConnectionString())) { using (Npgsql.NpgsqlTransaction transaction = connection.BeginTransaction()) { try { NpgsqlTypes.LargeObjectManager manager = new NpgsqlTypes.LargeObjectManager(connection); noid = manager.Create(NpgsqlTypes.LargeObjectManager.READWRITE); NpgsqlTypes.LargeObject lo = manager.Open(noid, NpgsqlTypes.LargeObjectManager.READWRITE); // lo.Write(BinaryData); int i = 0; do { int length = 1000; if (i + length > BinaryData.Length) { length = BinaryData.Length - i; } byte[] chunk = new byte[length]; System.Array.Copy(BinaryData, i, chunk, 0, length); lo.Write(chunk, 0, length); i += length; } while (i < BinaryData.Length); lo.Close(); transaction.Commit(); } // End Try catch { transaction.Rollback(); throw; } // End Catch return(noid); } // End Using transaction } // End using connection } // End Function InsertLargeObject
} // End Function GetDrawing public System.Drawing.Image GetLargeDrawing(int idOfOID) { System.Drawing.Image img; using (Npgsql.NpgsqlConnection connection = new Npgsql.NpgsqlConnection(GetConnectionString())) { lock (connection) { if (connection.State != System.Data.ConnectionState.Open) { connection.Open(); } using (Npgsql.NpgsqlTransaction trans = connection.BeginTransaction()) { NpgsqlTypes.LargeObjectManager lbm = new NpgsqlTypes.LargeObjectManager(connection); NpgsqlTypes.LargeObject lo = lbm.Open(takeOID(idOfOID), NpgsqlTypes.LargeObjectManager.READWRITE); //take picture oid from metod takeOID byte[] buffer = new byte[32768]; using (System.IO.MemoryStream ms = new System.IO.MemoryStream()) { int read; while ((read = lo.Read(buffer, 0, buffer.Length)) > 0) { ms.Write(buffer, 0, read); } // Whend img = System.Drawing.Image.FromStream(ms); } // End Using ms lo.Close(); trans.Commit(); if (connection.State != System.Data.ConnectionState.Closed) { connection.Close(); } } // End Using trans } // End lock connection } // End Using connection return(img); } // End Function GetLargeDrawing
public void DeleteLargeObject(int noid) { using (Npgsql.NpgsqlConnection connection = new Npgsql.NpgsqlConnection(GetConnectionString())) { if (connection.State != System.Data.ConnectionState.Open) { connection.Open(); } using (Npgsql.NpgsqlTransaction trans = connection.BeginTransaction()) { NpgsqlTypes.LargeObjectManager lbm = new NpgsqlTypes.LargeObjectManager(connection); lbm.Delete(noid); trans.Commit(); if (connection.State != System.Data.ConnectionState.Closed) { connection.Close(); } } // End Using trans } // End Using connection } // End Sub DeleteLargeObject