2014-07-10 5 views
0

사진 및 데이터 게시가 필요합니다. 오류가 발생한 경우. 그들 중 누구도 끝내지 않아야합니다. 그러나 문제는 사진이 서버에 저장된다는 것입니다. 또는 데이터가 저장됩니다.서버로 데이터를 전송하기위한 트랜잭션을 생성하십시오.

사진의 이름은 ID 뉴스 여야합니다. 나는 저장 프로 시저를 작성하는 방법을 알고 있지만 어떻게 그림을 서버로 보내고 트랜잭션의 데이터베이스에 그림의 주소를 보내는 지 모른다. ocures는 데이터를 저장하지 않습니다.

코드의 일부인이 뉴스를

  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); 

이 보내는 영상과 데이터베이스

에 그림이 보내는 주소를 보내는

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

따라서 데이터베이스 트랜잭션이 실패하면 그림을 업로드하지 않으셔도됩니다. 그리고 사진이 업로드되지 않으면 데이터베이스 트랜잭션을 커밋 (또는 롤백)하지 않으시겠습니까? –

+0

서버에 저장된 그림과 오류가 발생하면 대부분의 작업이 롤백되고 그림이 제거됩니다. 그림 주소는 null 일 수 있습니다. – nimaSadeghpour

답변

0

: 나는 본질적으로 무엇을 수집 할 수 있습니다에서

당신은 당신이

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; 
     } 
    } 
} 

편집 같은 것을 끝낼 그냥 몇 가지 조정과 함께, 그래서 이미 그것의 대부분을 갖고있는 것 같다

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); 
     } 
    } 
} 

원하는 파일 이름은 삽입 된 행의 ID에 의존하기 때문에 명시 적 데이터베이스 트랜잭션을 사용하는 단일 메소드에 있습니다.

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(); 
     } 
    } 
} 
+0

네, 좋습니다. 하지만이 작업으로 id_news (type-> int 및 identity-> yes)로 그림 이름을 바꾸려면 어떻게해야합니까? – nimaSadeghpour

관련 문제