0

データベースの画像を Web フォームの画像ボタンに表示しようとしています。エラー メッセージは表示されませんが、画像が表示されません。データベースからの画像ではなく、画像ボタンに表示される小さな小さな表示のみ....

私のハンドラーはここにあります:

public void ProcessRequest (HttpContext context)
{
        Int32 Member_No;
        if (context.Request.QueryString["id"] != null)
        {
            Member_No = Convert.ToInt32(context.Request.QueryString["id"]);
            context.Response.ContentType = "image/jpeg";

            Stream strm = ShowEmpImage(Member_No);

            byte[] buffer = new byte[4096];
            int byteSeq = strm.Read(buffer, 0, 4096);

            while (byteSeq > 0)
            {
                context.Response.OutputStream.Write(buffer, 0, byteSeq);
                byteSeq = strm.Read(buffer, 0, 4096);
            }  
        }
        else
        {
            context.Response.Write("No Image Found");
        }
    }

   public bool IsReusable
   {
       get
       {
           return false;
       }
   }

   public Stream ShowEmpImage(int Member_No) 
   {
       SqlConnection con = new SqlConnection(ConfigurationManager.ConnectionStrings["MyServer"].ConnectionString);
       con.Open();
       SqlCommand cmd = new SqlCommand("Select Photo from Members where Member_No = @ID", con);
       cmd.CommandType = CommandType.Text;
       cmd.Parameters.AddWithValue("@ID", Member_No);

       object img = cmd.ExecuteScalar();

       try
       {
           return new MemoryStream((byte[])img);
       }
       catch
       {
           return null;
       }
       finally
       {
           con.Close();
       }
   }
}
4

1 に答える 1

0

byte[]from execute スカラーを返し、バイトをストリームに書き込むだけです。

public byte[] ShowEmpImage(int Member_No) 
{
   var settings = ConfigurationManager.ConnectionStrings["MyServer"];
   using(var con = new SqlConnection(settings.ConnectionString))
   using(var cmd = new SqlCommand("Select Photo from Members where Member_No = @ID", con))
   {
       con.Open();
       cmd.CommandType = CommandType.Text;
       cmd.Parameters.AddWithValue("@ID", Member_No);

       return (byte[])cmd.ExecuteScalar();
   }
}

var image = ShowEmpImage(Member_No);
context.Response.WriteBytes(image);
context.Response.ContentType = "image/jpg";

usingところで:メモリリークを防ぐために、ado.netコンポーネントをブロックでラップすることもできます。

于 2012-09-26T14:07:49.783 に答える