2013-12-12 4 views
0

편집 후 DB에 저장된 barchart를 업데이트해야합니다. 나는 20hrs 정도의 예제를 보았지만 함께 사용했다. 내 클래스MVC4 EF5 비트 맵 이미지 업데이트 - db in save

public class Task 
{ 
    public int TaskID { get; set; } 
    public DateTime? SStart { get; set; } 
    public DateTime? SEnd { get; set; } 
    public DateTime? SCert { get; set; } 
    public byte? Taskimage { get; set; } 
} 

내 컨트롤러 : 날짜가 변경된 후

[HttpPost] 
    [ValidateAntiForgeryToken] 
    public ActionResult Edit(Task task) 
    { 
     if (ModelState.IsValid) 
     { db.Entry(task).State = EntityState.Modified; 
      db.SaveChanges(); 
      // now create a new graph using the returned viewbag data 

      var Mytopleft = 0; 
      var Mytext = ""; 
      Bitmap mybmp = new Bitmap(400, 20); 
      Graphics g = Graphics.FromImage(mybmp); 
      g.DrawRectangle(Pens.Black, 0, 0, 400, 20); 
      SolidBrush b = new SolidBrush(Color.OldLace); 
      g.FillRectangle(b, 0, 0, 400, 20); 
      // draw comma-delimited elements in multiple colors 
      string[] chunks = Mytext.Split(','); 
      var brush = new SolidBrush(Color.Black); 
      SolidBrush[] brushes = new SolidBrush[] 
       { new SolidBrush(Color.OldLace),   //removed 3 other brushes for clarity 
       }; 
      int c = 0; 
      var tasks = db.Tasks.Include(t => t.Builder).Include(t => t.Lot); 
      foreach (var titem in tasks.ToList()) 
      { 
       if (titem.SStart == null) 
       { c = 0; } 
       else if (titem.SStart != null && titem.SEnd == null) 
       { c = 1; }        //removed 3 other cases for clarity 
       // create a new rectangle displaced by offset and with color 
       g.FillRectangle(brushes[c], Mytopleft, 0, 10, 20); 
       Mytopleft += 10; 
      }     
           //write to folder as a test this works Gif is arbitrary. 
           //can't use c:\\lot1.bmp -- can't write to root dir 
      mybmp.Save("C:\\temp\\lot1.gif", System.Drawing.Imaging.ImageFormat.Gif); 

      MemoryStream ms = new MemoryStream(); 
      mybmp.Save(ms, System.Drawing.Imaging.ImageFormat.Bmp); 

      db.SaveChanges(); 
} 

그래서, 나는 막대 그래프를 수정하고 DB에 저장되어있는 TaskImage 이미지를 업데이트 할 수 있습니다.

mybmp를 작성하면 파일이 임시 폴더에 테스트로 기록됩니다.

나는 며칠 동안 TaskImage에 mybmp를 저장하는 방법을 이해하려고 노력 해왔다. 내 혼란의 일부는 과제라고 생각합니다. 예전에는 mybmp = toarry (System.Drawing.Imageing.ImageFormat.Gif)와 같은 작업을 수행했습니다. 나는 그것이 MVC C#에서 작동한다고 생각하지 않는다. 이미지는 실제로 System.Drawing.Image에 있고 그것이 생성되고 수정 될 때 생각합니다.

개요 : MVC4 EF5 코드 우선
- 생성 된 이미지를 memorystream에 저장 ????
- 바이트 배열
에 MemoryStream을 변환 - TaskImage 필드 바이트 []를 참조
- 우리는 변형을 갖도록 .STATE 말해 ....... db.Entry (태스크) .STATE = EntityState.Modified;
- 변경 사항을 저장하고 기존 이미지를 덮어 쓰는 중 .... db.SaveChanges();

나는 이것이 올바른 논리라고 생각한다. 기존 이미지를 수정하지 않고 전체 다시 그리기를 수행하므로 먼저 검색 할 필요가 없습니다. BTW 내가이 작업을 얻은 후에는 편집 된 테이블이 아닌 관련 테이블에 TaskImage를 저장하도록 코드를 변경합니다. 나는 그것이 당신의 대답 구조를 바꿀 것이라고 생각하지 않습니다.

보기를 검색하고 전달하는 많은 예제가 있습니다. 나는 그것을 처리 할 수 ​​있다고 생각한다.

Stumped !! 감사합니다

답변

0

여기에 다른 사람들을 돕기 위해 많은 일들과 마찬가지로 코드 을하고있다. 관련 테이블에 쓰기 때문에, lottoupdate.

mybmp.Save(ms, System.Drawing.Imaging.ImageFormat.Gif); 
     byte[] byteArray = new byte[0]; 
     ms.Close(); 
     var lottoupdate = db.Lots    //each task row contains the lotid to which 
       .Where(i => i.LotID == lotID) //it is associated. Find the LotID then 
       .Single();     // update the taskimage field in the lot class 
     byteArray = ms.ToArray(); 
     lottoupdate.TaskImage = byteArray; 
     db.Entry(lottoupdate).State = EntityState.Modified; 
     db.SaveChanges(); 

다른 사람에게 도움이되기를 바랍니다. 이 이미지를 검색하고보기에 표시이 질문 보려면 : I가와에서 본 적이 이미지는 [] 2 challanges

0

의사 코드 :
- 만든 이미지를 memorystream ???
- 바이트 배열
에 MemoryStream을 변환 - TaskImage 필드 바이트 []를 참조
- 우리는 변형을 갖도록 .STATE 말해 ....... db.Entry (태스크) .STATE = EntityState.Modified;
- 변경 사항을 저장하고 기존 이미지를 덮어 쓰는 중 .... db.SaveChanges();

괜찮아 보입니다.

코드가 필요한 이유는 무엇입니까?

mybmp.Save("C:\\temp\\lot1.gif", System.Drawing.Imaging.ImageFormat.Gif); 

     MemoryStream ms = new MemoryStream(); 
     mybmp.Save(ms, System.Drawing.Imaging.ImageFormat.Bmp); 

파일 또는 EF 테이블에 저장 하시겠습니까? 제목에 Db로 저장이 표시됩니다.

사실 "문제 또는 오류"는 명확하지 않습니다.

정말 질문입니까? 이미지를 byteArray로 변환하고 다시 변환하는 방법? Byte [] 유형의 필드가있는 DB에서 레코드를 저장하고 검색하는 것이 문제가 아니므로? 그래서 나는 당신이

public static byte[] ImageToByteArray(Image image) 
    { 
     var memoryStream = new MemoryStream(); 
     image.Save(memoryStream, System.Drawing.Imaging.ImageFormat.Jpeg); // consider format 
     return memoryStream.ToArray(); 
    } 

    public static Image ByteArrayToImage(byte[] byteArray) 
    { 
     var memoryStream = new MemoryStream(byteArray); 
     Image image = Image.FromStream(memoryStream); 
     return image; 
    } 

편집이 필요 같아요 공용 클래스 작업 { 공공 INT TaskID를 {얻을; 세트; } 공개 DateTime? SStart {get; 세트; } 공개 DateTime? SEnd {get; 세트; } 공개 DateTime? SCert {get; 세트; } public byte? Taskimage {get; 세트; } // < < < < < < make 바이트 배열 ?????? } 내 컨트롤러 : 당신이 그것을 알아내는 것이이 작품 아주 간단 한 번

[HttpPost] 
[ValidateAntiForgeryToken] 
public ActionResult Edit(Task task) 
{ 
    if (ModelState.IsValid) 
    { 


     // 
     // now create a new graph using the returned viewbag data 
     Image graph = CreateImageFromViewBag(viewbag); // refactored out... 
     task.Image = ImageToByteArray(graph); 

     db.Entry(task).State = EntityState.Modified; 


     db.SaveChanges(); 

}

+0

생각했던 것보다 더 열심히 바이트를하지만, "반환"을 받아 작성하는 방법을 알아낼 수 그것을 EF 테이블의 TaskImage 필드에 추가합니다. – user2887440

+0

원리를 인라인 코드로 변환하는 방법. 그것은 "return"을 가져와 EF 테이블의 TaskImage 필드에 씁니다. line image.Save (ms, System.Drawing.Imaging.ImageFormat.Jpeg)는 ms에 이미지를 저장하는 것 같습니다. ms.ToArray)는 바이트 []로 변환합니다. 이제 TaskImage에 .ToArray()를 "할당"하는 코드가 필요합니다. 그럼 내 db.Entry .... 레코드를 업데이 트됩니다 가정합니다. – user2887440

+0

네, 어떻게 문제가 메모리 스트림에서 db.save 얻을 수 있습니다. Task.TaskImage = ImageFromStream (ms.ToArray())와 같은 것; @phil – user2887440