对于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);
这里只描述了文件上传与下载的一种方式和该方式主要的实现方法