繁体   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