zoukankan      html  css  js  c++  java
  • C# 文件保存到数据库中或者从数据库中读取文件

    首先,介绍一下保存文件到数据库中。
    将文件保存到数据库中,实际上是将文件转换成二进制流后,将二进制流保存到数据库相应的字段中。在SQL Server中该字段的数据类型是Image,在Access中该字段的数据类型是OLE对象。

    //保存文件到SQL Server数据库中
    FileInfo fi=new FileInfo(fileName);
    FileStream fs=fi.OpenRead();
    byte[] bytes=new byte[fs.Length];
    fs.Read(bytes,0,Convert.ToInt32(fs.Length));
    SqlCommand cm=new SqlCommand();
    cm.Connection=cn;
    cm.CommandType=CommandType.Text;
    if(cn.State==0) cn.Open();
    cm.CommandText="insert into "+tableName+"("+fieldName+") values(@file)";
    SqlParameter spFile=new SqlParameter("@file",SqlDbType.Image);
    spFile.Value=bytes;
    cm.Parameters.Add(spFile);
    cm.ExecuteNonQuery()
    //保存文件到Access数据库中
    FileInfo fi=new FileInfo(fileName);
    FileStream fs=fi.OpenRead();
    byte[] bytes=new byte[fs.Length];
    fs.Read(bytes,0,Convert.ToInt32(fs.Length));
    OleDbCommand cm=new OleDbCommand();
    cm.Connection=cn;
    cm.CommandType=CommandType.Text;
    if(cn.State==0) cn.Open();
    cm.CommandText="insert into "+tableName+"("+fieldName+") values(@file)";
    OleDbParameter spFile=new OleDbParameter("@file",OleDbType.Binary);
    spFile.Value=bytes;
    cm.Parameters.Add(spFile);
    cm.ExecuteNonQuery()
    //保存客户端文件到数据库
    sql="update t_mail set attachfilename=@attachfilename,attachfile=@attachfile where mailid="+mailid;
    myCommand = new SqlCommand(sql, new SqlConnection(ConnStr));
    string path = fl_name.PostedFile.FileName;
    string filename=path.Substring(path.LastIndexOf("\\")+1,path.Length-path.LastIndexOf("\\")-1);
    myCommand.Parameters.Add("@attachfilename",SqlDbType.VarChar);
    myCommand.Parameters["@attachfilename"].Value=filename;
    myCommand.Parameters.Add("@attachfile",SqlDbType.Image);
    Stream fileStream = fl_name.PostedFile.InputStream;
    int intFileSize = fl_name.PostedFile.ContentLength;
    byte[] fileContent = new byte[intFileSize];
    int intStatus = fileStream.Read(fileContent,0,intFileSize); //文件读取到fileContent数组中
    myCommand.Parameters["@attachfile"].Value=((byte[])fileContent);
    fileStream.Close();
    myCommand.Connection.Open();
    myCommand.ExecuteNonQuery();
    myCommand.Connection.Close();

    代码中的fileName是文件的完整名称,tableName是要操作的表名称,fieldName是要保存文件的字段名称。
    两段代码实际上是一样的,只是操作的数据库不同,使用的对象不同而已。
    接着,在说说将文件从数据库中读取出来,只介绍从SQL Server中读取。

    SqlDataReader dr=null;
    SqlConnection objCn=new SqlConnection();
    objCn.ConnectionString="Data Source=(local);User ID=sa;Password=;Initial Catalog=Test";
    SqlCommand cm=new SqlCommand();
    cm.Connection=cn;
    cm.CommandType=CommandType.Text;
    cm.CommandText="select "+fieldName+" from "+tableName+" where ID=1";
    dr=cm.ExecuteReader();
    byte[] File=null;
    if(dr.Read())
    {
    File=(byte[])dr[0];
    }
    FileStream fs;
    FileInfo fi=new System.IO.FileInfo(fileName);
    fs=fi.OpenWrite();
    fs.Write(File,0,File.Length);
    fs.Close();

    上面的代码是将保存在数据库中的文件读取出来并保存文fileName指定的文件中。
    在使用上面的代码时,别忘了添加System.Data.SqlClient和System.IO引用。
    修改:
    将读文件的下面部分的代码

    FileStream fs;
    FileInfo fi=new System.IO.FileInfo(fileName);
    fs=fi.OpenWrite();
    fs.Write(File,0,File.Length);
    fs.Close();
    修改为
    FileStream fs=new FileStream(fileName,FileMode.CreateNew);
    BinaryWriter bw=new BinaryWriter(fs);
    bw.Write(File,0,File.Length);
    bw.Close();
    fs.Close(); 
  • 相关阅读:
    React生命周期, 兄弟组件之间通信
    React组件式编程Demo-用户的增删改查
    React之this.refs, 实现数据双向绑定
    CCF CSP 201812-4 数据中心
    CCF CSP 201812-4 数据中心
    PAT 顶级 1020 Delete At Most Two Characters (35 分)
    PAT 顶级 1020 Delete At Most Two Characters (35 分)
    Codeforces 1245C Constanze's Machine
    Codeforces 1245C Constanze's Machine
    CCF CSP 201712-4 行车路线
  • 原文地址:https://www.cnblogs.com/colder/p/2579047.html
Copyright © 2011-2022 走看看