GVKun编程网logo

C#Winform-如何通过将3个变量传递到ReportViewer来显示实时报告,即Reportname(RDL文件),SQLstring和Connectionstring

10

最近很多小伙伴都在问C#Winform-如何通过将3个变量传递到ReportViewer来显示实时报告,即Reportname和RDL文件,SQLstring和Connectionstring这两个问

最近很多小伙伴都在问C#Winform-如何通过将3个变量传递到ReportViewer来显示实时报告,即ReportnameRDL文件,SQLstring和Connectionstring这两个问题,那么本篇文章就来给大家详细解答一下,同时本文还将给你拓展.Net Web.Config Transformations,替换整个ConnectionString部分、asp.net – 在网页上的ReportViewer控件中呈现时,Reporting Services图表文本模糊、asp.net-core – 来自带有Entity Framework Core的Data Tier中的appsettings.json的ConnectionString、BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding等相关知识,下面开始了哦!

本文目录一览:

C#Winform-如何通过将3个变量传递到ReportViewer来显示实时报告,即Reportname(RDL文件),SQLstring和Connectionstring

C#Winform-如何通过将3个变量传递到ReportViewer来显示实时报告,即Reportname(RDL文件),SQLstring和Connectionstring

将RDL文件,SQL和连接字符串传递到Winform C#项目上的ReportViewer控件以在运行时显示报表的最优雅的方法是什么。

介绍:

  • 我最近开始在Windows上创建报表。我发现RDLC文件充当静态文件,不需要连接字符串或SQL语句,因此我们需要将DataSource传递给它,以便在运行时用数据填充它。这不符合我们的目的。
  • 但是,RDL文件可以采用保存在XML标记中的SQL语句和连接字符串,并用于生成动态报告。

鉴于我有

  1. RDL报告模板
  2. SQL语句
  3. 与数据库的连接字符串

将信息传递到C#Winform中的ReportViewer生成报表的最佳方法是什么?

1)对于用于图书馆管理系统的RDL。(我们无法控制这些文件,这些文件由我们的应用程序的用户使用)。

  <Query>    <DataSourceName>DS1</DataSourceName>    <CommandText>select bk_book_details.id, bk_book_details.book_id, bk_book_details.book_no, bk_book_details.book_name, bk_book_details.edition_id, bk_book_details.condition_id, bk_book_details.publication_year, bk_book_details.price, bk_book_details.purchase_price, bk_book_details.reference_no, bk_book_details.book_status, bk_book_details.purchase_id, bk_book_details.purchase_date from bk_book_details</CommandText>  </Query>

2)这是SQL语句

select bk_book_details.id, bk_book_details.book_id, bk_book_details.book_no, bk_book_details.book_name, bk_book_details.edition_id, bk_book_details.condition_id, bk_book_details.publication_year, bk_book_details.price, bk_book_details.purchase_price, bk_book_details.reference_no, bk_book_details.book_status, bk_book_details.purchase_id, bk_book_details.purchase_date from bk_book_details

3)这是连接字符串

server=localhost;User Id=root;password=root;Persist Security Info=True;database=lms

当前输出: 如在RDLReader.exe应用程序上看到的

用于获取此输出的代码

    private void btnReport_Click(object sender, EventArgs e) {        string sql = "select bk_book_details.id, bk_book_details.book_id, bk_book_details.book_no, bk_book_details.book_name, bk_book_details.edition_id, bk_book_details.condition_id, bk_book_details.publication_year, bk_book_details.price, bk_book_details.purchase_price, bk_book_details.reference_no, bk_book_details.book_status, bk_book_details.purchase_id, bk_book_details.purchase_date from bk_book_details";        string RDLReaderApplication = @"""""""" + Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location) + @""\ReaderPath\RDLReader.exe"" + @"""""""";        string reportFile = @"""""""" + Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location) + @""\Reports\ReportFile.RDL"" + @"""""""";        string connectionString = @"""""""" + "server=localhost;User Id=root;password=root;Persist Security Info=True;database=lms" + @"""""""";        Process.Start(RDLReaderApplication, reportFile + "" "" + @"""""""" + sql + @"""""""" + "" "" + connectionString);    }

预期产量:

在此处输入图片说明

到目前为止的工作:

表单ReportForm包含ReportViewer停靠在表单上的控件。

附加信息:

1)我希望将这3个数据发送到ReportViewerControl,以不同的形式停靠,然后将报告加载到ReportViewer上。

2)我们的用户不与我们共享连接,因此我们无法在RDL文件中对其进行硬编码。SQL通常是一个常数,并且RDL文件通常根据特定格式的需要设计一次。

3)我们现在使用MySQL数据库。但是任何流行的RDBMS中的解决方案都会有很大帮助。我希望上面的查询能很好地描述正在访问的表的架构(查询包含表中的所有列)。

注意:请在RDL文件而不是RDLC文件中包括答案。

除了@Reza Aghaei给出的答案外,最终为我解决了什么问题

报表文件在RDL文件的开头就具有用于数据源和数据集的标签,如以下代码段所示

  <DataSets>    <DataSet Name="Data">      <Query>        <DataSourceName>DS1</DataSourceName>

来自@Reza
Aghaei的行,要求提供数据集(Data)的名称,而不是DataSourceName(DS1)的名称。区分这一点对于使报告文件正常工作至关重要。

var rds = new Microsoft.Reporting.WinForms.ReportDataSource("DataSet1", this.ReportData);

更改为:

var rds = new Microsoft.Reporting.WinForms.ReportDataSource("Data", this.ReportData);

答案1

小编典典

您可以使用ReportForm下面的单个符号,并将数据和报告名称传递给它。报告表单应包含一个ReportViewer控件和以下代码:

public partial class ReportForm : Form{    public ReportForm()    {        InitializeComponent();        this.Load+=new EventHandler(ReportForm_Load);    }    public Object ReportData { get; set; }    public string ReportName { get; set; }    private void ReportForm_Load(object sender, EventArgs e)    {        var rds = new Microsoft.Reporting.WinForms.ReportDataSource("DataSet1",            this.ReportData);        this.reportViewer1.LocalReport.DataSources.Clear();        this.reportViewer1.LocalReport.DataSources.Add(rds);                 var path = System.IO.Path.Combine(Application.StartupPath,             "Reports", this.ReportName);        reportViewer1.LocalReport.ReportPath = path;        this.reportViewer1.RefreshReport();    }}

用法

您可以使用ReportForm这种方式:

var f = new ReportForm();DataTable table = new DataTable(); var command = Properties.Settings.Default.Command;        /*SELECT Statement*/var connection = Properties.Settings.Default.Connection;  /*Connection String*/using (var adapter = new SqlDataAdapter(command, connection))    adapter.Fill(table)f.ReportName = "Report1.rdlc" /*Or any other name*/f.ReportData = table;f.ShowDialog();

笔记

  1. ReportViewer控件显示RDLC报告。RDL报表应托管在SQL Server报表服务上。看来您想在客户端计算机上而不是在SSRS上获得报告。如果是这种情况,则需要RDLC报告。尽管RDL和RDLC具有相同的XML模式,但是从技术上讲,您似乎需要RDLC。

  2. 您说过, RDL文件通常是设计一次的, 因此客户可以在其计算机上拥有报告文件,并且您可以仅按报告的地址将报告加载到报告视图中,甚至可以将这些报告放入解决方案中并将其嵌入为资源。将报表设置为嵌入式资源时,可以按其名称加载报表:

    reportViewer1.LocalReport.ReportEmbeddedResource = "Sample.Reports.Report1.rdlc";

或按路径加载报告:

    var path = System.IO.Path.Combine(Application.StartupPath, "Reports", "Report1.rdlc");reportViewer1.LocalReport.ReportPath = path;
  1. 您说过 ,SQL通常是一个常量。 并且 我们的用户不与我们共享连接, 因此您可以使用Settings.settings并添加2个属性(Command应用程序范围Connection和用户范围)。因此,您可以让用户在运行时更改连接字符串,然后以这种方式加载数据并将数据传递给您ReportForm

    DataTable table = new DataTable();

    var command = Properties.Settings.Default.Command;
    var connection = Properties.Settings.Default.Connection;
    using (var adapter = new SqlDataAdapter(command, connection))
    adapter.Fill(table)
    //Pass table to ReportForm

  2. 实际上,sql命令可以是动态的,但它应保持恒定的结果模式。结果列名称不应更改,因为报表引擎使用查询列名称在报表字段中显示数据。因此,您也可以将Command属性创建为User设置。

  3. 关于 But但是,在任何流行的RDBMS中都是一种解决方案, 最好使用依赖项注入来注入可以为您加载数据的库。这样,您可以为不同的DBMS使用不同的dll,并在需要时注入合适的dll。

