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

  • 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);
            }
        }
    sexta-feira, 6 de novembro de 2015 12:45

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.

    sexta-feira, 6 de novembro de 2015 15:18