c# 將檔案存入到Oracle 資料庫,從資料庫中讀取檔案
阿新 • • 發佈:2022-05-30
1 思路
儲存的時候將檔案轉成二進位制,講資料庫欄位設為 BLOB ,
查詢的時候 使用file 物件,建立檔案
2. 檔案儲存
原生寫法(將檔案轉成二進位制儲存到資料庫中,因為我只使用excel檔案,所以我此處並未儲存檔名,如果要儲存各種檔案,請儲存檔名,以便區分檔案格式)
點選檢視程式碼
OracleConnection con = OpenConn("資料庫連結串"); //OracleConnection con =new OracleConnection(ConfigurationManager.AppSettings["LiZhenRpt"]); FileStream fs = File.OpenRead(file); byte[] imgData = new byte[fs.Length]; //WriteLogs("log", "info", "檔案長度:" + imgData.Length); fs.Read(imgData, 0, imgData.Length); String dateStr = cdt.targetDate(cdt.date, 0); string strInsert = $"insert into LEDRPT.ZANALYSISIMAGES(IID,IMAGE,TYPE) values('{dateStr}',:image,'DailyReportMails')"; com = new OracleCommand(strInsert, con); OracleParameter oracleParameter = new OracleParameter("image", OracleDbType.Blob); oracleParameter.Value = imgData; com.Parameters.Add(oracleParameter); com.ExecuteScalar(); //WriteLogs("log", "info", "資料庫插入成功!:" + imgData.Length); fs.Close(); con.Close();
3. 檔案讀取
點選檢視程式碼
//獲取指定檔案路徑 dealDirectory = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "repoprt"); //如果檔案路徑不存在就建立 if(!Directory.Exists(dealDirectory)) { Directory.CreateDirectory(dealDirectory); } dealFileName = "【" + DateTime.Now.ToString("yyyyMMddHHmmss") + "】Report.xlsx"; String iid = cdt.targetDate(cdt.date, 0); //iid = "2021-12-06 8:00:00"; String xlsxFile = $@"SELECT IMAGE FROM LEDRPT.ZANALYSISIMAGES WHERE IID = '{iid}' AND ""TYPE"" = 'DailyReportMails' AND rownum = 1"; con = OpenConn(ConfigurationManager.AppSettings["LiZhenRpt"]); //用oracleLob型別的物件來接收,因為將返回值強制轉換為位元組陣列會報錯 com = new OracleCommand(xlsxFile, con); byte[] arr = (byte[])com.ExecuteScalar(); //stream.Read(imageData, 0, imageData.Length); CloseConn(con); String finalFile = dealDirectory + @"\" + dealFileName; FileStream f = File.Create(finalFile); f.Write(arr, 0, arr.Length); f.Flush(); f.Close();
4.進階思路
可以使用dapper 的物件對映來實現更高解的寫法
點選檢視程式碼
repositry.execute("insert into LEDRPT.ZANALYSISIMAGES(IID,IMAGE,TYPE) values('2022-05-22 00:00:00',:image,'DailyReportMails')",new demo{
image = imgData
})