.Net Web.Config Transformations,替换整个ConnectionString部分

.Net Web.Config Transformations,替换整个ConnectionString部分

我一直在使用web.config转换取得了很好的成功.我刚刚实现了连接字符串加密,并且不确定如何修改我的Release转换.

在此之前我只是使用定位器替换名称.

现在设置已加密,没有名称.

<connectionStrings configProtectionProvider="Pkcs12Provider">
<EncryptedData Type="http://www.w3.org/2001/04/xmlenc#Element"
  xmlns="http://www.w3.org/2001/04/xmlenc#">
  <EncryptionMethod Algorithm="http://www.w3.org/2001/04/xmlenc#aes192-cbc" />
  <KeyInfo xmlns="http://www.w3.org/2000/09/xmldsig#">
    <EncryptedKey xmlns="http://www.w3.org/2001/04/xmlenc#">
      <EncryptionMethod Algorithm="http://www.w3.org/2001/04/xmlenc#rsa-1_5" />
      <KeyInfo xmlns="http://www.w3.org/2000/09/xmldsig#">
        <KeyName>rsaKey</KeyName>
      </KeyInfo>
      <CipherData>
        <CipherValue>CipherValueHere</CipherValue>
      </CipherData>
    </EncryptedKey>
  </KeyInfo>
  <CipherData>
    <CipherValue>CipherValueHere</CipherValue>
  </CipherData>
</EncryptedData>

如何更新我的转换以用此替换整个连接字符串部分?是否有元素名称“connectionStrings”的定位器?

非常感谢,
约翰

解决方法

要替换整个connectionString部分,请使用以下代码

<connectionStrings xdt:Transform="Replace">

xdt:Transform =“Replace”会做的伎俩.干杯!!

asp.net – 在网页上的ReportViewer控件中呈现时,Reporting Services图表文本模糊

asp.net – 在网页上的ReportViewer控件中呈现时,Reporting Services图表文本模糊

问题

我们使用Reporting Services报告和ReportViewer控件在网页上呈现条形图.有时图表上的文字很清晰:

但大多数情况下,图表上的文字模糊不清:

到底是怎么回事?

采取的措施解决和其他信息

>广泛搜索网络和SO
>尝试了不同的浏览器,用户和机器;无法确定韵律或模糊的原因
>尝试了SSRS报告属性DynamicHeight和DynamicWidth的几个设置
>在Firefox中,右键单击图表图像并选择“查看图像”时,显示的图像始终清晰
>在有边界的图表上,这个问题似乎更为突出;删除图表上的边框,但问题仍然存在

影响浏览器

> Firefox 15.0
> Chrome 23.0.1271.97米
> IE 9但仅在浏览器模式下= IE9,文档模式= IE9标准

环境

> Visual Studio 2010专业版
> .NET 4.0
> IIS 7.0
> Reporting Services 2008
> ReportViewer控件版本10

解决方法

原因

ReportViewer控件将图表呈现为PNG图像. ReportViewer将宽度,高度和最小宽度属性添加到图像的CSS中.这些CSS属性会导致图像在浏览器中缩小到稍小的尺寸.图像缩放导致观察到的模糊.

解析度

通过使用额外的CSS来覆盖ReportViewer呈现的多个CSS属性,我们的环境中解决了该问题. Reporting Services图表在BIDS中被赋予一个特殊标记,因此CSS选择器可以找到受影响的图像.

步骤1.为图表提供其ToolTip属性的唯一值:

(此示例中的唯一值是MyOfficeChart.)

当图表呈现为< img>时,< img> tag的alt和title属性设置为此值.

第2步.创建CSS以选择< img>通过title属性的唯一值,并覆盖导致问题的CSS:

