簡體   English   中英

創建一個事務以將數據發送到服務器

[英]Create a transaction for sending data to the server

我要發布圖片和數據。 如果發生錯誤。 他們都不應該做。 但是問題是照片存儲在服務器上。 或存儲數據。

並且照片名稱必須是ID新聞。 我知道如何寫存儲過程,但是我不知道如何將發送圖片發送到服務器以及如何將圖片地址發送到帶有事務的數據庫。 這意味着如果發生,請不要保存任何數據。

這是代碼的一部分

這正在發送新聞

            cmd.Parameters.Add(new SqlParameter("@title", TextBox1.Text));
        cmd.Parameters.Add(new SqlParameter("@day", DateTime.Now.Day));
        cmd.Parameters.Add(new SqlParameter("@month", DateTime.Now.Month));
        cmd.Parameters.Add(new SqlParameter("@year", DateTime.Now.Year));
        cmd.Parameters.Add(new SqlParameter("@text", TextBox2.Text));
        cmd.Parameters.Add(new SqlParameter("@id_writer", Session["is_login"]));

這會將圖片發送到服務器

          //insert pic  adress in db
        //1-get web path
        string path = Server.MapPath(".") + "\\newspic\\";
        //2-get and check file etention
        string[] validExt = { ".jpg", ".gif", ".png" };
        string ext = System.IO.Path.GetExtension(FileUpload1.PostedFile.FileName);
        if (Array.IndexOf(validExt, ext.ToLower()) < 0)
        {
            //the file dosent exsist in this palce
            return;
        }
        //3-get and check file size
        long size = FileUpload1.PostedFile.ContentLength;
        size /= 1024;
        if (size > 2024)
        {
            //the size of pic is large
            return;
        }
        if (size == 0)
        {
            //you dont send file
            return;
        }
        //4-get file name
        string filename = System.IO.Path.GetFileName(FileUpload1.PostedFile.FileName);

        //6-savefile to server
        FileUpload1.PostedFile.SaveAs(path + filename);

這會將pic的地址發送到數據庫

  cmd.Parameters.Add(new SqlParameter("@pic", path + filename));

從我可以收集到的內容來看,您想

public void UploadFile()
{
    var file      = FileUpload1.PostedFile;
    var title     = TextBox1.Text;
    var text      = TextBox2.Text;
    var id_writer = Session["is_login"];
    var filename  = string.Empty;

    if (TryUploadFile(file, out filename))
    {
        if (!TryInsertFile(title, text, id_writer, filename))
        {
            File.Delete(filename);
        }
    }
}

您似乎已經擁有了大部分功能,因此,只需進行一些調整,最終會得到類似

public bool IsValid(HttpPostedFile file)
{
    var validExtensions = { ".jpg", ".gif", ".png" };

    var fileExtension = System.IO.Path.GetExtension(file.FileName);

    if (Array.IndexOf(validExtensions, fileExtension.ToLower()) < 0)
    {
        return false;
    }

    var size = file.ContentLength / 1024;

    if (size == 0 || size > 2024)
    {
        return false;
    }
}

private bool TryUploadFile(HttpPostedFile file, out string filename)
{
    var path = Server.MapPath(".") + "\\newspic\\";

    filename = path + System.IO.Path.GetFileName(file.FileName);        

    if (!IsValid(file))
    {
        return false;
    }

    try 
    {
        file.SaveAs(filename);
    }
    catch (HttpException)
    {
        return false;
    }
}

private bool TryInsertFile(string title, string text, string id_writer, string filename)
{
    using (var conn = new SqlConnection("<connectionString>"))
    {    
        try
        {            
            var now = DateTime.Now;

            conn.Open();

            var qry = "INSERT INTO tbl (title, day, month, year, text, id_writer, pic)" + 
                      "VALUES (@title, @day, @month, @year, @text, @id_write, @pic)"

            var cmd = new SqlCommand()

            cmd.Parameters.Add(new SqlParameter("@title", title));
            cmd.Parameters.Add(new SqlParameter("@day", now.Day));
            cmd.Parameters.Add(new SqlParameter("@month", now.Month));
            cmd.Parameters.Add(new SqlParameter("@year", now.Year));
            cmd.Parameters.Add(new SqlParameter("@text", text));
            cmd.Parameters.Add(new SqlParameter("@id_writer", id_writer));
            cmd.Parameters.Add(new SqlParameter("@pic", filename));

            cmd.ExecuteNonQuery();
        }
        catch (SqlException)
        {
            return false;
        }
    }
}

編輯:

因為文件名取決於插入行的身份,所以使用顯式數據庫事務以一種方法進行。

private void UploadPicture(HttpPostedFile file, string title, string text, string id_writer)
{
    if (!IsValid(file)) return;

    using (var conn = new SqlConnection(/* connection string */))
    {    
        conn.Open();

        // begin a transaction which will be rolled back if not committed
        using (var tx = conn.BeginTransaction())
        {            
            var now = DateTime.Now;                

            var insert = "INSERT INTO tbl (title, day, month, year, text, id_writer, pic)" + 
                         "VALUES (@title, @day, @month, @year, @text, @id_write, @pic);" +
                         "SELECT SCOPE_IDENTITY();";

            var update = "UPDATE tbl SET pic = @pic WHERE id = @id";

            var insertCommand = new SqlCommand(insert);

            var updateCommand = new SqlCommand(update);

            // insert the row for the uploaded file
            insertCommand.Parameters.Add(new SqlParameter("@title", title));
            insertCommand.Parameters.Add(new SqlParameter("@day", now.Day));
            insertCommand.Parameters.Add(new SqlParameter("@month", now.Month));
            insertCommand.Parameters.Add(new SqlParameter("@year", now.Year));
            insertCommand.Parameters.Add(new SqlParameter("@text", text));
            insertCommand.Parameters.Add(new SqlParameter("@id_writer", id_writer));

            // get the identity of the inserted row
            var identity = Convert.ToInt32(insertCommand.ExecuteScalar());

            // get the filename appending the identity
            var path = Server.MapPath(".") + "\\newspic\\";

            var filename =  path + System.IO.Path.GetFileName(file.FileName) + identity;

            // update the row with the filename
            updateCommand.Parameters.Add(new SqlParameter("@pic", filename));
            updateCommand.Parameters.Add(new SqlParameter("@id", identity));

            updateCommand.ExecuteNonQuery();

            // save the file
            file.SaveAs(filename);

            // all done so commit
            tx.Commit();
        }
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM