欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

在 PostgreSQL中解決圖片二進(jìn)制數(shù)據(jù)由于bytea_output參數(shù)問(wèn)題導(dǎo)致顯示不正常的問(wèn)題

 更新時(shí)間:2024年03月25日 09:22:58   作者:伍華聰  
無(wú)論 bytea_output 參數(shù)設(shè)置為 hex 還是 escape,你都可以通過(guò) C# 訪問(wèn) PostgreSQL 數(shù)據(jù)庫(kù),并且正常獲取并顯示圖片,本篇隨筆介紹這個(gè)問(wèn)題的處理過(guò)程,感興趣的朋友跟隨小編一起看看吧

在 PostgreSQL 中,bytea_output 參數(shù)控制在查詢(xún)結(jié)果中 bytea 類(lèi)型的顯示格式。默認(rèn)情況下,bytea_output 的值為 hex,這意味著在查詢(xún)結(jié)果中,bytea 類(lèi)型的數(shù)據(jù)以十六進(jìn)制格式顯示。但是,如果你的應(yīng)用程序期望以二進(jìn)制格式獲取圖像數(shù)據(jù),則將 bytea_output 設(shè)置為 escape 可能更適合。無(wú)論 bytea_output 參數(shù)設(shè)置為 hex 還是 escape,你都可以通過(guò) C# 訪問(wèn) PostgreSQL 數(shù)據(jù)庫(kù),并且正常獲取并顯示圖片。本篇隨筆介紹這個(gè)問(wèn)題的處理過(guò)程。

在 PostgreSQL 中,bytea_output 參數(shù)控制在查詢(xún)結(jié)果中 bytea 類(lèi)型的顯示格式。默認(rèn)情況下,bytea_output 的值為 hex,這意味著在查詢(xún)結(jié)果中,bytea 類(lèi)型的數(shù)據(jù)以十六進(jìn)制格式顯示。但是,如果你的應(yīng)用程序期望以二進(jìn)制格式獲取圖像數(shù)據(jù),則將 bytea_output 設(shè)置為 escape 可能更適合。無(wú)論bytea_output參數(shù)設(shè)置為hex還是escape,你都可以通過(guò) C# 訪問(wèn) PostgreSQL 數(shù)據(jù)庫(kù),并且正常獲取并顯示圖片。本篇隨筆介紹這個(gè)問(wèn)題的處理過(guò)程。

1、碰到的數(shù)據(jù)庫(kù)圖片在界面顯示問(wèn)題

在我們的Winform框架中,由于底層是支持多種數(shù)據(jù)庫(kù)的設(shè)計(jì),因此可以兼容MS SQLServer、Oracle、Mysql、PostgreSQL、SQLite等數(shù)據(jù)庫(kù)的,但是一般我們用的是SQLServer、MySql居多,有客戶(hù)切換到PostgreSQL數(shù)據(jù)庫(kù)的時(shí)候,發(fā)現(xiàn)圖片顯示不正常,需要對(duì)圖片進(jìn)行十六進(jìn)制轉(zhuǎn)換才能正常顯示。

默認(rèn)的方式,這里方框在SQLServer等數(shù)據(jù)庫(kù)上是正常顯示圖標(biāo)的,打開(kāi)編輯也是可以展示菜單的圖表的,不過(guò)由于切換到PostgreSQL后,這里圖標(biāo)消失,檢查數(shù)據(jù)庫(kù)操作,默認(rèn)的處理都是一致的,因此考慮是否為數(shù)據(jù)庫(kù)參數(shù)配置問(wèn)題。

2、解決問(wèn)題

打開(kāi)ChatGPT,或者百度、Google一下,細(xì)心都可以發(fā)現(xiàn),在 PostgreSQL 中默認(rèn)情況下,bytea_output 的值為 hex,這意味著在查詢(xún)結(jié)果中,bytea 類(lèi)型的數(shù)據(jù)以十六進(jìn)制格式顯示。如果你的應(yīng)用程序期望以二進(jìn)制格式獲取圖像數(shù)據(jù),則將 bytea_output 設(shè)置為 escape 可能更適合。

我們找到PostgreSQL的安裝目錄,找到 C:\Program Files\PostgreSQL\13\data\postgresql.conf里面的數(shù)據(jù)庫(kù)配置文件,找到bytea_output的值查看。

果然發(fā)現(xiàn)其默認(rèn)值為hex,我們按要求修改為escape,并去掉注釋符號(hào)#,如下所示。

重啟PostgreSQL,并測(cè)試系統(tǒng)數(shù)據(jù)庫(kù),顯示和保存處理正常。

3、兩種方式處理的差異

如果 bytea_output 參數(shù)設(shè)置為 hex,你可以通過(guò)將讀取到的十六進(jìn)制字符串轉(zhuǎn)換為字節(jié)數(shù)組,然后使用這些字節(jié)數(shù)組來(lái)創(chuàng)建圖像對(duì)象。以下是一個(gè)示例代碼,演示了如何在 C# 中獲取并顯示圖片,即使 bytea_output 參數(shù)設(shè)置為 hex

class Program
{
    static void Main()
    {
        string connString = "Host=myServerAddress;Port=myPort;Username=myUsername;Password=myPassword;Database=myDatabase";
        using (var conn = new NpgsqlConnection(connString))
        {
            conn.Open();
            // 執(zhí)行 SQL 查詢(xún)以獲取圖像數(shù)據(jù)
            string sql = "SELECT image_column FROM your_table WHERE id = @id";
            int id = 1; // 替換為你要查詢(xún)的圖像的 ID
            using (var cmd = new NpgsqlCommand(sql, conn))
            {
                cmd.Parameters.AddWithValue("@id", id);
                // 讀取圖像數(shù)據(jù)
                using (var reader = cmd.ExecuteReader(CommandBehavior.SequentialAccess))
                {
                    if (reader.Read())
                    {
                        // 獲取十六進(jìn)制字符串
                        string hexString = reader.GetString(0);
                        // 將十六進(jìn)制字符串轉(zhuǎn)換為字節(jié)數(shù)組
                        byte[] imageData = StringToByteArray(hexString);
                        // 創(chuàng)建圖像對(duì)象
                        using (MemoryStream ms = new MemoryStream(imageData))
                        {
                            Image image = Image.FromStream(ms);
                            // 顯示圖像
                            ShowImage(image);
                        }
                    }
                }
            }
        }
    }
    static void ShowImage(Image image)
    {
        // 創(chuàng)建一個(gè)新的窗體
        using (var form = new System.Windows.Forms.Form())
        {
            // 創(chuàng)建 PictureBox 控件
            var pictureBox = new System.Windows.Forms.PictureBox();
            pictureBox.Dock = System.Windows.Forms.DockStyle.Fill;
            pictureBox.Image = image;
            // 將 PictureBox 添加到窗體中
            form.Controls.Add(pictureBox);
            // 設(shè)置窗體大小并顯示
            form.Size = new System.Drawing.Size(image.Width, image.Height);
            form.ShowDialog();
        }
    }
    static byte[] StringToByteArray(string hex)
    {
        int NumberChars = hex.Length / 2;
        byte[] bytes = new byte[NumberChars];
        using (var sr = new StringReader(hex))
        {
            for (int i = 0; i < NumberChars; i++)
                bytes[i] = Convert.ToByte(new string(new char[2] { (char)sr.Read(), (char)sr.Read() }), 16);
        }
        return bytes;
    }
}

如果 bytea_output 參數(shù)設(shè)置為 escape,則可以直接使用 Npgsql 從數(shù)據(jù)庫(kù)中讀取圖像數(shù)據(jù),并將其轉(zhuǎn)換為字節(jié)數(shù)組,而不需要進(jìn)行額外的處理。以下是示例代碼:

using Npgsql;
using System;
using System.Data;
using System.Drawing;
using System.IO;
class Program
{
    static void Main()
    {
        string connString = "Host=myServerAddress;Port=myPort;Username=myUsername;Password=myPassword;Database=myDatabase";
        using (var conn = new NpgsqlConnection(connString))
        {
            conn.Open();
            // 執(zhí)行 SQL 查詢(xún)以獲取圖像數(shù)據(jù)
            string sql = "SELECT image_column FROM your_table WHERE id = @id";
            int id = 1; // 替換為你要查詢(xún)的圖像的 ID
            using (var cmd = new NpgsqlCommand(sql, conn))
            {
                cmd.Parameters.AddWithValue("@id", id);
                // 讀取圖像數(shù)據(jù)
                using (var reader = cmd.ExecuteReader(CommandBehavior.SequentialAccess))
                {
                    if (reader.Read())
                    {
                        // 獲取圖像數(shù)據(jù)字節(jié)數(shù)組
                        byte[] imageData = (byte[])reader["image_column"];
                        // 創(chuàng)建圖像對(duì)象
                        using (MemoryStream ms = new MemoryStream(imageData))
                        {
                            Image image = Image.FromStream(ms);
                            // 顯示圖像
                            ShowImage(image);
                        }
                    }
                }
            }
        }
    }
    static void ShowImage(Image image)
    {
        // 創(chuàng)建一個(gè)新的窗體
        using (var form = new System.Windows.Forms.Form())
        {
            // 創(chuàng)建 PictureBox 控件
            var pictureBox = new System.Windows.Forms.PictureBox();
            pictureBox.Dock = System.Windows.Forms.DockStyle.Fill;
            pictureBox.Image = image;
            // 將 PictureBox 添加到窗體中
            form.Controls.Add(pictureBox);
            // 設(shè)置窗體大小并顯示
            form.Size = new System.Drawing.Size(image.Width, image.Height);
            form.ShowDialog();
        }
    }
}

無(wú)論 bytea_output 參數(shù)設(shè)置為 hex 還是 escape,你都可以通過(guò) C# 訪問(wèn) PostgreSQL 數(shù)據(jù)庫(kù),并且正常獲取并顯示圖片。

到此這篇關(guān)于在 PostgreSQL 中解決圖片二進(jìn)制數(shù)據(jù)由于bytea_output參數(shù)問(wèn)題導(dǎo)致顯示不正常的問(wèn)題的文章就介紹到這了,更多相關(guān)PostgreSQL內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • SQL Server數(shù)據(jù)遷移至PostgreSQL出錯(cuò)的解釋以及解決方案

    SQL Server數(shù)據(jù)遷移至PostgreSQL出錯(cuò)的解釋以及解決方案

    最近對(duì)SQL Server到PostgreSQL的數(shù)據(jù)遷移時(shí)出現(xiàn)了問(wèn)題,返回的錯(cuò)誤為:invalid byte sequence for encoding "UTF8": 0x00。經(jīng)查證pg源代碼,該問(wèn)題引起的原因是sql server的字符類(lèi)型字段中含有空字符\0,該字符在pg中不支持。
    2014-09-09
  • phpPgAdmin 常見(jiàn)錯(cuò)誤和問(wèn)題的解決辦法

    phpPgAdmin 常見(jiàn)錯(cuò)誤和問(wèn)題的解決辦法

    這篇文章主要介紹了phpPgAdmin 常見(jiàn)錯(cuò)誤和問(wèn)題的解決辦法,如安裝錯(cuò)誤、登陸錯(cuò)誤、轉(zhuǎn)儲(chǔ)功能、其它錯(cuò)誤和問(wèn)題等,需要的朋友可以參考下
    2014-03-03
  • PostgreSQL如何根據(jù)字符串的長(zhǎng)度排序

    PostgreSQL如何根據(jù)字符串的長(zhǎng)度排序

    在PostgreSQL數(shù)據(jù)庫(kù)中,可以通過(guò)LENGTH函數(shù)獲取字符串的長(zhǎng)度,并據(jù)此進(jìn)行排序,LENGTH函數(shù)會(huì)計(jì)算并返回字符串的字符數(shù)量,要根據(jù)字符串長(zhǎng)度進(jìn)行升序排序,可以在SQL查詢(xún)中直接使用LENGTH函數(shù),本文介紹PostgreSQL如何根據(jù)字符串的長(zhǎng)度排序,感興趣的朋友一起看看吧
    2024-11-11
  • PostgreSQL怎么創(chuàng)建分區(qū)表詳解

    PostgreSQL怎么創(chuàng)建分區(qū)表詳解

    數(shù)據(jù)庫(kù)表分區(qū)把一個(gè)大的物理表分成若干個(gè)小的物理表,并使得這些小物理表在邏輯上可以被當(dāng)成一張表來(lái)使用,下面這篇文章主要給大家介紹了關(guān)于PostgreSQL怎么創(chuàng)建分區(qū)表的相關(guān)資料,需要的朋友可以參考下
    2022-06-06
  • PostgreSQL備份和還原命令整理大全

    PostgreSQL備份和還原命令整理大全

    這篇文章主要給大家介紹了關(guān)于PostgreSQL備份和還原命令整理的相關(guān)資料,PostgreSQL是一款非常強(qiáng)大的開(kāi)源數(shù)據(jù)庫(kù)系統(tǒng),提供種類(lèi)繁多的備份選項(xiàng),包括完全備份、增量備份等,需要的朋友可以參考下
    2023-07-07
  • Postgresql分布式插件plproxy的使用詳解

    Postgresql分布式插件plproxy的使用詳解

    這篇文章主要介紹了Postgresql分布式插件plproxy的使用詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2021-01-01
  • SpringBoot連接使用PostgreSql數(shù)據(jù)庫(kù)的方法

    SpringBoot連接使用PostgreSql數(shù)據(jù)庫(kù)的方法

    這篇文章主要介紹了SpringBoot連接使用PostgreSql數(shù)據(jù)庫(kù)的方法,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-01-01
  • postgresql數(shù)據(jù)庫(kù)連接數(shù)和狀態(tài)查詢(xún)操作

    postgresql數(shù)據(jù)庫(kù)連接數(shù)和狀態(tài)查詢(xún)操作

    這篇文章主要介紹了postgresql數(shù)據(jù)庫(kù)連接數(shù)和狀態(tài)查詢(xún)操作,具有很好的參考價(jià)值,對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2021-02-02
  • PostgreSQL教程(十四):數(shù)據(jù)庫(kù)維護(hù)

    PostgreSQL教程(十四):數(shù)據(jù)庫(kù)維護(hù)

    這篇文章主要介紹了PostgreSQL教程(十四):數(shù)據(jù)庫(kù)維護(hù),本文講解了恢復(fù)磁盤(pán)空間、更新規(guī)劃器統(tǒng)計(jì)、VACUUM和ANALYZE的示例、定期重建索引等內(nèi)容,需要的朋友可以參考下
    2015-05-05
  • 解決postgresql表中的字段名稱(chēng)包含特殊符號(hào)的問(wèn)題

    解決postgresql表中的字段名稱(chēng)包含特殊符號(hào)的問(wèn)題

    這篇文章主要介紹了解決postgresql表中的字段名稱(chēng)包含特殊符號(hào)的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2021-01-01

最新評(píng)論