img[title$='MyOfficeChart']
{
    height:auto !important;
    width:auto !important;
    min-width:0 !important;
}

这些步骤解决了所有浏览器和用户的问题,以及图表是否具有边框.

asp.net-core – 来自带有Entity Framework Core的Data Tier中的appsettings.json的ConnectionString

asp.net-core – 来自带有Entity Framework Core的Data Tier中的appsettings.json的ConnectionString

我有一个新的应用程序,我正在使用Entity Framework Core构建ASP.NET Core.该应用程序具有UI,模型,业务和数据层.在以前的ASP.NET版本中,您可以在web.config中设置连接字符串,默认情况下它将在引用的层中可用.在使用appsettings.json(或其他配置选项)的ASP.NET Core中,这似乎不是相同的情况?有关如何实现这一点的任何想法?我在数据层中配置了dbcontext,但我目前正在对连接字符串进行硬编码.

我看到的所有示例都在startup.cs的UI层中配置了dbcontext.这就是我想要避免的.

问题Here得到了主题.

解决方法

您可以轻松地将IServiceCollection的扩展方法添加到业务/服务层,并使用它来注册自己的依赖项.然后在启动时,您只需在服务层上调用该方法,而无需在Web应用程序中引用EntityFramework.

using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.DependencyInjection.Extensions;

namespace your.service.layer
{
    public static class MyServiceCollectionExtensions
    {
        public static IServiceCollection AddMyServiceDependencies(this IServiceCollection services,string connectionString)
        {
             services.AddEntityFrameworksqlServer()
            .AddDbContext<YourDbContext>((serviceProvider,options) =>
            options.UsesqlServer(connectionString)
                   .UseInternalServiceProvider(serviceProvider)
                   );
             return services;
        }
    }

}

启动:

using your.service.layer;

public void ConfigureServices(IServiceCollection services)
{
    var connectionString = Configuration.GetConnectionString("EntityFrameworkConnectionString");
    services.AddMyServiceDependencies(connectionString);
}

现在,您的网络应用仅需要对您的业务/服务层的引用,并且它不直接依赖于EntityFramework.

BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding

BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding

## 摘要: 提出了一个新的语言表示模型 (language representation), BERT: Bidirectional Encoder Representations from Transformers。不同于以往提出的语言表示模型,它在每一层的每个位置都能利用其左右两侧的信息用于学习,因此,它具有强大的表示能力,所以,BERT 在预训练之后,只需要加一个简单的输出层,并在新结构上 fine-tuned 就能获得 SOTA 的结果。

## 引言 语言模型预训练在自然语言处理任务中占据着越来越重要的位置。当前有两种方法将预训练的特征表示用于具体的任务,分别是:

  1. feature based。 如 ELMo 针对不同的任务使用不同的网络结构,并将预训练的特征表示作为额外的特征输入到具体的网络中。
  2. fine-tuning。如 GPT,对不同的任务只引入很少的额外参数,在应用到下游任务时直接在 pre-train 的网络上 fine-tune。

它们的目标函数都是单向的语言模型。从左到右的单向语言模型的表达能力有限,因为在 attention layer 中,每个单词只能获取到其左边的信息,而在 SQuAD 这样的 token-level 的任务中,获取左右两边的信息是至关重要的。BERT 提出了两个新的预训练的目标函数:

  1. Masked Language Model
  2. Next Sentence Prediction

其中 MLM 的目标函数允许 BERT 采用双向的 attention(一般的 LM 建模只能是单向的,因为如果采用双向 attention,那么对于指定 token,其在网络下一层的输入信息会包含当前 token 的相关信息,因为信息是双向流动的,每个 token 位置都能获取整个句子的信息,由于 LM 的任务是给定一个序列,预测序列的下一个 token,所以 LM 不能获取 token 后面的信息,BERT 采用的是双向的 attention,相当于 Transformer 中的 encoder 部分)。MLM 能使用双向的 attention 是因为其随机屏蔽一段句子中的一部分单词,然后 MLM 的任务就是预测这些被屏蔽的单词,所以即便信息是双向流动,也不导致信息泄露。

BERT

