shailendra from MP Ответов: 2

сохранение и отображение изображения для базы данных


Дорогой сэр\мама

Я более свежий веб - разработчик в asp.net с помощью C# .Я хочу показать изображение и сохранить его в базе данных. Это мой код .
Но в этом коде есть одна ошибка . Ошибка в том, что:
("Необходимо объявить скалярную переменную "@Img".Необходимо объявить скалярную переменную "@@ImgID" ").
Пожалуйста, помогите любому и любому другому простому способу сохранить изображение и показать его.

Заранее спасибо

public class ShowIamge : IHttpHandler
{
    SqlConnection con = new SqlConnection();
    SqlCommand cmd = new SqlCommand();
    
    public void ProcessRequest(HttpContext context)
    {
        Int32 Id1;
        if (context.Request.QueryString["ImgID"] != null)
            Id1 = Convert.ToInt32(context.Request.QueryString["ImgID"]);
         else
        throw new ArgumentException("No parameter pecified");           
        context.Response.ContentType ="image/jpeg";
        Stream strm = ShowImage(Id1);
        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);
        }
    }
    public Stream ShowImage (int Id1)
    {
        SqlConnection con = new SqlConnection(); 
con =new SqlConnection("Server=PC-5\\SQLEXPRESS; database=imagedate; Integrated Security=True");  
        string sql =("Select Image From image where ImgID=@Id1");
        cmd = new SqlCommand(sql,con);
        cmd.CommandType=CommandType.Text;   
        cmd.Parameters.AddWithValue("@ImgID",Id1);
        con.Open();     
        object img = cmd.ExecuteScalar();

     try
        {
            return new MemoryStream((byte[])img);
        }
        catch
        {
            return null;
        }
        finally
        {
            con.Close();
        }
    }
  public bool IsReusable
    {
       get
        {
        return false;
        }
   }
 }
 protected void Btnok_Click1(object sender, EventArgs e)
    {
        con = null;
        con = new SqlConnection("Server=PC-5\\SQLEXPRESS; database=imagedate; Integrated Security=True");
        con.Open();
        FileUpload img = (FileUpload)imgUpload;
        Byte[] imgByte = null;
        if (img.HasFile && img.PostedFile != null)
        {
            HttpPostedFile File = imgUpload.PostedFile;
            imgByte = new Byte[File.ContentLength];
            File.InputStream.Read(imgByte, 0, File.ContentLength);
        }
        string sql = "INSERT INTO image (Image) VALUES (@Img) SELECT @@ImgID";
        SqlCommand cmd = new SqlCommand(sql, con);
        cmd.Parameters.AddWithValue("@Image", imgByte);
        //cmd.Parameters.AddWithValue("@name", txtEName.Text);
        int ImgID = Convert.ToInt32(cmd.ExecuteScalar());
        con.Close();
       Image1.ImageUrl = "~/ShowIamge.ashx?ImgID=" + ImgID; 
    }

Tarun.K.S

Обернуть ваш код в <предварительно&ГТ; &ЛТ;/пре> теги.

2 Ответов

Рейтинг:
2

Al-Farooque Shubho

Для того чтобы вставить строку в базу данных и получить вновь вставленный идентификатор, необходимо выполнить следующие действия:

1. Использование cmd.ExecuteNonQuery() для выполнения операции вставки (вместо ExecuteScaler().

2. Выполните другой оператор SQL "SELECT SCOPE_IDENTITY()- и использовать ExecuteScaler() чтобы получить только что вставленный идентификатор.

Я бы рекомендовал вам создать хранимую процедуру для выполнения общей задачи. Ниже приводится очень простая хранимая процедура, которая делает это:

CREATE PROCEDURE dbo.SAVE_TEMPLATE(
    @Id INT
    , @Name varchar(255)
    , @GeneratedID INT OUTPUT
)
AS
BEGIN
        -- New Record, So insert it into the dbo.Templates
        INSERT INTO dbo.Table (Name)
        VALUES(@Name);
        SET @GeneratedID = SCOPE_IDENTITY();
END


Надеюсь, это поможет.


Рейтинг:
1

Member 11332597

ДОРОГОЙ, У МЕНЯ БЫЛ ТОТ ЖЕ ПРОЕКТ И ТА ЖЕ ПРОБЛЕМА, НО Я РЕШИЛ ЕЕ. ВЫ ТАКЖЕ МОЖЕТЕ ПОПРОБОВАТЬ СКОПИРОВАТЬ И ВСТАВИТЬ МОЙ КОД В "ВСТАВИТЬ КНОПКУ"

SqlCommand command = new SqlCommand("INSERT INTO  myimages(id,name,description,image)VALUES('" + textBoxID.Text + "','" + textBoxNAME.Text + "','" +textBoxdescription.Text + "',@img) ", connection);
            command.Parameters.Add(new SqlParameter("@img", img));
            connection.Open();
            if(command.ExecuteNonQuery() == 1)
            {
                MessageBox.Show("Data Inserted Successfully");
            } else
           {
               MessageBox.Show("Query not Executed");
           }
           connection.Close();


CHill60

Причина моего отрицательного голосования... ваш код уязвим для атаки sql-инъекций. Никогда не объединяйте строки из пользовательского ввода для создания sql-запросов.
Кроме того, нет никакой необходимости кричать. Использование всех заглавных букв считается криком на интернет-форумах и грубостью.