sql?server實(shí)現(xiàn)圖片的存入和讀取的流程詳解
首先提醒一下,無論是將圖片存入數(shù)據(jù)庫,還是從數(shù)據(jù)庫中讀取,都是采用流的形式進(jìn)行,雖然,在數(shù)據(jù)庫中,存儲(chǔ)圖片的類型是Image,但是sql中的Image和C#中的Image不一樣,就如同sql中的null的判斷在C#中得用DBNULL來判斷
先看窗體設(shè)計(jì),很簡單,一共就五個(gè)控件,名字都沒改,pictureBox1,textBox1,button1,button2,button3(依次從上到下,從左到右),看源碼的時(shí)候會(huì)看到的
數(shù)據(jù)庫中表的設(shè)計(jì)
就一個(gè)Image
首先程序運(yùn)行,可以先選擇一張圖片
文本框中是圖片在本地磁盤上的路徑,在此掩蓋部分
然后點(diǎn)擊,存入數(shù)據(jù)庫
提示存入成功
在此,將窗體關(guān)閉,重新打開,讀取圖片。
至于為什么這么做看到源碼就知道了
重新打開后的
點(diǎn)擊從數(shù)據(jù)庫中讀取按鈕
拿到了剛才存入的圖片
源碼:
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Data.SqlClient; using System.Drawing; using System.IO; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; namespace 讀取數(shù)據(jù)庫中的圖片 { public partial class Form1 : Form { public Form1() { InitializeComponent(); } /// <summary> /// 選擇圖片 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void button1_Click(object sender, EventArgs e) { //初始化打開文件 對話框 OpenFileDialog ofdlgTest = new OpenFileDialog(); ofdlgTest.Filter = "*.jpg|*.png"; //文件過濾 篩選可以打開的文件 ofdlgTest.Multiselect = false; //設(shè)置不可以選擇多個(gè)文件 //顯示文件打開對話框 DialogResult result = ofdlgTest.ShowDialog(); //選擇打開按鈕的時(shí)候,將文件名顯示到文本框中 if (result== DialogResult.OK) //判斷是否打開文件 { this.textBox1.Text = ofdlgTest.FileName; pictureBox1.Image = Image.FromFile(ofdlgTest.FileName); } } /// <summary> /// 存入數(shù)據(jù)庫 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void button2_Click(object sender, EventArgs e) { string constr = "Data Source=.;Initial Catalog=MyFirstDatabase;User Id=sa;PassWord=91811372c"; using(SqlConnection con=new SqlConnection(constr)) { //sql語句 插入圖片 string sql = "insert into ImageTest values(@UserImage)"; using(SqlCommand com=new SqlCommand(sql,con)) { byte[] buffer; //將圖片轉(zhuǎn)換為字節(jié)數(shù)組 存入數(shù)據(jù)庫 textBox1.Text 是文件的路徑 using(FileStream stream = new FileStream(textBox1.Text, FileMode.OpenOrCreate, FileAccess.Read)) { //通過文件路徑 打開文件 buffer = new byte[stream.Length]; stream.Read(buffer, 0, buffer.Length); //轉(zhuǎn)換后 ,存入buffer中 } //這個(gè)參數(shù) 其實(shí) 也沒必要聲明 不過習(xí)慣使用 帶參數(shù)的sql語句了 SqlParameter pms = new SqlParameter("@UserImage", SqlDbType.Image) { Value = buffer }; com.Parameters.Add(pms); con.Open(); string msg = com.ExecuteNonQuery()>0?"存入成功":"存入失敗"; MessageBox.Show(msg); } } } /// <summary> /// 從數(shù)據(jù)庫中讀取 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void button3_Click(object sender, EventArgs e) { string conStr = "Data Source=.;Initial Catalog=MyFirstDatabase;User Id=sa;PassWord=自己的密碼"; using(SqlConnection con=new SqlConnection(conStr)) { //sql語句 string sql = "select * from ImageTest"; using (SqlCommand com = new SqlCommand(sql, con)) { con.Open(); using(SqlDataReader reader=com.ExecuteReader()) { if (reader.HasRows) { //聲明一字節(jié)數(shù)組 將數(shù)據(jù)庫中的圖片現(xiàn)存入字節(jié)數(shù)組中 byte[] imageByte; //在這我是知道里面就一張圖,所以這么寫的,個(gè)人根據(jù)實(shí)際情況,可做修改 while(reader.Read()) { //將圖片轉(zhuǎn)換為字節(jié)數(shù)組 imageByte = (byte[])reader["UserImage"]; //轉(zhuǎn)換為文件流 MemoryStream stream = new MemoryStream(imageByte); //再將文件流 轉(zhuǎn)換為 圖像 Bitmap bitmap = new Bitmap(stream); pictureBox1.Image = bitmap; } } } } } } } }
到此這篇關(guān)于sql server實(shí)現(xiàn)圖片的存入和讀取的流程詳解的文章就介紹到這了,更多相關(guān)sql server圖片存入和讀取內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
動(dòng)態(tài)SQL中返回?cái)?shù)值的實(shí)現(xiàn)代碼
最近在做一個(gè)paypal抓取數(shù)據(jù)的程序,由于所有字段和paypal之間存在對應(yīng)映射的關(guān)系,所以所有的sql語句必須得拼接傳到存儲(chǔ)過程里去執(zhí)行2011-12-12SQLSERVER查看數(shù)據(jù)庫日志方法與語句示例代碼(已親測)
在數(shù)據(jù)庫使用很久后日志文件會(huì)累計(jì)的越來越大,如果硬盤空間不足可能會(huì)導(dǎo)致宕機(jī),下面這篇文章主要給大家介紹了關(guān)于SQLSERVER查看數(shù)據(jù)庫日志方法與語句的相關(guān)資料,需要的朋友可以參考下2023-03-03你真的了解觸發(fā)器么 數(shù)據(jù)實(shí)時(shí)同步更新問題剖析
觸發(fā)器就是我們想要的神器了。我們可以在那張動(dòng)態(tài)表上新建觸發(fā)器。觸發(fā)器的實(shí)質(zhì)就是個(gè)存儲(chǔ)過程,只不過他調(diào)用的時(shí)間是根據(jù)所建的動(dòng)態(tài)表發(fā)生該表而執(zhí)行(即:Insert新數(shù)據(jù),Update或者Delete數(shù)據(jù))具體怎么使用觸發(fā)器,今天我這里就不介紹了2013-01-01如何解決在Azure上部署Sqlserver網(wǎng)絡(luò)訪問不了
這篇文章主要介紹了如何解決在Azure上部署Sqlserver網(wǎng)絡(luò)訪問不了的相關(guān)資料,需要的朋友可以參考下2015-10-10mssql無數(shù)據(jù)庫日志文件恢復(fù)數(shù)據(jù)庫的方法
因各種原因我們需要注意恢復(fù)數(shù)據(jù)庫,如果剛好有沒有數(shù)據(jù)庫日志文件,那就不妨用下面的方法2008-09-09SQL 復(fù)合查詢條件(AND,OR,NOT)對NULL值的處理方法
在SQL的3值邏輯下,一個(gè)查詢條件可以產(chǎn)生以下三種情況:TRUE,FALSE,NULL。只有那些滿足WHERE子句的值是TRUE的記錄才出現(xiàn)在結(jié)果表中。2011-04-04Activiti-Explorer使用sql server數(shù)據(jù)庫實(shí)現(xiàn)方法
本文主要介紹Activiti-Explorer使用sql server數(shù)據(jù)庫,這里整理了詳細(xì)的資料來說明Activiti-Explorer使用SQL Server的實(shí)例,有興趣的小伙伴可以參考下2016-08-08