图片存入数据库和读取
网上找的资料
1.将图片转换为二进制数组(byte[]);
2.把转换后的二进制数组(byte[])作为参数传递给要执行的Command;
3.执行Command;
转化2进制数组的方法
Code
1、byte[] fileData = this.FileUpload1.FileBytes;
2、
/// <summary>
/// 根据路径将文件转换为2进制数组
/// </summary>
/// <param name="strpath">路径</param>
/// <returns>返回数组</returns>
public byte[] returnbyte(string strpath)
{
// 以二进制方式读文件
FileStream fsMyfile = new FileStream(strpath, FileMode.OpenOrCreate, FileAccess.ReadWrite);
// 创建一个二进制数据流读入器,和打开的文件关联
BinaryReader brMyfile = new BinaryReader(fsMyfile);
// 把文件指针重新定位到文件的开始
brMyfile.BaseStream.Seek(0, SeekOrigin.Begin);
byte[] bytes = brMyfile.ReadBytes(Convert.ToInt32(fsMyfile.Length.ToString()));
// 关闭以上new的各个对象
brMyfile.Close();
return bytes;
}
3、
pic.img
public static byte[] Getbyte(Image img)
{
MemoryStream stream = new MemoryStream();
img.Save(stream, ImageFormat.Jpeg);
byte[] mydata = new byte[stream.Length];
mydata = stream.ToArray();
stream.Close();
return mydata;
}
1、byte[] fileData = this.FileUpload1.FileBytes;
2、
/// <summary>
/// 根据路径将文件转换为2进制数组
/// </summary>
/// <param name="strpath">路径</param>
/// <returns>返回数组</returns>
public byte[] returnbyte(string strpath)
{
// 以二进制方式读文件
FileStream fsMyfile = new FileStream(strpath, FileMode.OpenOrCreate, FileAccess.ReadWrite);
// 创建一个二进制数据流读入器,和打开的文件关联
BinaryReader brMyfile = new BinaryReader(fsMyfile);
// 把文件指针重新定位到文件的开始
brMyfile.BaseStream.Seek(0, SeekOrigin.Begin);
byte[] bytes = brMyfile.ReadBytes(Convert.ToInt32(fsMyfile.Length.ToString()));
// 关闭以上new的各个对象
brMyfile.Close();
return bytes;
}
3、
pic.img
public static byte[] Getbyte(Image img)
{
MemoryStream stream = new MemoryStream();
img.Save(stream, ImageFormat.Jpeg);
byte[] mydata = new byte[stream.Length];
mydata = stream.ToArray();
stream.Close();
return mydata;
}
传递参数
1.SqlServer数据库。SqlServer有Image字段类型,最大可以存储2G的数据。
Code
byte[] fileData = this.FileUpload1.FileBytes;
string sql = "insert into t_img(img) values (@img)";
string strconn = System.Configuration.ConfigurationManager.ConnectionStrings["fengdongDB"].ToString();
SqlConnection sqlConn = new SqlConnection(strconn);
SqlCommand sqlComm = new SqlCommand(sql, sqlConn);
sqlComm.Parameters.Add("@img", SqlDbType.Image);//添加参数
sqlComm.Parameters["@img"].Value = fileData;//为参数赋值
sqlConn.Open();
sqlComm.ExecuteNonQuery();
sqlConn.Close();
byte[] fileData = this.FileUpload1.FileBytes;
string sql = "insert into t_img(img) values (@img)";
string strconn = System.Configuration.ConfigurationManager.ConnectionStrings["fengdongDB"].ToString();
SqlConnection sqlConn = new SqlConnection(strconn);
SqlCommand sqlComm = new SqlCommand(sql, sqlConn);
sqlComm.Parameters.Add("@img", SqlDbType.Image);//添加参数
sqlComm.Parameters["@img"].Value = fileData;//为参数赋值
sqlConn.Open();
sqlComm.ExecuteNonQuery();
sqlConn.Close();
2.Oracle数据库。在Oracle数据库中我们可以使用BLOB字段类型,最大可以存储4G的数据。
Code
byte[] fileData = this.FileUpload1.FileBytes;
string sql = "insert into t_img(imgid,IMGDATA) values(100,:IMGDATA)";
string strconn = System.Configuration.ConfigurationManager.ConnectionStrings["ConnectionStringForOracle"].ToString();
OracleConnection oraConn = new OracleConnection(strconn);
OracleCommand oraComm = new OracleCommand(sql, oraConn);
oraComm.Parameters.Add(":IMGDATA", OracleType.Blob);//添加参数
oraComm.Parameters[":IMGDATA"].Value = fileData;//为参数赋值
oraConn.Open();
oraComm.ExecuteNonQuery();
oraConn.Close();
byte[] fileData = this.FileUpload1.FileBytes;
string sql = "insert into t_img(imgid,IMGDATA) values(100,:IMGDATA)";
string strconn = System.Configuration.ConfigurationManager.ConnectionStrings["ConnectionStringForOracle"].ToString();
OracleConnection oraConn = new OracleConnection(strconn);
OracleCommand oraComm = new OracleCommand(sql, oraConn);
oraComm.Parameters.Add(":IMGDATA", OracleType.Blob);//添加参数
oraComm.Parameters[":IMGDATA"].Value = fileData;//为参数赋值
oraConn.Open();
oraComm.ExecuteNonQuery();
oraConn.Close();
注意:这里我需要说明一下,用Oracle的专用连接传递参数的时候你要小心一点,看看上面的SQL语句你就会知道,要在参数名前加个“:”否则就会出现下面的错误“OracleException: orA-01036: 非法的变量名/编号”。这里需要我们注意一下。另外还有一个地方,当我引用System.Data.OracleClient命名空间的时候默认是没有的,必须添加对System.Data.OracleClient的引用,我记得在VS2003下如果安装了OracleClient是不用添加引用就可以引入的。这里也要留意一下。
3.Access数据库。在Access中我们使用OLE对象字段类型,最大支持1G的数据。
Code
byte[] fileData = this.FileUpload1.FileBytes;
string sql = "insert into t_img(IMGDATA) values(?)";
string strconn = System.Configuration.ConfigurationManager.ConnectionStrings["ConnectionStringForAccess"].ToString();
OleDbConnection oleConn = new OleDbConnection(strconn);
OleDbCommand oleComm = new OleDbCommand(sql, oleConn);
oleComm.Parameters.Add("imgdata", OleDbType.Binary);
oleComm.Parameters["imgdata"].Value = fileData;
oleConn.Open();
oleComm.ExecuteNonQuery();
oleConn.Close();
byte[] fileData = this.FileUpload1.FileBytes;
string sql = "insert into t_img(IMGDATA) values(?)";
string strconn = System.Configuration.ConfigurationManager.ConnectionStrings["ConnectionStringForAccess"].ToString();
OleDbConnection oleConn = new OleDbConnection(strconn);
OleDbCommand oleComm = new OleDbCommand(sql, oleConn);
oleComm.Parameters.Add("imgdata", OleDbType.Binary);
oleComm.Parameters["imgdata"].Value = fileData;
oleConn.Open();
oleComm.ExecuteNonQuery();
oleConn.Close();
==============
1、数据库读取文件转化成二进制数组
2、二进制数组转化图片
Code
private byte[] getImageDataFromOracle()
{
string sql = "select IMGDATA from t_img where imgID=100";
string strconn = System.Configuration.ConfigurationManager.ConnectionStrings["ConnectionStringForOracle"].ToString();
OracleConnection oraConn = new OracleConnection(strconn);
OracleCommand oraComm = new OracleCommand(sql, oraConn);
oraConn.Open();
byte[] fileData = (byte[])oraComm.ExecuteScalar();
oraConn.Close();
return fileData;
}
private byte[] getImageDataFromOracle()
{
string sql = "select IMGDATA from t_img where imgID=100";
string strconn = System.Configuration.ConfigurationManager.ConnectionStrings["ConnectionStringForOracle"].ToString();
OracleConnection oraConn = new OracleConnection(strconn);
OracleCommand oraComm = new OracleCommand(sql, oraConn);
oraConn.Open();
byte[] fileData = (byte[])oraComm.ExecuteScalar();
oraConn.Close();
return fileData;
}
我们获取到了数据,那么把byte[]转换为图片的过程都是一样的。
Code
private System.Drawing.Image convertByteToImg(byte[] imgData)
{
System.IO.MemoryStream ms = new System.IO.MemoryStream(imgData);
System.Drawing.Image img = System.Drawing.Image.FromStream(ms);
return img;
}
private System.Drawing.Image convertByteToImg(byte[] imgData)
{
System.IO.MemoryStream ms = new System.IO.MemoryStream(imgData);
System.Drawing.Image img = System.Drawing.Image.FromStream(ms);
return img;
}
如果你在开发WinForm应用的话你可以直接把返回结果保存或者显示到PictureBox里,如果你在使用ASP.Net那么你可以在单独的一个页面把图片输出,在另外一个页面把Image控件的ImageUrl属性指向图片输出页面。
比如输出页面getImg.aspx的代码
Code
protected void Page_Load(object sender, EventArgs e)
{
string sql = "select IMGDATA from t_img where imgID=100";
string strconn = System.Configuration.ConfigurationManager.ConnectionStrings["ConnectionStringForOracle"].ToString();
OracleConnection oraConn = new OracleConnection(strconn);
OracleCommand oraComm = new OracleCommand(sql, oraConn);
oraConn.Open();
byte[] fileData = (byte[])oraComm.ExecuteScalar();
oraConn.Close();
System.IO.MemoryStream ms = new System.IO.MemoryStream(fileData);
System.Drawing.Image img = System.Drawing.Image.FromStream(ms);
img.Save(Response.OutputStream, System.Drawing.Imaging.ImageFormat.Jpeg);
}
protected void Page_Load(object sender, EventArgs e)
{
string sql = "select IMGDATA from t_img where imgID=100";
string strconn = System.Configuration.ConfigurationManager.ConnectionStrings["ConnectionStringForOracle"].ToString();
OracleConnection oraConn = new OracleConnection(strconn);
OracleCommand oraComm = new OracleCommand(sql, oraConn);
oraConn.Open();
byte[] fileData = (byte[])oraComm.ExecuteScalar();
oraConn.Close();
System.IO.MemoryStream ms = new System.IO.MemoryStream(fileData);
System.Drawing.Image img = System.Drawing.Image.FromStream(ms);
img.Save(Response.OutputStream, System.Drawing.Imaging.ImageFormat.Jpeg);
}
如果是多张图片
Code
SqlDataReader sdr2 = c.drPicture(pid);
if (sdr2.Read())
{
MemoryStream ms1 = new MemoryStream((byte[])sdr2["pica"]);
if (ms1.Length > 0)
{
pica.SizeMode = PictureBoxSizeMode.StretchImage; //保持图片不走样
pica.Image = Image.FromStream(ms1, true);
}
MemoryStream ms2 = new MemoryStream((byte[])sdr2["picb"]);
if (ms2.Length > 0)
{
picb.SizeMode = PictureBoxSizeMode.StretchImage;
picb.Image = Image.FromStream(ms2, true);
}
MemoryStream ms3 = new MemoryStream((byte[])sdr2["picc"]);
if (ms3.Length > 0)
{
picc.SizeMode = PictureBoxSizeMode.StretchImage;
picc.Image = Image.FromStream(ms3, true);
}
MemoryStream ms4 = new MemoryStream((byte[])sdr2["picd"]);
if (ms4.Length > 0)
{
picd.SizeMode = PictureBoxSizeMode.StretchImage;
picd.Image = Image.FromStream(ms4, true);
}
sdr2.Close();
}
public SqlDataReader drPicture(string pid)
{
db.Begin();
string str2 = "select * from T_picture where pid = '" + pid + "'";
SqlCommand sc2 = new SqlCommand(str2, db.conn);
SqlDataReader sdr2 = sc2.ExecuteReader();
return sdr2;
}
SqlDataReader sdr2 = c.drPicture(pid);
if (sdr2.Read())
{
MemoryStream ms1 = new MemoryStream((byte[])sdr2["pica"]);
if (ms1.Length > 0)
{
pica.SizeMode = PictureBoxSizeMode.StretchImage; //保持图片不走样
pica.Image = Image.FromStream(ms1, true);
}
MemoryStream ms2 = new MemoryStream((byte[])sdr2["picb"]);
if (ms2.Length > 0)
{
picb.SizeMode = PictureBoxSizeMode.StretchImage;
picb.Image = Image.FromStream(ms2, true);
}
MemoryStream ms3 = new MemoryStream((byte[])sdr2["picc"]);
if (ms3.Length > 0)
{
picc.SizeMode = PictureBoxSizeMode.StretchImage;
picc.Image = Image.FromStream(ms3, true);
}
MemoryStream ms4 = new MemoryStream((byte[])sdr2["picd"]);
if (ms4.Length > 0)
{
picd.SizeMode = PictureBoxSizeMode.StretchImage;
picd.Image = Image.FromStream(ms4, true);
}
sdr2.Close();
}
public SqlDataReader drPicture(string pid)
{
db.Begin();
string str2 = "select * from T_picture where pid = '" + pid + "'";
SqlCommand sc2 = new SqlCommand(str2, db.conn);
SqlDataReader sdr2 = sc2.ExecuteReader();
return sdr2;
}