C# 使用处理程序从数据库检索图像
对于一个学校项目,我必须制作一个网络商店。我试图从数据库中获取产品图像,但似乎无法使其正常工作 我在网上的某个地方读到,你应该通过一个处理程序来做这件事 就是这样:C# 使用处理程序从数据库检索图像,c#,asp.net,database,C#,Asp.net,Database,对于一个学校项目,我必须制作一个网络商店。我试图从数据库中获取产品图像,但似乎无法使其正常工作 我在网上的某个地方读到,你应该通过一个处理程序来做这件事 就是这样: public class afbeelding : IHttpHandler { public void ProcessRequest(HttpContext context) { //Connect string connectionstring = @"Provider=Micr
public class afbeelding : IHttpHandler
{
public void ProcessRequest(HttpContext context)
{
//Connect
string connectionstring = @"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\Users\jeroen\Documents\Visual Studio 2010\Projects\producten\producten\App_Data\Bimsports.accdb;Persist Security Info=True";
OleDbConnection conn = new OleDbConnection(connectionstring);
//execute
int artikelnummer = 1;
string sql = "SELECT foto FROM Artikel WHERE Artikelnummer =?";
OleDbCommand cmd = new OleDbCommand(sql, conn);
cmd.Parameters.AddWithValue("Artikelnummer", artikelnummer);
//read
try
{
conn.Open();
OleDbDataReader reader = cmd.ExecuteReader();
reader.Read();
context.Response.BinaryWrite((byte[])reader["foto"]);
}
catch
{
}
finally
{
conn.Close();
}
我应该把这个放在aspx里:
<asp:Image ID="img_nikeshirt" runat="server" ImageUrl='<%# "afbeelding.ashx?ID=" + Eval("artikelnummer")%>'/>
我没有错误,但图像不会显示。
谁能帮我一下吗
编辑:
顺便说一下,该图像位于access数据库中。它说的是ole对象。
它仍然被认为是图像吗
另一编辑:
如果我直接将查询放入access,它会给我图片的列,而不是图片本身……这可能是问题所在吗?如果是,我该如何修复它?您应该在响应上设置内容类型标题,如下所示:
context.Response.ContentType = "image/png";
context.Response.BinaryWrite((byte[])reader["foto"]);
context.Response.Flush();
您是否尝试返回HTTP响应消息
不是void返回byte[]的上下文,而是这里的人发现我丢失了很多代码,并且由于某种原因,通过access保存图像本身无法工作。相反,我制作了一个页面,将其载入其中。 对于有相同问题的人,这里是我的代码 用于将图像保存到数据库中的Web窗体
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title></title>
</head>
<body>
<form id="form1" runat="server">
<div>
</div>
<asp:DropDownList ID="ddlartikel" runat="server" AutoPostBack="true"
onselectedindexchanged="ddlartikel_SelectedIndexChanged">
</asp:DropDownList>
<br />
<asp:Image ID="imgfoto" runat="server" />
<p>Verander Foto's</p>
<asp:FileUpload ID="FileUpload1" runat="server" />
<br />
<asp:Button ID="btnsave" runat="server" Text="Sla op in database"
onclick="btnsave_Click" />
</form>
</body>
</html>
用于从数据库(您的网页)检索图像的Web表单
然后我创建了一个类,查看您请求的数据库中的图像,并将其放入字节[]中
public static byte[] getpicture(int artikelnummer)
{
string connectionstring = @"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\Users\jeroen\Documents\Visual Studio 2010\Projects\producten\producten\App_Data\Bimsports.accdb;Persist Security Info=True";
OleDbConnection conn = new OleDbConnection(connectionstring);
//Execute
string sql = "SELECT foto FROM Artikel WHERE Artikelnummer =?";
OleDbCommand cmd = new OleDbCommand(sql, conn);
cmd.Parameters.AddWithValue("Artikelnummer", artikelnummer);
try
{
byte[] photodata = null;
conn.Open();
OleDbDataReader reader = cmd.ExecuteReader();
if (reader.HasRows)
{
reader.Read();
if (!reader.IsDBNull(0))
{
photodata = new byte[Convert.ToInt32((reader.GetBytes(0, 0, null, 0, Int32.MaxValue)))];
long bytesreceived = reader.GetBytes(0, 0, photodata, 0, photodata.Length);
}
}
return photodata;
}
catch (Exception ex)
{
}
finally
{
conn.Close();
}
return null;
}
public static bool SavePicture(int artikelnummer, byte[] photodata)
{
int rowupdated = 0;
string connectionstring = @"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\Users\jeroen\Documents\Visual Studio 2010\Projects\producten\producten\App_Data\Bimsports.accdb;Persist Security Info=True";
OleDbConnection conn = new OleDbConnection(connectionstring);
string sql = "UPDATE Artikel SET foto=? WHERE artikelnummer=?";
OleDbCommand cmd = new OleDbCommand(sql, conn);
conn.Open();
OleDbParameter param = new OleDbParameter("@foto", OleDbType.VarBinary, photodata.Length);
param.Value = photodata;
cmd.Parameters.Add(param);
cmd.Parameters.AddWithValue("Artikelnummer", artikelnummer);
rowupdated = (int)cmd.ExecuteNonQuery();
return (rowupdated>0);
}
}
}
处理程序正在页面上写入它
public class afbeelding : IHttpHandler
{
public void ProcessRequest(HttpContext context)
{
int artikelnummer = 0;
if (context.Request.QueryString["artikelnummer"] != null)
{
artikelnummer = int.Parse(context.Request.QueryString["artikelnummer"]);
}
if (artikelnummer != 0)
{
byte[] bytes = CBlob.getpicture(artikelnummer);
if (bytes != null)
{
context.Response.ContentType = "image/jpeg";
context.Response.OutputStream.Write(bytes, 0, bytes.Length);
}
}
}
public bool IsReusable
{
get
{
return false;
}
}
}
它可能会更简单,更短,但嘿,它的工作!
不过谢谢你的所有意见
关于tuinj您应该设置响应内容类型以及imagescontext.response.ContentType=“image/jpeg”所需的其他标题;context.Response.Clear();context.Response.BinaryWrite((字节[])读取器[“foto”]);尝试直接使用URL访问处理程序。例如:
http://example.com/MySite/afbeelding.ashx
。看看会发生什么。这将告诉您问题是否出在处理程序上,或者页面如何处理图像。好的,我尝试过这样做,这是错误:XML解析错误:找不到元素位置:行号1,第1栏:假设您正在拍摄articlenumber=1i的文章,但它似乎没有改变任何东西。应该用什么来代替缓冲区,因为缓冲区给了我一个错误仍然没有:(我认为出于某种原因,他找不到图像
//Execute
string sql = "SELECT Merk, Maat, Omschrijving, Kleur, Prijs, BTW, Categorie.Categorie FROM Artikel INNER JOIN Categorie ON Artikel.Categorie = Categorie.Categorienummer WHERE Artikelnummer =?";
OleDbCommand cmd = new OleDbCommand(sql, conn);
cmd.Parameters.AddWithValue("Artikelnummer", artikelnummer);
//Read
try
{
conn.Open();
OleDbDataReader reader = cmd.ExecuteReader();
while (reader.Read())
{
lbl_merk.Text = reader["Merk"].ToString();
lbl_maat.Text = reader["Maat"].ToString();
lbl_omschrijving.Text = reader["Omschrijving"].ToString();
lbl_kleur.Text = reader["Kleur"].ToString();
lbl_prijs.Text = reader["Prijs"].ToString();
lbl_btw.Text = reader["BTW"].ToString();
lbl_categorie.Text = reader["Categorie"].ToString();
}
string sUrl = string.Format("~/afbeelding.ashx?artikelnummer={0}", artikelnummer);
img_nikeshirt.ImageUrl = sUrl;
}
catch
{
}
finally
{
conn.Close();
}
}
public static byte[] getpicture(int artikelnummer)
{
string connectionstring = @"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\Users\jeroen\Documents\Visual Studio 2010\Projects\producten\producten\App_Data\Bimsports.accdb;Persist Security Info=True";
OleDbConnection conn = new OleDbConnection(connectionstring);
//Execute
string sql = "SELECT foto FROM Artikel WHERE Artikelnummer =?";
OleDbCommand cmd = new OleDbCommand(sql, conn);
cmd.Parameters.AddWithValue("Artikelnummer", artikelnummer);
try
{
byte[] photodata = null;
conn.Open();
OleDbDataReader reader = cmd.ExecuteReader();
if (reader.HasRows)
{
reader.Read();
if (!reader.IsDBNull(0))
{
photodata = new byte[Convert.ToInt32((reader.GetBytes(0, 0, null, 0, Int32.MaxValue)))];
long bytesreceived = reader.GetBytes(0, 0, photodata, 0, photodata.Length);
}
}
return photodata;
}
catch (Exception ex)
{
}
finally
{
conn.Close();
}
return null;
}
public static bool SavePicture(int artikelnummer, byte[] photodata)
{
int rowupdated = 0;
string connectionstring = @"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\Users\jeroen\Documents\Visual Studio 2010\Projects\producten\producten\App_Data\Bimsports.accdb;Persist Security Info=True";
OleDbConnection conn = new OleDbConnection(connectionstring);
string sql = "UPDATE Artikel SET foto=? WHERE artikelnummer=?";
OleDbCommand cmd = new OleDbCommand(sql, conn);
conn.Open();
OleDbParameter param = new OleDbParameter("@foto", OleDbType.VarBinary, photodata.Length);
param.Value = photodata;
cmd.Parameters.Add(param);
cmd.Parameters.AddWithValue("Artikelnummer", artikelnummer);
rowupdated = (int)cmd.ExecuteNonQuery();
return (rowupdated>0);
}
}
}
public class afbeelding : IHttpHandler
{
public void ProcessRequest(HttpContext context)
{
int artikelnummer = 0;
if (context.Request.QueryString["artikelnummer"] != null)
{
artikelnummer = int.Parse(context.Request.QueryString["artikelnummer"]);
}
if (artikelnummer != 0)
{
byte[] bytes = CBlob.getpicture(artikelnummer);
if (bytes != null)
{
context.Response.ContentType = "image/jpeg";
context.Response.OutputStream.Write(bytes, 0, bytes.Length);
}
}
}
public bool IsReusable
{
get
{
return false;
}
}
}