zoukankan      html  css  js  c++  java
  • RDLC(Reportview)报表

     

    你还可以再诡异点吗——SQL日志文件不断增长

     

     

     

    前言

    今天算是遇到了一个罕见的案例。

    SQL日志文件不断增长的各种实例不用多说,园子里有很多牛人有过介绍,如果我再阐述这些陈谷子芝麻,想必已会被无数次吐槽。

    但这次我碰到的问题确实比较诡异,其解决方式也是我第一次使用。

    下文将为各位看管详细介绍我的解决思路。

    现象

    一客户反馈数据库的日志文件不断增长,已分配的磁盘空间快使用完,尝试过事务日志截断(事务日志备份)的操作,但没有任何效果。

    分析

    遇到这个问题,我最直接的感受:肯定有大的事务一直在执行,导致日志备份无法截断事务日志的大小。

    首先,我在该数据库下运行DBCC loginfo()

    clip_image002

                                              图一

    从图一的红色框可以看到,数据库的多个VLF的状态都为2,也就是active状态。(如果为0 ,表示为inactive)。

    这表明这些日志文件确实都在活动状态,一般而言,导致这种现象的原因主要有三种:长事务的运行、replication和mirroring延迟。

    但这个客户没有采用replication和mirroring,所以我初步锁定问题是因为长事务的运行导致。按照常规的方法,我只需分析下这个事务是否遇到阻塞、死锁等情况,然后给出对应的解决方案即可。(但实际情况并非如此)

    为保险起见,我运行如下语句来验证下我的判断:

    SELECT log_reuse_wait_desc, * FROM sys.databases WHERE NAME='dbname'

    image                                                                                           图二

    显然,我的判断错了,可以看到,目前【log_reuse_wait_desc】的状态为【REPLICATION】。也就是说正是事务日志分发导致日志文件不断增大的原因。

    正如前文分析的,这个数据库并没有用作发布订阅,怎么会出现这个状态呢?

    经与客户沟通,了解这个数据库其实是从一个发布订阅的数据库中还原过来的,尽管新的数据库并没有采用发布订阅,但数据库中发布订阅的一些配置选项还在,从而导致了数据库的误判,致使日志文件不断增大。

    方案

    知道了原因就好办了。

    起初我想通过sp_droppublication来完全删除分发订阅的配置,但无法通过sp_helppublication获取到@publication的名字(提示:命令已执行完!),因此这条路走不通了。

    在网上找些资料,发现了sp_removedbreplication这个存储过程,执行后再去收缩日志文件,问题果然解决!

    EXEC sp_removedbreplication dbname

    DBCC SHRINKFILE(Logfilename)

    DBCC loginfo()

    clip_image007

                                                      图三

    总结

    尽管本文的场景比较少见,但总体解决的思路与其他(日志文件不断增长)其实是一样的。少许地方不太明白可以通过网络等一些工具获得。这也说明了SQL原理的重要性,借用一本书的序言中的一句话【越接触本质越不会迷茫!】。多接触原理,很多东西都是触类旁通的。

    RDLC(Reportview)报表直接打印,支持所有浏览器,客户可在linux下浏览使用

    最近在做一个打印清单的,但是rdlc报表自带的工具栏中的打印按钮只有在ie内核下的浏览器才可以使用(其他的就会 隐藏),这导致了使用火狐和谷歌浏览器还有使用linux系统的客户打印成了问题,于是就自己百度搜,谷歌搜,然后就解决了,下面放上源码

    打印类 PrintHelp(我需要两个table座位数据源所以参数中有两个datatable)

    复制代码
      1 using System;
      2 using System.Collections.Generic;
      3 using System.Linq;
      4 using System.Web;
      5 using System.IO;
      6 using Microsoft.Reporting.WebForms;
      7 using System.Drawing.Printing;
      8 using System.Drawing.Imaging;
      9 using System.Text;
     10 using System.Data;
     11 
     12 /// <summary>
     13 /// PrintHelp 的摘要描述
     14 /// </summary>
     15 public class PrintHelp
     16 {
     17   
     18 
     19     private int m_currentPageIndex;
     20     private IList<Stream> m_streams;
     21     /// <summary>
     22     /// 
     23     /// </summary>
     24     /// <param name="reportPath">報表路徑</param>
     25     /// <param name="printerName">打印機名稱(使用默認打印機,不賦值)</param>
     26     /// <param name="dt1">報表數據源1</param>
     27     /// <param name="dt1SourceName">報表中數據源1對應名稱</param>
     28     /// <param name="dt2">報表數據源2</param>
     29     /// <param name="dt2SourceName">報表中數據源2對應名稱</param>
     30     public void Run(string reportPath, string printerName, DataTable dt1, string dt1SourceName, DataTable dt2, string dt2SourceName,bool isHindeLogo)
     31     {
     32         LocalReport report = new LocalReport();
     33         report.ReportPath = reportPath;//加上报表的路径
     34         report.DataSources.Add(new ReportDataSource(dt1SourceName, dt1));
     35         report.DataSources.Add(new ReportDataSource(dt2SourceName, dt2));
     36         report.EnableExternalImages = true;
     37         ReportParameter rp = new ReportParameter("isHindeLogoImg", isHindeLogo.ToString());//这里我在报表里弄的参数
     38         report.SetParameters(rp);
     39         Export(report);
     40         m_currentPageIndex = 0;
     41         Print(printerName);
     42     }
     43 
     44     private void Export(LocalReport report)
     45     {
     46         string deviceInfo =
     47           "<DeviceInfo>" +
     48           "  <OutputFormat>EMF</OutputFormat>" +
     49           "  <PageWidth>210mm</PageWidth>" +
     50           "  <PageHeight>297mm</PageHeight>" +
     51           "  <MarginTop>5mm</MarginTop>" +
     52           "  <MarginLeft>10mm</MarginLeft>" +
     53           "  <MarginRight>10mm</MarginRight>" +
     54           "  <MarginBottom>5mm</MarginBottom>" +
     55           "</DeviceInfo>";//这里是设置打印的格式 边距什么的
    
    56 Warning[] warnings; 57 m_streams = new List<Stream>(); 58 try 59 { 60 report.Render("Image", deviceInfo, CreateStream, out warnings);//一般情况这里会出错的 使用catch得到错误原因 一般都是简单错误 61 } 62 catch (Exception ex) 63 { 64 Exception innerEx = ex.InnerException;//取内异常。因为内异常的信息才有用,才能排除问题。 65 while (innerEx != null) 66 { 67 //MessageBox.Show(innerEx.Message); 68 string errmessage = innerEx.Message; 69 innerEx = innerEx.InnerException; 70 } 71 } 72 foreach (Stream stream in m_streams) 73 { 74 stream.Position = 0; 75 } 76 } 77 78 private Stream CreateStream(string name, string fileNameExtension, Encoding encoding, string mimeType, bool willSeek) 79 { 80 //name 需要进一步处理 81 Stream stream = new FileStream(name + DateTime.Now.Millisecond + "." + fileNameExtension, FileMode.Create);//为文件名加上时间 82 m_streams.Add(stream); 83 return stream; 84 } 85 86 private void Print(string printerName) 87 { 88 //string printerName = this.TextBox1.Text.Trim();// "傳送至 OneNote 2007"; 89 if (m_streams == null || m_streams.Count == 0) 90 return; 91 PrintDocument printDoc = new PrintDocument(); 92 // string aa = printDoc.PrinterSettings.PrinterName; 93 if (printerName.Length > 0) 94 { 95 printDoc.PrinterSettings.PrinterName = printerName; 96 } 97 foreach (PaperSize ps in printDoc.PrinterSettings.PaperSizes) 98 { 99 if (ps.PaperName == "A4") 100 { 101 printDoc.PrinterSettings.DefaultPageSettings.PaperSize = ps; 102 printDoc.DefaultPageSettings.PaperSize = ps; 103 // printDoc.PrinterSettings.IsDefaultPrinter;//知道是否是预设定的打印机 104 } 105 } 106 if (!printDoc.PrinterSettings.IsValid) 107 { 108 string msg = String.Format("Can't find printer " + printerName); 109 System.Diagnostics.Debug.WriteLine(msg); 110 return; 111 } 112 printDoc.PrintPage += new PrintPageEventHandler(PrintPage); 113 printDoc.Print(); 114 } 115 116 117 private void PrintPage(object sender, PrintPageEventArgs ev) 118 { 119 Metafile pageImage = new Metafile(m_streams[m_currentPageIndex]); 120 ev.Graphics.DrawImage(pageImage, 0, 0, 827, 1169);//設置打印尺寸 单位是像素 121 m_currentPageIndex++; 122 ev.HasMorePages = (m_currentPageIndex < m_streams.Count); 123 } 124 }
    复制代码


    调用很简单 直接一句话

                new PrintHelp().Run(AppDomain.CurrentDomain.BaseDirectory + "\Reports\Report.rdlc", this.TextBox1.Text.Trim(), stationapplication.dthead, "headsource", stationapplication.dtmessage, "datasource", true);

    由于原来的工具栏没了打印按钮 所以也就没有存在的必要了  隐藏掉 自己做一个工具栏出来

    缩放、上一页下一页首页什么的

    复制代码
     /// <summary>
        /// 刷新
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        protected void Button7_Click(object sender, EventArgs e)
        {
            this.ReportViewer1.LocalReport.Refresh();
    
        }
    
        /// <summary>
        /// 首页
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        protected void Button8_Click(object sender, EventArgs e)
        {
            this.ReportViewer1.CurrentPage = 1;
    
        }
        /// <summary>
        /// 上一页
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        protected void Button9_Click(object sender, EventArgs e)
        {
            if (this.ReportViewer1.CurrentPage != 1)
            {
                this.ReportViewer1.CurrentPage--;
    
            }
        }
        /// <summary>
        /// 下一页
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        protected void Button10_Click(object sender, EventArgs e)
        {
            if (this.ReportViewer1.CurrentPage != this.ReportViewer1.LocalReport.GetTotalPages())
            {
                this.ReportViewer1.CurrentPage++;
    
            }
        }
    
        /// <summary>
        /// 尾页
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        protected void Button11_Click(object sender, EventArgs e)
        {
            this.ReportViewer1.CurrentPage = this.ReportViewer1.LocalReport.GetTotalPages();
        }
    
        /// <summary>
        /// 缩放
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        protected void DropDownList1_SelectedIndexChanged(object sender, EventArgs e)
        {
            this.ReportViewer1.ZoomMode = ZoomMode.Percent;
            this.ReportViewer1.ZoomPercent = Convert.ToInt32(this.DropDownList1.SelectedValue);
        }
    复制代码

    导出文件

    复制代码
      protected void Button3_Click(object sender, EventArgs e)
        {
            ExportFile(FileType.PDF, "out.pdf");
        }
    
        protected void Button4_Click(object sender, EventArgs e)
        {
            ExportFile(FileType.Image, "out.jpeg");//这里可以使用任意的图片格式  只要修改out.jpeg为其他格式的名字就可以了
        }
    
        protected void Button5_Click(object sender, EventArgs e)
        {
            ExportFile(FileType.Excel, "out.xls");
        }
    
        protected void Button6_Click(object sender, EventArgs e)
        {
            ExportFile(FileType.Word, "out.doc");
        }
    
        #region 導出文件
        private void ExportFile(FileType ft, string filename)
        {
            CreateFile(ft, filename);
    
            string strPath = Server.MapPath(filename);
            DownloadFile(strPath, filename);
        }
    
        private void CreateFile(FileType ft, string filename)
        {
            Warning[] warnings;
            string[] streamids;
            string mimeType;
            string encoding = "utf-8";
            string extension;
    
            byte[] bytes = this.ReportViewer1.LocalReport.Render(ft.ToString(), null, out mimeType,
                           out encoding, out extension, out streamids, out warnings);
    
            FileStream fs = new FileStream(HttpContext.Current.Server.MapPath(filename), FileMode.Create);
            fs.Write(bytes, 0, bytes.Length);
            fs.Close();
            fs.Dispose();
        }
    
        public void DownloadFile(string path, string name)
        {
            try
            {
                System.IO.FileInfo file = new System.IO.FileInfo(path);
                Response.Clear();
                Response.Charset = "utf-8";
                Response.ContentEncoding = System.Text.Encoding.UTF8;
                // 添加头信息,为"文件下载/另存为"对话框指定默认文件名
                Response.AddHeader("Content-Disposition", "attachment; filename=" + Server.UrlEncode(name));
                // 添加头信息,指定文件大小,让浏览器能够显示下载进度
                Response.AddHeader("Content-Length", file.Length.ToString());
                // 指定返回的是一个不能被客户端读取的流,必须被下载
                Response.ContentType = "application/octet-stream";
                // 把文件流发送到客户端
                Response.WriteFile(file.FullName);
                // 停止页面的执行 
                HttpContext.Current.ApplicationInstance.CompleteRequest();
            }
            catch (Exception ex)
            {
                Response.Write("<script>alert('系统出现以下错误://n" + ex.Message + "!//n请尽快与管理员联系.')</script>");
            }
        }
    复制代码

    发送email  传真fax  什么的就不说了 很简单  搜一下一箩筐

     
     
     
    标签: c#rdlcReportview打印printasp.net
  • 相关阅读:
    标准 IO 测试 可以打开多少流
    标准 IO fprintf 与 sprintf 函数使用
    标准 IO 测试 标准输出,输入,出错缓冲大小;全缓冲文本流大小
    标准 I/O (带缓冲)
    vim 中 ctags的应用
    链表实现队列操作
    数组实现循环队列
    数组实现顺序表
    数组结构实现顺序栈
    SDOI2019快速查询
  • 原文地址:https://www.cnblogs.com/Leo_wl/p/3280939.html
Copyright © 2011-2022 走看看