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

 

前言

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

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

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

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

现象

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

分析

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

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

图一

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

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

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

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

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

                                                                                           图二

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

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

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

方案

知道了原因就好办了。

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

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

EXEC sp_removedbreplication dbname

DBCC SHRINKFILE(Logfilename)

DBCC loginfo()

图三

总结

尽管本文的场景比较少见,但总体解决的思路与其他(日志文件不断增长)其实是一样的。少许地方不太明白可以通过网络等一些工具获得。这也说明了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

RDLC(Reportview)报表的更多相关文章

  1. RDLC 主从报表筛选

    今天继续学习RDLC报表的“参数传递”及“主从报表” 一.先创建DataSet,如下图: 二.创建一个报表rptDEPT.rdlc,显示部门T_DPET的数据 三.嵌入Default.aspx中,写在 ...

  2. ReportView报表开发记录(一)

    在公司开发,使用到ReportView技术,写下自己的经验. 1.在工具箱中找到 ReportViewer,ScriptManager放到test.aspx页面. 如果找不到报表项,请参考http:/ ...

  3. RDLC 子报表

    1.RDLC 设计页面,拖入table或者矩形 2.右击表格或者矩形单元格,插入--子报表 3.输入名称和将此报表用作子报表 名称:显示在设计页面上的,仅作观看作用 将此报表用作子报表:填写目录下的需 ...

  4. 使用VS自带的报表RDLC结合报表控件ReportViewer使用

    1.新建一个报表,设置报表之后,使用强类型的DataSet  xsd 配置数据源,对报表中的使用最常用的是文本框和表格控件 2.新增WebForm窗体,拖一个ReportViewer控件,在WebFo ...

  5. RDLC 图形报表预览时 “本地报表处理期间错误”

    在RDLC报表中有图形报表的导出和打印都正常,但预览时"本地报表处理期间错误",这是因为你设置的图形太宽已经超过默认的A4 纸的宽度,解决办法:报表页面的报表--->报表属性 ...

  6. rdlc水晶报表在wpf里的使用

    1引用程序集 Microsoft.ReportViewer.WinForms 2 xaml 命名空间 xmlns:rv="clr-namespace:Microsoft.Reporting. ...

  7. RDLC 微软报表 导出Excel时产生多个工作表 (worksheet)

    . I have added two obejcts data source to Report Viewer. 2. in RDLC i have created two tables and in ...

  8. RDLC 微软报表 自定义函数

    报表的空白处点右键,报表属性,CODE,按下面的格式输入自定义函数: Shared Function ShowDate(value as DateTime) as string if value< ...

  9. 分享一个动态生成RDLC报表的类

    在实际工作中,当需要进行大批量查询和生成报表的时候,可以使用我写的类. 特点: 无需报表设计器.无需为报表设置数据集 只需要传入查询结果就可以全自动生成报表,传入的对象为Dynamic(目前支持Dat ...

随机推荐

  1. 矿Mac必备软件

    1.Svn工具: Cornerstone_v2.7.10 2.iPhone配置文件管理 iPhoneConfigUtility.dmg 3.有道 for mac http://cidian.youda ...

  2. 速度 Github

    首先需要了解.git 是版本号的管理工具,为了能够把任意代码托管执照:github 其中一个是. 应用 github 什么不该说的帐户. 那么,申请后,在需求 github 并建立了独特的本地机器上的 ...

  3. linux c ping 实现

    用c语言实现的linux中的ping命令 #include <stdio.h> #include <signal.h> #include <arpa/inet.h> ...

  4. 瘸腿蛤蟆笔记29-cocos2d-x-3.2 Box2d物理引擎dynamics模块介绍

    转载标明出处:http://blog.csdn.net/notbaron/article/details/38611335 上篇回想 本篇名言:奋斗.寻觅.发现,而不屈服.[诗人丁尼生] 上篇中,我们 ...

  5. GIMP也疯狂之动态图的制作(四)

    本篇文章为gimp制作动态图的第四篇.在之前的基础上简单的拓展了下思路.就能做出蛮实用的动态图.本文将介绍两个动态图.第一个为在一张静态图上添加动态图,第二个图为修改部分渐变. 效果: 素材: 其实, ...

  6. C#中抽象类和接口的区别

    原文:C#中抽象类和接口的区别 大家在编程时都容易把抽象类和接口搞混,下面为大家从概念上讲解抽象类和接口的区别: 一.抽象类: 含有abstract修饰符的class即为抽象类,抽象类是特殊的类,只是 ...

  7. C++在struct与class差异

    在C++中,既能够用structkeyword进行类的定义,也能够用classkeyword进行类的定义,那么这两者究竟有什么差别呢? 唯一的一点差别是:struct和class的默认訪问权限不一样. ...

  8. HDU 5185 Equation (DP)

    题目:LINK 题意:求满足题目要求的x序列的种类数. 能够发现符合条件的序列去重后是一个0, 1, ..., k的连续序列(k满足k*(k+1)/2 <= n) ,则这个去重后的序列长度最长为 ...

  9. Singal Page App:使用Knockout和RequireJS创建高度模块化的单页应用引擎

    Singal Page App 开篇扯淡 距离上一篇文章已经有好几个月,也不是没有时间记录点东西,主要是换了新的工作,在一家外资工作,目前的工作内容大多都是前端开发,新接触的东西因为时间原因,大多还不 ...

  10. 【转】android中TextAppearanceSpan的使用

    android中TextAppearanceSpan的使用 Posted on April 17, 2011 在android中如何想word中一样对文字进行丰富的风格设置呢? TextAppeara ...