国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 學(xué)院 > 開(kāi)發(fā)設(shè)計(jì) > 正文

C#將文件保存到數(shù)據(jù)庫(kù)中或者從數(shù)據(jù)庫(kù)中讀取文件

2019-11-18 16:31:32
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

C#將文件保存到數(shù)據(jù)庫(kù)中或者從數(shù)據(jù)庫(kù)中讀取文件
 
在編程中我們常常會(huì)遇到“將文件保存到數(shù)據(jù)庫(kù)中”這樣一個(gè)問(wèn)題,雖然這已不是什么高難度的問(wèn)題,但對(duì)于一些剛剛開(kāi)始編程的朋友來(lái)說(shuō)可能是有一點(diǎn)困難。其實(shí),方法非常的簡(jiǎn)單,只是可能由于這些朋友剛剛開(kāi)始編程不久,一時(shí)沒(méi)有找到方法而已。
 
下面介紹一下使用C#來(lái)完成此項(xiàng)任務(wù)。
 
首先,介紹一下保存文件到數(shù)據(jù)庫(kù)中。
將文件保存到數(shù)據(jù)庫(kù)中,實(shí)際上是將文件轉(zhuǎn)換成二進(jìn)制流后,將二進(jìn)制流保存到數(shù)據(jù)庫(kù)相應(yīng)的字段中。在SQL Server中該字段的數(shù)據(jù)類型是Image,在access中該字段的數(shù)據(jù)類型是OLE對(duì)象。
 //保存文件到SQL Server數(shù)據(jù)庫(kù)中
 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數(shù)據(jù)庫(kù)中

 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()
 //保存客戶端文件到數(shù)據(jù)庫(kù)
      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("http://")-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數(shù)組中
      myCommand.Parameters["@attachfile"].Value=((byte[])fileContent);
      fileStream.Close();
      myCommand.Connection.Open();
      myCommand.ExecuteNonQuery();
      myCommand.Connection.Close();


代碼中的fileName是文件的完整名稱,tableName是要操作的表名稱,fieldName是要保存文件的字段名稱。
 
兩段代碼實(shí)際上是一樣的,只是操作的數(shù)據(jù)庫(kù)不同,使用的對(duì)象不同而已。
 
接著,在說(shuō)說(shuō)將文件從數(shù)據(jù)庫(kù)中讀取出來(lái),只介紹從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();
 
上面的代碼是將保存在數(shù)據(jù)庫(kù)中的文件讀取出來(lái)并保存文fileName指定的文件中。
 
在使用上面的代碼時(shí),別忘了添加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();
這樣修改后,就可以解決朋友們提出的“如果想從數(shù)據(jù)庫(kù)中取出,另存為相應(yīng)的文件時(shí)。如WORD文件另存為XXX.DOC('XXX'為文件名) ”問(wèn)題了。


發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 阳东县| 丘北县| 密山市| 浙江省| 凤翔县| 宁蒗| 湘潭县| 新建县| 宣城市| 满洲里市| 铁岭市| 麦盖提县| 青岛市| 区。| 北票市| 额尔古纳市| 洪湖市| 钟山县| 洮南市| 宝山区| 鹰潭市| 泰州市| 马公市| 阿拉尔市| 手游| 承德市| 台南市| 蒲江县| 夏邑县| 迭部县| 乐安县| 彰化市| 即墨市| 易门县| 乡宁县| 平邑县| 县级市| 保德县| 海城市| 二连浩特市| 兰考县|