C#中获得GUID和Image类型的数据方法,并进行图片存储,还原

这些天正好学习C#,碰到往数据库中插入GUID,IMAGE类型的数据问题,BAIDU了下,找到了解决方法.
1.GUID
插入数据库时:
string guid=System.Guid.NewGuid().ToString();//或System.Guid.Empty.ToString();
//添加主键
SqlParameter fd = new SqlParameter("@字段名", SqlDbType.UniqueIdentifier, 16);
fd.Value = new Guid(guid);
cmd.Parameters.Add(fd);
从数据库获取时:
using (System.Data.IDataReader reader = cmd.ExecuteReader())
if (reader.Read()){
string id = reader["字段名"];
}


2.img
MemoryStream ms = new MemoryStream();
// 重要!!保存成文件流
pictureBox1.Image.Save("a.bmp");
FileStream fileStream = new FileStream("a.bmp", FileMode.Open, FileAccess.Read);
BinaryReader binaryReader = new BinaryReader(fileStream);
byte[] img = binaryReader.ReadBytes((int)fileStream.Length);
binaryReader.Close();
fileStream.Close();
这个img就是我们需要的

除此之外,还可能需要将图片文件转为Base64格式
例如:

//从pictureBox中获得文件,并保存,这里的格式可自定义
pictureBox1.Image.Save("a.gif");
FileStream fileStream1 = new FileStream("a.gif", FileMode.Open, FileAccess.Read);
byte[] inputBytes1 = new byte[fileStream1.Length];
fileStream1.Read(inputBytes1, 0, System.Convert.ToInt32(fileStream1.Length));
//自定义文件类
TestWork.File file1 = new TestWork.File();
//图片的Guid
file1.FileMainID = guid;
//二进制的图片
file1.Data = inputBytes1;
//二进制数组的长度
file1.Length = inputBytes1.Length;
//调用方法
InsertNormalFileData(file1);

/// <summary>
/// 插入文件
/// </summary>
/// <param name="file">文件对象</param>
/// <param name="databaseName">库名</param>
/// <returns></returns>
private static bool InsertFileData(TestWork.File file, string databaseName)
{
//创建连接对象
SqlConnection con = null;

try
{
//获取连接对象
con = CreateDataBase(databaseName);
//打开连接
con.Open();

//转换格式的converter
System.Text.UnicodeEncoding converter = new System.Text.UnicodeEncoding();

//创建SqlCommand实例
SqlCommand cmd = con.CreateCommand();

//调用存储过程,察看指定文件是否已经存在
cmd.CommandText = "XXXXXXXX";

//添加主键:File_Main_ID
SqlParameter fileMainID = new SqlParameter("@FILE_MAIN_ID", SqlDbType.UniqueIdentifier, 16);
fileMainID.Value = new Guid(file.FileMainID);
cmd.Parameters.Add(fileMainID);

//声明命令类型为存储过程
cmd.CommandType = CommandType.StoredProcedure;

//获得返回对象
SqlDataReader dr = cmd.ExecuteReader();

//判断文件是否存在
if (dr.Read())
{
//抛出异常
throw new Exception("指定的文件编号已经存在!");
}
//关闭对象
dr.Close();

//创建新实例
//SqlCommand cmd = con.CreateCommand();
//调用Sp插入文件,insert into
cmd.CommandText = "XXXXXXXXXXXXXXX";
cmd.CommandType = CommandType.StoredProcedure;

//创建文件编号对象
//SqlParameter fileMainID = new SqlParameter("@FILE_MAIN_ID", SqlDbType.UniqueIdentifier, 16);
//fileMainID.Value = new Guid(file.FileMainID);

//创建文件内容对象
//第三个参数为文件大小
SqlParameter data = new SqlParameter("@DATA", SqlDbType.Image,file.Data.Length);
//转化二进制为Base64
data.Value = converter.GetBytes(System.Convert.ToBase64String(file.Data));
data.Value = file.Data;

//创建文件大小对象
SqlParameter length = new SqlParameter("@DATA_LENGTH", SqlDbType.Int, 4);
length.Value = file.Length;

//添加参数
//cmd.Parameters.Add(fileMainID);
cmd.Parameters.Add(data);
cmd.Parameters.Add(length);

//执行插入操作
int i = cmd.ExecuteNonQuery();

//返回是否插入成功
return i > 0;
}
catch
{
//抛出异常
throw new Exception("插入文件处理中发生异常");
}
finally
{
if (con != null)
{
//关闭数据库连接
con.Close();
}
}
}
还原图片文件


