Member 12748242 Ответов: 1

Я хочу отобразить изображение, которое хранится в базе данных


Это моя база данных:
create table images 
(
     ID int primary key identity, 
     Name nvarchar(255),
     Size int, 
     ImgData varbinary(max) 
)

CREATE PROCEDURE UploadImages
     @Name nvarchar(255),
     @Size int,
     @ImgData varbinary(max),
     @NewId int output
AS
BEGIN
    INSERT INTO images
    VALUES (@Name, @Size, @ImgData)

    SELECT @NewId = SCOPE_IDENTITY()    
END


Это мой код:
HttpPostedFile PostedFile = FileUpload1.PostedFile;

 string fileName = Path.GetFileName(PostedFile.FileName);
 string fileExtension = Path.GetExtension(fileName);
 int fileSize = PostedFile.ContentLength;

 if(fileExtension.ToLower() == ".jpg" || fileExtension.ToLower() == ".bmp"|| fileExtension.ToLower() == ".gif" || fileExtension.ToLower() == ".png")
 {
     Stream stream = PostedFile.InputStream;
     BinaryReader binaryReader = new BinaryReader(stream);

     byte[] bytes = binaryReader.ReadBytes((int)stream.Length);

     string cs = ConfigurationManager.ConnectionStrings["DBCS"].ConnectionString;

     using (SqlConnection con = new SqlConnection(cs))
     {
         SqlCommand cmd = new SqlCommand("UploadImages", con);
         cmd.CommandType = CommandType.StoredProcedure;

         con.Open();

         SqlParameter paramName = new SqlParameter()
         {
             ParameterName = "@Name",
             Value = fileName
         };
         cmd.Parameters.Add(paramName);

         SqlParameter paramSize = new SqlParameter()
         {
             ParameterName = "@Size",
             Value = fileSize
         };
         cmd.Parameters.Add(paramSize);

         SqlParameter paramImgData = new SqlParameter()
         {
             ParameterName = "@ImgData",
             Value = bytes
         };
         cmd.Parameters.Add(paramImgData);

         SqlParameter paramNewId = new SqlParameter()
         {
             ParameterName = "@NewId",
             Value =-1,
             Direction = ParameterDirection.Output
         };
         cmd.Parameters.Add(paramNewId);

         cmd.ExecuteNonQuery();
         con.Close();

         Lmas.Visible = true;
         Lmas.Text = "done";
         Lmas.ForeColor = System.Drawing.Color.Green;
         HyperLink1.Visible = true;
         HyperLink1.NavigateUrl = "~/ShowImage.aspx?Id=" + cmd.Parameters["@NewId"].Value.ToString();

         //LoadImage();
     } 
 } 
 else 
 {
     Lmas.Visible = true;
     Lmas.Text = "only images (.jpg .png .gif .bmp) can be uploaded";
     Lmas.ForeColor = System.Drawing.Color.Red;
     HyperLink1.Visible = false;
 }

-------------------

Что я уже пробовал:

Я пытался отобразить свое изображение в img-теге или метке на первой странице не на той же странице, но это не работает , я пробовал этот код, но не работает:

string cs = ConfigurationManager.ConnectionStrings["DBCS"].ConnectionString;
        using (SqlConnection con = new SqlConnection(cs))
        {
            SqlCommand cmd = new SqlCommand("spGetImageById", con);
            cmd.CommandType = CommandType.StoredProcedure;

            SqlParameter paramID = new SqlParameter()
            {
                ParameterName = "@ID",
                Value = Request.QueryString["ID"]
            };
            cmd.Parameters.Add(paramID);

            con.Open();
            cmd.ExecuteScalar();
            byte[] bytes = (byte[])cmd.ExecuteScalar();
            string strBase64 = Convert.ToBase64String(bytes);
            Image1.ImageUrl = "data:Image/png;base64," + strBase64;

Maciej Los

Что вы подразумеваете под "не работает"?

Member 12748242

Процедура или функция 'spGetImageById' ожидает параметр '@ID', который не был указан.

ZurdoDev

Это не имеет абсолютно никакого отношения к изображению, работающему или не работающему. Это просто простой и базовый c# / sql. Просто исправь то, что там написано. Простой.

Member 12748242

Я меняю его на:
используя (команда sqlcommand cmd и = новая команда sqlcommand("spGetImageById ", кон))
{

УМК.CommandType = CommandType.Хранимая процедура;

Объект sqlparameter paramID = новый объект sqlparameter()
{
ParameterName = " @ID",
Значение = Запрос.QueryString ["ID"]
};
УМК.Параметры.Добавить(paramID);
против.Открыть();
SqlDataReader rd = cmd.Метода executereader();
если (РД.HasRows)
{
РД.Читать();
Label45.Текст = РД.Метод toString();
}

}
но никакого изображения не появляется

[no name]

Научитесь использовать отладчик и отлаживать свой код.

Wendelius

Что такое код для spGetImageById?

Member 12748242

Это для того, чтобы увидеть изображение на пустой странице, чтобы увидеть, загружается ли оно или нет.
Я хочу отобразить свое изображение после того, как оно сохранено в базе данных, чтобы пользователь увидел его на главной странице в img-теге

Wendelius

Я понимаю это но вы сказали что получаете сообщение об ошибке

"Процедура или функция 'spGetImageById' ожидает параметр '@ID', который не был указан"

Таким образом, одна из проблем может заключаться в том, что вы просто не предоставляете все параметры. Вы показали код для вызова этой процедуры, но не код, который реализует процедуру. Можете ли вы опубликовать инструкцию create procedure?

1 Ответов

Рейтинг:
0

Maciej Los

Взгляните на таблицу :

create table images 
(
     ID int primary key identity, --required!
     Name nvarchar(255),
     Size int, 
     ImgData varbinary(max) 
)

и Ваше заявление INSERT в SP:
INSERT INTO images
VALUES (@Name, @Size, @ImgData)


Чего тебе не хватает? ID!

В зависимости от ситуации, вы должны:

  1. менять ID определение поля для
    ID int primary key identity(1,1)

    для обеспечения автоинкремента. Тогда вы сможете игнорировать ID.
    INSERT INTO images (Name, Size, ImgData)
    VALUES (@Name, @Size, @ImgData)

  2. или
  3. изменение INSERT в вашем СП, чтобы:
    INSERT INTO images (ID, Name, Size, ImgData)
    VALUES (@ID, @Name, @Size, @ImgData)

    Обратите внимание, что код C# должен быть соответствующим образом изменен!


Для получения более подробной информации, пожалуйста, смотрите прошлые ответы:
Как вставить изображение в MS Access[^]
вставить изображение в базу данных access[^]