SQL Server如何存储文件,C#如何处理

        对于SQL Server来讲,除了存储一些数值,字符串等的数据之外也可以存储文件,文件一般来说大小都大于8K,所以普通的内容存储不足以存放文件,那么如何将几M或是几十M的文件存放到数据库呢,存放过程是否对文件进行了类型区分呢?

        在SQL Server中存储文件,采用IMAGE数据类型,文件会以字节流的形式存储在数据库上面

create table tb_UploadFile
(
    LoadFileName nvarchar(50) NOT NULL constraint PK_UPLOAD_FILE_NAME primary key,
    DataFileVersion nvarchar(50) NOT NULL, 
    ModifyTime nvarchar(50) NOT NULL,     
    ModifyRole nvarchar(50) NOT NULL,
    ModifyRemark nvarchar(4000) NOT NULL,
    FileContent image NOT NULL,                --定义IMAGE类型数据
    FileSize int NOT NULL,
    FileExtend nvarchar(50) NOT NULL
)

在数据库中构建上述的表格后,开始在C#编写的Winform软件中实现文件上传

构建文件描述界面与文件加载界面,获取文件的详细信息,下来说重点,对于文件来说,无论是什么格式都可以以字节流的形式获取并存储,然后再以字节流的形式进行还原,这样我们就可以以字节流的形式获取到文件内容,并将内容上传至数据库,在获取文件的时候,再以字节流的形式获取文件内容,生成新的文件,注意文件的后缀名成一定要正确,下面见代码:

 //读取文件信息
            FileStream aaa = new FileStream(file_path, FileMode.Open, FileAccess.Read);
            temp_data.FileSize = (int)aaa.Length;
            temp_data.FileContent = new Byte[temp_data.FileSize];       //FileContent,一个数组
            aaa.Read(temp_data.FileContent, 0, temp_data.FileSize);
            aaa.Close();

按照上述操作,将文件内容读取到命名为FileContent的字节数组中,注意要获取文件的后缀名成

temp_data.FileExtend = file_path.Substring(file_path.IndexOf(".") + 1, file_path.Length - file_path.IndexOf(".") - 1);

然后是上传数据库的参数配置代码,注意SqlDbType的类型选择,_para_infor是记录一个文件的详细信息的类的对象,

SqlParameter[] paras = 
                {
                    new SqlParameter("@LoadFileName",SqlDbType.NVarChar,50),
                    new SqlParameter("@DataFileVersion",SqlDbType.NVarChar,50),
                    new SqlParameter("@ModifyTime",SqlDbType.NVarChar,50),
                    new SqlParameter("@ModifyRole",SqlDbType.NVarChar,50),
                    new SqlParameter("@ModifyRemark",SqlDbType.NVarChar,4000),
                    new SqlParameter("@FileContent",SqlDbType.Image),
                    new SqlParameter("@FileSize",SqlDbType.Int),
                    new SqlParameter("@FileExtend",SqlDbType.NVarChar,50)
                };
                paras[0].Value = _para_infor.FileName;
                paras[1].Value = _para_infor.Version;
                paras[2].Value = _para_infor.LastModifyTime;
                paras[3].Value = _para_infor.ModifyPeople;
                paras[4].Value = _para_infor.ModifyRemark;
                paras[5].Value = _para_infor.FileContent;
                paras[6].Value = _para_infor.FileSize;
                paras[7].Value = _para_infor.FileExtend;
                foreach (SqlParameter para in paras)
                {
                    cmd.Parameters.Add(para);
                }

//还原文件,从数据库中获取到文件的内容,通过文件流的形式进行还原,还原时一定要用正确的后缀名称

                FileStream bbb = new FileStream(file_name, FileMode.CreateNew, FileAccess.Write);
                bbb.Write(upload_file_dic[select_str].FileContent, 0, upload_file_dic[select_str].FileSize);
                bbb.Close();

执行上述还原代码后文件还原

从数据库中获取文件相关信息的代码如下

protected void ReadFromUploadFileTable()
        {
            SqlConnection conn = MyDataBase.ConnectDataBase();

            try
            {
                conn.Open();
            }
            catch (Exception ex)
            {
                MessageBox.Show("数据库连接失败\r\n" + ex.ToString());
                conn.Close();
                return;
            }

            SqlCommand my_command = conn.CreateCommand();
            string cmd_str = "SELECT * FROM tb_UploadFile";
            my_command.CommandText = cmd_str;                  //获取指定的SQL语句
            SqlDataReader my_reader = my_command.ExecuteReader();
            upload_file_dic.Clear();
            while (my_reader.Read())
            {
                UploadFile temp_data = new UploadFile();
                temp_data.FileName = my_reader.GetString(0);
                temp_data.Version = my_reader.GetString(1);
                temp_data.LastModifyTime = my_reader.GetString(2);
                temp_data.ModifyPeople = my_reader.GetString(3);
                temp_data.ModifyRemark = my_reader.GetString(4);
                temp_data.FileSize = my_reader.GetInt32(6);
                temp_data.FileContent = new Byte[temp_data.FileSize];
                my_reader.GetBytes(5, 0, temp_data.FileContent, 0, temp_data.FileSize);
                temp_data.FileExtend = my_reader.GetString(7);
                upload_file_dic.Add(temp_data.FileName, temp_data);
            }
            conn.Close();
        }

特别需要注意的是IMAGE格式的数据的获取方式为my_reader.GetBytes(5, 0, temp_data.FileContent, 0, temp_data.FileSize);

这里只描述了文件上传与下载的一种方式和该方式主要的实现方法

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值