### 模型结构 BERT 的每一层都是 transformer 中的双向 encoder 结构,假设 层数为 L,hidden size 为 H,self-attention head 的个数为 A, 设 feedforward 部分的 hidden size 为 4H。 BERT base: L=12,H=768,A=12, total parameter:110M BERT large:L=24, H=1024,A=16, total parameter:340M BERT 与 GPT 和 ELMo 的结构对比如上图。 bert 是 language understanding model,因为他的信息是双向流动的,不好做 generation 的任务,双向的 transformer 也被称为 transformer ecoder。 gpt 是 language generation model, 他基于单向的 lm,所以可以做序列生成的任务,也被称为 transformer decoder, 但其实称为 transformer decoder 并不准确,因为 transformer decoder 除了 self-attention 之外还有来自 encoder 的 cross-attention,但 gpt 并没有 cross-attention。

### 输入表示

输入可以分为三部分,分别是 token 的表示,segment 的表示 (用于区分句子 A 和句子 B,比如 QA 等问题需要涉及 sentence-level 的学习), 和 positional encoding.

### 预训练任务
Masked LM 随机屏蔽掉一部分 token, MLM 的任务是根据未屏蔽的 token 预测被屏蔽的 token. 每个句子屏蔽 15% 的单词,用 [MASK] 替代,但是这种做法会导致 预训练过程和 fine-tining 阶段不匹配,因为 fine-tuning 阶段没有 [MASK] 这个 token。所以,并不总是将 masked 单词替换成 [MASK],具体做法如下: a. 对于被 15% 被替换的单词,80% 的时间都是用 [MASK] 替换 b. 10% 的时间随机选择一个单词替代 c. 10% 的时间保持不变 transformer encoder 不知道它要预测的是哪个单词,也不知道哪个单词是被随机替换的,所以,对于每个单词,它都需要学习到上下文的表示分布情况(这个比较玄学)。而且只有 1.5% 的单词被随机替换了,这并不不会干扰模型的学习。

MLM 的另一个缺点是在每个 batch 中只会预测 15% 的 token,相比于预测全部的 token,它需要更多的迭代次数以收敛。

  • Next Sentence Prediction 很多 nlp 任务比如 Question Answering (QA), Natural Language Inference (NLI) 都需要理解句子间的关系,而在 语言建模中这种关系并不会直接体现。bert 在预训练中加入了一个二分类任务:判断一个句子是不是另一个句子的下一句。

实验

GLUE dataset

这是一个用于 language understanding 模型的数据集合,其中有 single-sentence 的任务也有 sentence-pair 的任务,如上图 (a) 所示,两个句子拼接在一起,通过 segment embedding 区分句子 A 和句子 B,取第一个 token [CLS] 在最后一层对应的 hidden state 作为整个 sequence 的 represention C,然后将 C 与待 fine-tunning 的参数 W 相乘之后取 softmax 就是分类的各类概率。

SQuAD v1.1

问答数据集。如上图 (c) 所示, 问答的输入一个问题以及一段话,需要在这一段话中找到问题的答案,具体到这里的任务其实是定位答案在这一段话中的位置,所以需要找到 start position 和 end position。在 fine-tunning 阶段需要学习一个 start vector $S\in R^{H}$ 和一个 end vector $E\in R^{H}$,对于每个 token,其最后一层的 hidden state 表示为 $T_i\in R^{H}$,那么每个 token 为 start token 的概率为: Pi=eSTijeSTj

。同理可计算 end token 的概率。

Named Entity Recognition

CoNLL2003 中的每个单词都被标注为 {Person, Organization, Location, Miscellaneous, Other (non-named entity)}。任务是对每个 input token 进行分类,将最后一层的 $T_i$ 输入到 classificaiton layer 就行。

我们今天的关于C#Winform-如何通过将3个变量传递到ReportViewer来显示实时报告,即ReportnameRDL文件,SQLstring和Connectionstring的分享就到这里,谢谢您的阅读,如果想了解更多关于.Net Web.Config Transformations,替换整个ConnectionString部分、asp.net – 在网页上的ReportViewer控件中呈现时,Reporting Services图表文本模糊、asp.net-core – 来自带有Entity Framework Core的Data Tier中的appsettings.json的ConnectionString、BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding的相关信息,可以在本站进行搜索。

本文标签: