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 中怎么将特殊符号和表情,存入数据库,还能读取
C#winform如果在数据库中存入的是图片名字,怎样用datagridview读取并显示,急求呀,大哥大姐们帮个忙吧!