navi G Ответов: 2

Удаление изображения из папки и базы данных с помощью gridview in ASP.NET с#


Я могу удалить из базы данных, но я не знаю, как удалить изображение из папки.
Пожалуйста помочь .
для лучшего понимания, пожалуйста, отредактируйте мой код и вставьте.
Заранее спасибо.

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

protected void Button1_Click(object sender, EventArgs e)
    {
        SqlCommand command = new SqlCommand("SPinsertitem", con);
        command.CommandType = CommandType.StoredProcedure;
// UPLOAD IMAGE 1 //
        string strname = picture1.FileName.ToString();
        strname = "~//brand//New folder//" + strname;
        picture1.PostedFile.SaveAs(Server.MapPath(strname));
        command.Parameters.Add("@imageone", SqlDbType.VarChar, 100).Value = strname;
        // UPLOAD IMAGE 2 //
        string strname2 = picture2.FileName.ToString();
        strname2 = "~//brand//New folder//" + strname2;
        picture2.PostedFile.SaveAs(Server.MapPath(strname2));
        command.Parameters.Add("@imagetwo", SqlDbType.VarChar, 100).Value = strname2;
        // UPLOAD IMAGE 3 // 
        string strname3 = picture3.FileName.ToString();
        strname3 = "~//brand//New folder//" + strname3;
        picture3.PostedFile.SaveAs(Server.MapPath(strname3));
        command.Parameters.Add("@imagethree", SqlDbType.VarChar, 100).Value = strname3;

protected void BindGrid()
    {

        SqlDataAdapter myCommand = new SqlDataAdapter("SELECT * FROM pikiphones", con);
        DataSet ds = new DataSet();
        myCommand.Fill(ds);
        GridView1.DataSource = ds;
        GridView1.DataBind();
    }

protected void delete_rOW(object sender, GridViewDeleteEventArgs e)
    {
        String deleteCmd = "DELETE FROM pikiphones WHERE id= @id";
        SqlCommand myCommand = new SqlCommand(deleteCmd, con);
        myCommand.Parameters.Add(new SqlParameter("@id", SqlDbType.Int));
        myCommand.Parameters["@id"].Value = Convert.ToInt32(GridView1.Rows[e.RowIndex].Cells[1].Text);
        try
        {
            myCommand.ExecuteNonQuery();
        }
        catch (SqlException)
        {
            Label1.Text = "ERROR: Could not delete record";

        }
        myCommand.Connection.Close();
        
        BindGrid();
    }

2 Ответов

Рейтинг:
1

Andy Lanng

Я нигде не вижу, где вы пытаетесь удалить файл.

Вы можете просто использовать Systme.IO.File.Delete(path);, но в любом случае нет необходимости сохранять файл в файловой системе:

настройте поле изображения как varbinary(макс.):

Create Table images(
  image_id int not null identity(1,1) primary key,
  image_image1_name nvarchar(max),
  image_image1_binary varbinary(max)
-- ...
)


Затем считайте поток файлов непосредственно из загрузки. Нет необходимости сохранять его, просто храните в памяти в виде байта[] в течение нескольких циклов.

//....
    byte[] input = new byte[picture1.ContentLength];

    var stream = picture1.InputStream;

    stream.Read(input, 0, picture1.ContentLength);
    
    command.Parameters.Add("@image1Name", SqlDbType.VarChar, 100).Value=picture1.FileName;
    command.Parameters.Add("@image1Byte", SqlDbType.VarBinary, file.Length).Value=input;



Вот как я загружаю файлы повсюду. Это гораздо быстрее и менее поспешно очищается, так как GC будет связывать файл, Когда вы закончите с ним.

Я надеюсь, что это поможет ^_^


navi G

привет, Энди Лэнг, пожалуйста, скажите, где я должен написать Systme. IO. File.Удалить (путь);. например, пожалуйста, отредактируйте мой код, а затем pase.

Andy Lanng

замените (path) на (strname), а затем поместите эту строку туда, где вы хотите удалить файл.

Я предлагаю вам сделать это после записи в базу данных. Вы не опубликовали этот раздел кода, поэтому я не могу переписать его для вас

navi G

охраняемых недействительными delete_rOW(объект отправителя, GridViewDeleteEventArgs е)
{
Строка deleteCmd = " удалить из пикифонов, где id= @id";
SqlCommand myCommand = new SqlCommand(deleteCmd, con);
моя команда.Параметры.Добавить (новый SqlParameter ("@id", SqlDbType.Int));
моя команда.Параметры["@идентификатор"].Значение = Конвертировать.ToInt32(GridView1. Rows[e.Параметр rowindex].Ячейки[1]. Текст);
пробовать
{
моя команда.Метод executenonquery();
}
catch (SqlException)
{
Этикетка 1.Text = " ошибка: не удалось удалить запись";

}
моя команда.Соединение.Закрывать();

Биндгрид();
}

navi G

этот код я использую для удаления . с помощью этого я могу удалить из базы данных, но я не знаю, как удалить из папки с этим кодом, как ваш предложенный код System.IO.File.Удалить(путь).

navi G

я не знаю как описать свою проблему но пожалуйста помогите

Andy Lanng

ОИК! Таким образом, вы сохраняете img на путь сервера, добавляете этот путь в БД, а затем, когда вы удаляете из БД, вы также хотите удалить исходный файл. Попался ;Þ

Рейтинг:
0

Andy Lanng

Добавление к последнему решению:

Хорошо-сначала нужно попробовать удалить элемент, желательно перед ссылкой, но это не имеет значения. Просто убедитесь, что вы получили путь, прежде чем удалить запись:

protected void delete_rOW(object sender, GridViewDeleteEventArgs e)
    {


        //I'll write this "best practice"

        var id = Convert.ToInt32(GridView1.Rows[e.RowIndex].Cells[1].Text) 
        string selectCmd = "select path from pikiphones WHERE id= @id"
        using(SqlCommand com = con.CreateCommand){
            com.Text = selectCmd;
            com.Parameters.Add(new SqlParameter("@id", SqlDbType.Int){Value=id});
            var path = com.ExecuteScalar().toString();

            if(!string.isNullOrEmpty(path) && Path.Exists(path)){
               //try catch?
               Path.Delete(path);
            }
        }


        String deleteCmd = "DELETE FROM pikiphones WHERE id= @id";
        SqlCommand myCommand = new SqlCommand(deleteCmd, con);
        myCommand.Parameters.Add(new SqlParameter("@id", SqlDbType.Int));
        myCommand.Parameters["@id"].Value = id;
        try
        {
            myCommand.ExecuteNonQuery();
        }
        catch (SqlException)
        {
            Label1.Text = "ERROR: Could not delete record";

        }
        myCommand.Connection.Close();
        
        BindGrid();
    }



Возможно, вам придется его отладить. Я знаю, что у меня есть некоторые ключевые слова метода неправильно. Дайте мне знать, если вы застряли ^_^