Inquiridor
Abrir relatório e gravar conteúdo do mesmo no banco de dados(Oracle)

Pergunta
-
Estou tendo uma dificuldade em fazer uma operação. Tenho uma aplicação console que abre um PDF. Esse console leva o nome de Servico.exe, apesar de ter o nome de servico, ele é um exe e não um serviço. Esse abrir o PDF está ok. Criei um projeto MVC5. Usei o
ADO .Net Entity Framework
o que levou o colega Morrison afirmar que essa era uma péssima abordagem, mas como é apenas uma POC fui em frente e depois vejo outra abordagem. A minha dificuldade está em pegar o conteúdo do relatório aberto pelo console servico e gravar no banco. Abaixo a controller que deverá fazer isso. Essa controller foi gerada pelo wizard do VS2013. Não consigo montar uma action ou um método que faça isso.public class AppealReportController : Controller { private ReportDBContext db = new ReportDBContext(); // GET: AppealReport public async Task<ActionResult> Index() { var pOC_SOLIC_RELATORIO = db.POC_SOLIC_RELATORIO.Include(p => p.POC_RELATORIO); return View(await pOC_SOLIC_RELATORIO.ToListAsync()); } // GET: AppealReport/Details/5 public async Task<ActionResult> Details(int? id) { if (id == null) { return new HttpStatusCodeResult(HttpStatusCode.BadRequest); } POC_SOLIC_RELATORIO pOC_SOLIC_RELATORIO = await db.POC_SOLIC_RELATORIO.FindAsync(id); if (pOC_SOLIC_RELATORIO == null) { return HttpNotFound(); } return View(pOC_SOLIC_RELATORIO); } // GET: AppealReport/Create public ActionResult Create() { ViewBag.ID_RELATORIO = new SelectList(db.POC_RELATORIO, "ID_RELATORIO", "NM_RELATORIO"); return View(); } // POST: AppealReport/Create // To protect from overposting attacks, please enable the specific properties you want to bind to, for // more details see http://go.microsoft.com/fwlink/?LinkId=317598. [HttpPost] [ValidateAntiForgeryToken] public async Task<ActionResult> Create([Bind(Include = "ID_SOLIC_RELATORIO,ID_RELATORIO,ID_USUARIO,DT_SOLICITACAO,DT_AGENDAMENTO,DT_GERACAO,BL_RELATORIO")] POC_SOLIC_RELATORIO pOC_SOLIC_RELATORIO) { if (ModelState.IsValid) { db.POC_SOLIC_RELATORIO.Add(pOC_SOLIC_RELATORIO); await db.SaveChangesAsync(); return RedirectToAction("Index"); } ViewBag.ID_RELATORIO = new SelectList(db.POC_RELATORIO, "ID_RELATORIO", "NM_RELATORIO", pOC_SOLIC_RELATORIO.ID_RELATORIO); return View(pOC_SOLIC_RELATORIO); } // GET: AppealReport/Edit/5 public async Task<ActionResult> Edit(int? id) { if (id == null) { return new HttpStatusCodeResult(HttpStatusCode.BadRequest); } POC_SOLIC_RELATORIO pOC_SOLIC_RELATORIO = await db.POC_SOLIC_RELATORIO.FindAsync(id); if (pOC_SOLIC_RELATORIO == null) { return HttpNotFound(); } ViewBag.ID_RELATORIO = new SelectList(db.POC_RELATORIO, "ID_RELATORIO", "NM_RELATORIO", pOC_SOLIC_RELATORIO.ID_RELATORIO); return View(pOC_SOLIC_RELATORIO); } // POST: AppealReport/Edit/5 // To protect from overposting attacks, please enable the specific properties you want to bind to, for // more details see http://go.microsoft.com/fwlink/?LinkId=317598. [HttpPost] [ValidateAntiForgeryToken] public async Task<ActionResult> Edit([Bind(Include = "ID_SOLIC_RELATORIO,ID_RELATORIO,ID_USUARIO,DT_SOLICITACAO,DT_AGENDAMENTO,DT_GERACAO,BL_RELATORIO")] POC_SOLIC_RELATORIO pOC_SOLIC_RELATORIO) { if (ModelState.IsValid) { db.Entry(pOC_SOLIC_RELATORIO).State = EntityState.Modified; await db.SaveChangesAsync(); return RedirectToAction("Index"); } ViewBag.ID_RELATORIO = new SelectList(db.POC_RELATORIO, "ID_RELATORIO", "NM_RELATORIO", pOC_SOLIC_RELATORIO.ID_RELATORIO); return View(pOC_SOLIC_RELATORIO); } // GET: AppealReport/Delete/5 public async Task<ActionResult> Delete(int? id) { if (id == null) { return new HttpStatusCodeResult(HttpStatusCode.BadRequest); } POC_SOLIC_RELATORIO pOC_SOLIC_RELATORIO = await db.POC_SOLIC_RELATORIO.FindAsync(id); if (pOC_SOLIC_RELATORIO == null) { return HttpNotFound(); } return View(pOC_SOLIC_RELATORIO); } // POST: AppealReport/Delete/5 [HttpPost, ActionName("Delete")] [ValidateAntiForgeryToken] public async Task<ActionResult> DeleteConfirmed(int id) { POC_SOLIC_RELATORIO pOC_SOLIC_RELATORIO = await db.POC_SOLIC_RELATORIO.FindAsync(id); db.POC_SOLIC_RELATORIO.Remove(pOC_SOLIC_RELATORIO); await db.SaveChangesAsync(); return RedirectToAction("Index"); } protected override void Dispose(bool disposing) { if (disposing) { db.Dispose(); } base.Dispose(disposing); } }
Todas as Respostas
-
Deu certo assim:
protected static byte[] AbrirExecutavelExtrairPdf() { var proc = new Process { StartInfo = new ProcessStartInfo { FileName = @"C:\Projetos\Servicos\bin\Servicos.exe", Arguments = "", UseShellExecute = false, RedirectStandardOutput = true, RedirectStandardError = true, RedirectStandardInput = true, WorkingDirectory = @"C:\Projetos\Servicos\bin", CreateNoWindow = true } }; proc.Start(); using (var ms = new MemoryStream()) { using (var sOut = proc.StandardOutput.BaseStream) { byte[] buffer = new byte[4096]; int read; while ((read = sOut.Read(buffer, 0, buffer.Length)) > 0) { ms.Write(buffer, 0, read); } } string error = proc.StandardError.ReadToEnd(); if (ms.Length == 0) { throw new Exception(error); } proc.WaitForExit(); return ms.ToArray(); } }
Mas não sei com fazer para abrir o array gerado e visualizar. Gravei assim:
if (ModelState.IsValid)
{
db.POC_SOLIC_RELATORIO.Add(pOC_SOLIC_RELATORIO);
pOC_SOLIC_RELATORIO.BL_RELATORIO = AbrirExecutavelExtrairPdf();
await db.SaveChangesAsync();
return RedirectToAction("Index");
}O campo BL_RELATORIO é onde eu gravo o binário contendo, teoricamente o PDF.