[英]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.