C#从数据库读取图片并保存的两种方法

首先我们需要了解以下两种从数据库读取图片并保存的方法:

  1. 将图片转换为二进制保存到数据库中,读取时再将二进制转换为图片;
  2. 在服务器本地保存图片,将本地图片路径保存到数据库中,读取时根据路径从本地读取图片。

下面我们逐一介绍这两种方法。

方法一:将图片转换为二进制保存到数据库中

1.1 保存图片到数据库

首先,我们需要将读取到的图片转换成二进制,然后将二进制数据存储到数据库中。在C#中,我们可以使用MemoryStreamBinaryWriter对象将图片转成二进制数据并保存到数据库中。示例代码如下:

using System.IO;
using System.Data.SqlClient;

// 读取本地图片转成二进制后保存到数据库中
public static void SaveImageToDatabase(string imagePath, int id)
{
    byte[] fileData = null;

    // 读取图片,并将二进制数据保存到 fileData 变量中
    using (FileStream fs = new FileStream(imagePath, FileMode.Open))
    {
        using (MemoryStream ms = new MemoryStream())
        {
            byte[] buffer = new byte[2048];
            int bytesRead;
            while ((bytesRead = fs.Read(buffer, 0, buffer.Length)) > 0)
            {
                ms.Write(buffer, 0, bytesRead);
            }
            fileData = ms.ToArray();
        }

        // 将二进制数据保存到数据库中
        using (SqlConnection conn = new SqlConnection("数据连接字符串"))
        {
            conn.Open();
            using (SqlCommand cmd = new SqlCommand("INSERT INTO ImageTable (ID,ImageData) VALUES (@ID,@ImageData)", conn))
            {
                cmd.Parameters.AddWithValue("@ID", id);
                cmd.Parameters.AddWithValue("@ImageData", fileData);
                cmd.ExecuteNonQuery();
            }
        }
    }
}

1.2 从数据库中读取图片

当我们需要从数据库中读取图片时,我们先读取二进制数据,然后再将二进制数据转换为图片。在C#中,我们可以使用BinaryReaderMemoryStream对象将二进制数据转成图片。示例代码如下:

using System.IO;
using System.Data.SqlClient;
using System.Drawing;

// 从数据库中读取二进制数据并转成图片
public static Image GetImageFromDatabase(int id)
{
    byte[] fileData;
    using (SqlConnection conn = new SqlConnection("数据连接字符串"))
    {
        conn.Open();
        using (SqlCommand cmd = new SqlCommand("SELECT ImageData FROM ImageTable WHERE ID=@ID", conn))
        {
            cmd.Parameters.AddWithValue("@ID", id);
            using (SqlDataReader reader = cmd.ExecuteReader())
            {
                if (reader.Read())
                {
                    fileData = (byte[])reader["ImageData"];
                    using (MemoryStream ms = new MemoryStream(fileData))
                    {
                        return Image.FromStream(ms);
                    }
                }
            }
        }
    }
    return null;
}

方法二:在服务器本地保存图片,将本地图片路径保存到数据库中

2.1 保存图片到本地

我们可以在服务器本地建立一个目录用于保存图片,然后将读取到的图片保存到该目录内。在C#中,我们可以使用File.Copy方法实现。示例代码如下:

using System.IO;

// 读取本地图片并保存到本地目录中
public static string SaveImageToLocal(string imagePath, string saveDir)
{
    // 生成保存文件的路径和文件名
    string fileName = Path.GetFileName(imagePath);
    string savePath = Path.Combine(saveDir, fileName);

    // 将文件拷贝到本地目录上
    File.Copy(imagePath, savePath, true);

    return savePath;
}

2.2 保存本地图片路径到数据库中

当我们需要将本地图片路径保存到数据库中时,我们可以使用方法一中介绍的方法将路径转换为二进制数据保存到数据库中。示例代码如下:

using System.IO;
using System.Data.SqlClient;

// 将本地图片路径保存到数据库中
public static void SaveImagePathToDatabase(string imagePath, int id)
{
    // 将路径转换成二进制数据
    byte[] fileData = Encoding.UTF8.GetBytes(imagePath);

    // 将二进制数据保存到数据库中
    using (SqlConnection conn = new SqlConnection("数据连接字符串"))
    {
        conn.Open();
        using (SqlCommand cmd = new SqlCommand("INSERT INTO ImageTable (ID,ImagePathData) VALUES (@ID,@ImagePathData)", conn))
        {
            cmd.Parameters.AddWithValue("@ID", id);
            cmd.Parameters.AddWithValue("@ImagePathData", fileData);
            cmd.ExecuteNonQuery();
        }
    }
}

2.3 从数据库中读取本地图片路径

当我们需要从数据库中读取本地图片路径时,我们可以使用方法一中介绍的方法将二进制数据转换为路径。示例代码如下:

using System.IO;
using System.Data.SqlClient;

// 从数据库中读取本地图片路径
public static string GetImagePathFromDatabase(int id)
{
    byte[] fileData;
    using (SqlConnection conn = new SqlConnection("数据连接字符串"))
    {
        conn.Open();
        using (SqlCommand cmd = new SqlCommand("SELECT ImagePathData FROM ImageTable WHERE ID=@ID", conn))
        {
            cmd.Parameters.AddWithValue("@ID", id);
            using (SqlDataReader reader = cmd.ExecuteReader())
            {
                if (reader.Read())
                {
                    fileData = (byte[])reader["ImagePathData"];
                    return Encoding.UTF8.GetString(fileData);
                }
            }
        }
    }
    return null;
}

这就是从数据库读取图片并保存的两种方法的完整攻略了。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C#从数据库读取图片并保存的两种方法 - Python技术站

(0)
上一篇 2023年6月2日
下一篇 2023年6月2日

相关文章

  • Spring.Net IOC依赖注入原理流程解析

    下面是对于“Spring.Net IOC依赖注入原理流程解析”的详细讲解: 1. 什么是IOC? IOC 全称是 Inversion of Control,即控制反转。 意思是将原本由程序员编码决定的对象间调用关系,通过外部配置文件描述,交由 Spring.Net 框架来管理和实现。 Spring.Net 提供的 IOC 叫做 Dependency Inje…

    C# 2023年6月3日
    00
  • c# 如何使用结构体实现共用体

    下面是一个详细讲解“C# 如何使用结构体实现共用体”的攻略: 什么是共用体 共用体(Union)是一种特殊的数据类型,它允许在同一内存位置存储不同的数据类型。共用体的大小为其最大成员的大小。 在 C 和 C++ 语言中,我们可以用共用体来实现一个拥有多种数据类型的变量。例如,我们可以定义一个名称为 myUnion 的共用体,它拥有一个整型变量和一个浮点型变量…

    C# 2023年6月6日
    00
  • 使用 BenchmarkDotNet 对 C# 代码进行基准测试

    以下是使用 BenchmarkDotNet 对 C# 代码进行基准测试的完整攻略。 什么是 BenchmarkDotNet? BenchmarkDotNet 是一个用于 .NET 应用程序的基准测试框架。它允许你轻松地编写、运行和分析基准测试代码,以衡量代码性能和稳定性,从而帮助你做出优化决策。 如何使用 BenchmarkDotNet 进行基准测试? 首先…

    C# 2023年6月3日
    00
  • Asp.net通过SignalR2进行实时聊天

    下面我将详细讲解“Asp.net通过SignalR2进行实时聊天”的完整攻略,包括如何使用SignalR2构建一个简单的实时聊天程序。 SignalR2是什么? SignalR2 是一个基于 ASP.NET 的开源框架,用于实时 Web 应用程序。它使得实时通讯变得简单,可以实现实时的消息推送、实时的服务器推送以及实时的交互等。 步骤 下面将以 Visual…

    C# 2023年6月3日
    00
  • C#实现多线程编程的简单案例

    下面是 C# 实现多线程编程的简单案例的攻略,分为以下几个步骤: 1. 确定需求及问题 在开始之前,需要确定要实现的需求和问题,这样才能更有针对性地编写代码。例如,本次案例要实现的问题可能是:在一个列表中,同时处理多个元素的计算任务,并等待所有计算任务完成后,将结果汇总并输出。 2. 创建多线程 在确定了需求和问题后,需要使用 C# 中的多线程机制来实现。创…

    C# 2023年5月15日
    00
  • C#中 Json 序列化去掉null值的方法

    下面是详细的“C#中Json序列化去掉null值的方法”的攻略: 一、背景介绍 在使用C#中的Json序列化方式时,如果对象中存在null值,那么默认情况下在序列化过程中也会把该属性序列化成null。但是,在某些情况下,我们希望只序列化非null的属性,那么我们就需要找到一种方法来去掉null值的序列化。下面就为大家介绍几种去掉null值的Json序列化方法…

    C# 2023年5月31日
    00
  • C# DataSet查看返回结果集的实现

    以下是关于“C# DataSet 查看返回结果集的实现”完整攻略的讲解。 什么是 DataSet 首先需要了解什么是 DataSet。DataSet 是 C# 中的一种数据类型,用于表示一组数据集合。DataSet 可以包含多个 DataTable,每个 DataTable 可以包含多个 DataColumn,每个 DataColumn 可以有自己的数据类型…

    C# 2023年5月15日
    00
  • c#中将uint值转换成int的实例方法

    将uint值转换成int的方法有多种,其中一种常用的方法是将uint值强制转换成int类型。这种方法可以利用unchecked代码块确保不会引发数值溢出。 下面是实现这种方法的代码示例: uint uintValue = 1234567890; int intValue = unchecked((int)uintValue); 在上面的代码示例中,我们首先将…

    C# 2023年5月15日
    00
合作推广
合作推广
分享本页
返回顶部