/// <summary>
/// 获取原始文件
/// </summary>
/// <param name="fileMainID">文件编号</param>
/// <returns>文件实体</returns>
public static TestWork.File GetNormalFileData(string fileMainID)
{
//创建连接对象
SqlConnection con = null;

try
{
//获取连接对象
con = CreateDataBase(fileMainID);
//打开连接
con.Open();

//将Base64转换为二进制
System.Text.UnicodeEncoding converter = new System.Text.UnicodeEncoding();

//创建SqlCommand实例
SqlCommand cmd = con.CreateCommand();

//调用存储过程,获取文件内容
cmd.CommandText = "XXXXXXXXXXXXXXX";

//添加主键:File_Main_ID
SqlParameter fd = new SqlParameter("@FILE_MAIN_ID", SqlDbType.UniqueIdentifier, 16);
fd.Value = new Guid(fileMainID);
cmd.Parameters.Add(fd);

//声明命令类型为存储过程
cmd.CommandType = CommandType.StoredProcedure;

//执行查询操作,获得返回对象
using (System.Data.IDataReader reader = cmd.ExecuteReader())

//察看是否获得指定File_Main_ID对应的文件
if (reader.Read())
{
//创建文件对象
TestWork.File file = new TestWork.File();

//获取文件编号
file.FileMainID = fileMainID;

System.Text.UnicodeEncoding converter = new System.Text.UnicodeEncoding();

//获取文件内容
string da = converter.GetString((byte[])reader["Data"]);
//转换为二进制,用于判断格式和还原
file.Data = Convert.FromBase64String(da);

//获取文件大小
file.Length = (int)reader["Data_Length"];

//获取图片文件类型
file.FormatType = GetFileImageFormat(file.Data);

//返回文件
return file;
}
//如果没有指定的文件
else
{
//返回null对象
return null;
}
}
catch
{
//抛出异常
throw new Exception("获取原始文件处理中发生异常");
}
finally
{
if (con != null)
{
//关闭数据库连接
con.Close();
}
}
}

//判定图片格式
private static TestWork.ImageFormat GetFileImageFormat(byte[] buffer)
{
//数据有效性检查
if (buffer == null || buffer.Length < 2)
{
return TestWork.ImageFormat.Other;
}

//根据文件头判断
string strFlag = buffer[0].ToString() + buffer[1].ToString();

//察看格式类型
switch (strFlag)
{
//JPG格式
case "255216":
return TestWork.ImageFormat.Jpg;
//GIF格式
case "7173":
return TestWork.ImageFormat.Gif;
//BMP格式
case "6677":
return TestWork.ImageFormat.Bmp;
//PNG格式
case "13780":
return TestWork.ImageFormat.Png;
//其他格式
default:
return TestWork.ImageFormat.Other;
}
}
/// <summary>
/// 文件还原
/// </summary>
/// <param name="file">文件对象</param>
/// <returns></returns>
public void FileRecovery(TestWork.File file)
{
//保存的路径
string path = @"c:\pics\";
string outfile = System.IO.Path.GetDirectoryName(path) + file.FileMainID + "." + file.FormatType;
FileStream fs = new FileStream(outfile, FileMode.OpenOrCreate, FileAccess.Write);
fs.Write(file.Data, 0, file.Data.Length);
fs.Close();
}

自定义文件类
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace TestWork
{
public enum ImageViewType { Normal, Thumbs };
public enum ImageFormat { Other, Jpg, Gif, Png, Bmp };
[Serializable]
//文件对象结构定义
public class File
{
//文件编号
public string FileMainID;
//图片类型格式
public ImageFormat FormatType;
//文件大小
public int Length = -1;
//文件内容
public byte[] Data = null;
}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值