VS.C#如何向数据数据库中存入和读取图片的?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了VS.C#如何向数据数据库中存入和读取图片的?相关的知识,希望对你有一定的参考价值。

首先,在数据库中要建立相应的字段能保存Bytes,例如在SQL Server中用Image类型来定义字段。我所用到的数据库大致结构如下:

字段名
类型
备注

FileID
Int
自增字段

FileName
Varchar(256)

FullName
Varchar(1024)

FileData
Image

然后就是写入数据库,代码如下:

FileInfo fi = new FileInfo( txtFileName.Text );// Replace with your file name

if ( fi.Exists)



byte[] bData = null;

int nNewFileID = 0;

// Read file data into buffer

using ( FileStream fs = fi.OpenRead() )



bData = new byte[fi.Length];

int nReadLength = fs.Read( bData,0, (int)(fi.Length) );



// Add file info into DB

string strQuery = "INSERT INTO FileInfo "

+ " ( FileName, FullName, FileData ) "

+ " VALUES "

+ " ( @FileName, @FullName, @FileData ) "

+ " SELECT @@IDENTITY AS 'Identity'";

SqlCommand sqlComm = new SqlCommand( strQuery, sqlConn );

sqlComm.Parameters.Add( "@FileName", fi.Name );

sqlComm.Parameters.Add( "@FullName", fi.FullName );

sqlComm.Parameters.Add( "@FileData", bData );

// Get new file ID

SqlDataReader sqlReader = sqlComm.ExecuteReader();

if( sqlReader.Read() )



nNewFileID = int.Parse(sqlReader.GetValue(0).ToString());



sqlReader.Close();

sqlComm.Dispose();

if( nNewFileID > 0 )



// Add new item in list view

ListViewItem itmNew = lsvFileInfo.Items.Add( fi.Name );

itmNew.Tag = nNewFileID;





而读出的代码如下:

// Get new file name

string strFullName = dlgFBSave.SelectedPath;

if( strFullName[strFullName.Length - 1] != '\\' )

strFullName += @"\";

strFullName += lsvFileInfo.SelectedItems[0].Text;

string strQuery = "SELECT FileData FROM FileInfo "

+ " WHERE FileID = " + lsvFileInfo.SelectedItems[0].Tag.ToString();

SqlDataAdapter sqlDAdapter = new SqlDataAdapter(strQuery,sqlConn);

DataSet sqlRecordSet = new DataSet();

byte[] bData = null;

//Get file data from DB

try



sqlDAdapter.Fill( sqlRecordSet, "FileInfo" );

foreach( DataRow dr in sqlRecordSet.Tables["FileInfo"].Rows)



if( dr["FileData"] != DBNull.Value )

bData = ( byte[] )dr["FileData"];





catch(SqlException sqlErr)



MessageBox.Show( sqlErr.Message );



catch



MessageBox.Show( "Failed to read data from DB!" );



sqlRecordSet.Dispose();

sqlDAdapter.Dispose();

if( bData != null )



// Save file

FileInfo fi = new FileInfo( strFullName );

if( !fi.Exists )



//Create the file.

using (FileStream fs = fi.Create())



fs.Write( bData, 0, bData.Length);





else



//Create the file.

using (FileStream fs = fi.OpenWrite())



fs.Write( bData, 0, bData.Length);







不过需要提的一点,如果把大量的文件存入数据库的话,会造成数据库的臃肿,而且访问量也会增大。所以现在比较流行的做法,是把文件上传到服务器上,而在数据库上只保存文件的相对路径即可。那么访问的时候,先通过数据库得到文件的相对路径,然后再访问服务器上的文件
参考技术A 写入图片部分代码:
假设图片为 test.gif
byte [] bytes = File.ReadAllBytes(@"c:\test.gif");
SqlConnection con = new SqlConnection("server=.;uid=sa;pwd=xxx;database=数据库名");
con.open();
SqlCommand cmd = new SqlCommand("insert into 表(图片字段) values(@image)");
cmd.Parameters.Add("@image", SqlDbType.Image).Value = bytes;
cmd.ExecuteNonQuery();
读取部分代码:
SqlConnection con = new SqlConnection("server=.;uid=sa;pwd=xxx;database=数据库名");
con.open();
SqlCommand cmd = new SqlCommand("select 图片字段 表 where 图片编号=1");
object scalar = scmd.ExecuteScalar();
byte[] bytes=(byte[])scalar;

如果保存成文件:
File.WriteAllBytes(@"c:\read.gif",bytes);
如果要直接用网页输出:
MemoryStream ms = new MemoryStream(bytes);
Response.ContentType = "image/gif";
System.Drawing.Image image=System.Drawing.Image.FromStream(ms);
image.Save(Response.OutputStream, System.Drawing.Imaging.ImageFormat.Gif);
Response.End();

转载MySQL存入图片+Qt读入读出数据库中的图片

/* Time: 2017.01.02 —— 2017.01.04

* Author: WJ

* Function:连接数据库,从数据库中读取图片并显示(已成功)

*/

【参考链接】

MySQL存入图片+Qt读入读出数据库中的图片 - lpdpzc的专栏 - 博客频道 - CSDN.NET http://blog.csdn.net/lpdpzc/article/details/41915835

 

【主要代码】

 

void MainWindow::on_ShowImage_clicked()

{

QSqlDatabase db ;

// 连接数据库

if(QSqlDatabase::contains("qt_sql_default_connection"))

db = QSqlDatabase::database("qt_sql_default_connection");

else

{

db = QSqlDatabase::addDatabase("QMYSQL");

db.setHostName("localhost");

db.setDatabaseName("sfood");

db.setUserName("root");

db.setPassword("123456");

}

 

if(! db.open())

{

qDebug()<<"Fail to Opened!";

}

else

{

qDebug()<<"DataBase Opened!";

 

//建立查询

QSqlQuery query;

 

query.exec("SELECT * FROM sfood"); //查询未成功

 

if (! query.exec("SELECT * FROM sfood"))

{

qDebug()<<" Fail to Selecte !";

}

else

{

qDebug()<<" Selected Success!";

QPixmap photo;

qDebug()<<"显示图片";

if(query.first())

{

photo.loadFromData(query.value(5).toByteArray(), "JPG"); //从数据库中读出图片为二进制数据,图片格式为JPG,然后显示到QLabel里

}

ui->label->setPixmap(photo);

ui->label->setScaledContents(true);

}

}

}

 【结果】

 

 

从数据库中读取其他信息:菜名、价格

【代码】

if(query.first())

{

QString str1 = query.value(1).toString();

ui->lineEdit->setText(str1); // 菜名

 

price = query.value(4).toInt();

ui->lineEdit_2->setText(QString::number(price)); // 价格

photo.loadFromData(query.value(6).toByteArray(), "JPG");

//从数据库中读出图片为二进制数据,图片格式为JPG,然后显示到QLabel里

}

 【结果】

【思考】 query.first() 与 query.next() 的区别?

query.first() 图片显示正常

query.next() 图片无法显示

 

以上是关于VS.C#如何向数据数据库中存入和读取图片的?的主要内容,如果未能解决你的问题,请参考以下文章

Delphi用ADOQuery将图片存入ACCESS,求一个示例。

关于JAVA~~~~ 如何将图片等大对象存入ORACLE中~~求详解!(代码)

android 中怎么将特殊符号和表情,存入数据库,还能读取

JSP 从数据库中如何取得图片的路径?

如何读取图片文件,并且放在一个byte数组当中?

C#winform如果在数据库中存入的是图片名字,怎样用datagridview读取并显示,急求呀,大哥大姐们帮个忙吧!