DevExpress:报表控件绑定数据库数据源的三种方式(Winform)

1.写在前面

如果你是和我一样,第一次接触DevExpress,并且因为网上资源眼花缭乱无从下手,然后脑子一转直接到DevExpress官网寻找官方使用文档的,那我们的了解顺序应该差不多是一致的。

DevExpress官网:https://www.devexpress.com

在这里插入图片描述

然而,官网也是乱花渐欲迷人眼,这里直接放上被我找出的:winform版本devexpress 报表设计说明文档;

在这里插入图片描述

实际上参考意义较多的是这个模块:Detailed Guide to DevExpress Reporting

实际上,官方说明文档的内容非常详细,主要介绍两种设计方式

第一种:在VS新建的报表设计页面使用前端设计向导进行设计(几乎不用代码),这也是官网提供的比较系统的一套教学说明文档;

第二种:通过代码在后端进行实现;

总的来说,官网说明文档还是比较侧重于无代码实现的,毕竟为了实现对开发者友好,更加快速地 开发产品。如果需要代码实现,需要根据文档中提供的资源自行摸索,没有特别详细特别系统的代码实现教程。

其他内容不多说,本次只针对报表控件绑定数据库数据源的操作进行说明。内容略多,请合理安排阅读时间,耐心阅读。

第一种:使用报表页面的数据源绑定向导

官方说明:通过向导绑定数据库数据源

首先,按照向导到这个窗口,选择自己使用的数据库进行连接,前提是项目已经引入数据库加载所依赖的dll。我使用的是SQLITE数据库(sql大系列的),依赖的是System.Data.SQLite.dll。

这一步骤相当于以下代码,即:连接到数据库

public static string connectionString = "Data Source=" + DataBasePath + ";password=" + DataBasePwd;
SQLiteConnection con = new SQLiteConnection(connectionString);
con.Open();

在这里插入图片描述

然后,按照向导到这个提示窗,可以直接勾选需要载入的数据库中的表。

这样直接勾选然后点 NEXT 完成数据源添加的效果相当于数据库中的这条语句:

select * from student;

即:没有任何限制条件的查询出该表中数据
在这里插入图片描述

如果,需要依据相关限制条件(比如 select * from 【表名】where 【条件】之类的)查询得到数据,需要执行下面操作(先取消勾选上面的表)。

即创建新的查询(Queries)语句,点击其右侧的加号,跳转至新的窗口。

在这里插入图片描述

创建查询语句的窗口如下,左上角板块显示的是数据库中的表,我们现在仍然选择查询student这个表,用鼠标将student这张表拖拽着右侧空白区域。

在这里插入图片描述

可以勾选需要查询的字段,会实时在右侧显示相关查询语句

在这里插入图片描述

同时,可以右击相关字段,选择依据该字段排序查询或者分组查询

在这里插入图片描述

比如我选择按照学生id从小到大查询

在这里插入图片描述

查询语句建立过程中,可以点击窗口左下角的结果预览,查看查询的数据结果。

在这里插入图片描述

当前的查询结果如下:

在这里插入图片描述
此外,可以自己手动编辑查询语句,如实现如下的查询:

select * from student where student_id = 1;

需要注意设计界面sql语句书写方式的不同。不过,一般情况下不选择用这种方式筛选数据,因为它不灵活,无法在实施运行中给定我们需要查询的范围,下面会借助“报表参数”进行数据筛选。

在这里插入图片描述

最后,编辑好查询语句后可以“OK”后返回,在菜单栏选择以下选项可以看到数据源以及添加成功:

在这里插入图片描述

演示设计端报表控件绑定数据源的操作,添加两个文本控件,直接拖拽数据库相应字段到文本控件上,然后控件上会显示“黄色的小数据库”标识,即算绑定成功。
在这里插入图片描述

进行输入操作,使得每一张报表上只显示一条数据的信息

在这里插入图片描述
然后,可以直接点击预览,查看报表效果;

在这里插入图片描述
在这里插入图片描述

到这里,在报表设计端绑定数据库数据源的资本操作已经基本完成。

/**************************************************************************************************************/

为了在界面端实现数据库数据筛选(实现常见的where语句操作),引入报表参数

这里是官方文档关于报表参数的说明:报表参数;

首先,创建报表参数

在这里插入图片描述

例如,将会使用该报表参数约束学生的id, 将该参数的值设置为“动态的”,并绑定数据库表中学生的id字段:
在这里插入图片描述
然后,使用该报表参数 对报表数据进行筛选“filter”:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

这个表达式的意思是:报表只显示指定学生id的一条数据(“==”,你也可以在“Operators”中选择大于或者小于等条件,或者点击“ok”后在点击AND后的“+”号新建一条“与条件”,进而实现大于…且…小于…的效果)。

现在,再次预览,是如下效果,会在加载报表前,让你指定报表参数的值,而这个值我们绑定了数据源,可以直接拖拉选择,这个值我们以“学生名字”显示(即value和display)。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

到这里,在报表设计界面添加数据库数据源的大部分常用操作已经完成。

第二种:在后端使用代码实现(主要涉及使用DevExpress提供的数据库连接以及语句查询语法)

官方说明文档:在运行时连接sql server数据库

虽然只提到了连接sql server数据库形式的代码,但是本节文档一开始就提到了支持的众多数据库,所以其他数据库肯定也是可以的。

首先,这里以常见的根据“数据库连接字符串”连接方式进行说明。

在这里插入图片描述
如果你使用的不是sql server数据库,比如我使用的是sqlite数据库,只需要替代“CustomStringConnectionParameters”类即可,点击上图中箭头指向的类名:
在这里插入图片描述
再继续点:
在这里插入图片描述
sqlite数据库对应的是:SQLiteConnectionParameters,在vs中实例化该类,可见需要提供的数据库参数:
在这里插入图片描述
因此,通过DEV提供的数据库接口,也可以连接到数据库,sqlite的实现如下:

		SqlDataSource DataSource { get; set; }//Declare a Data Source Component
        /// 客户端数据库密码
        public const string DataBasePwd = "****";
        /// 数据库路径
        public static string DataBasePath = "*****.db";
       //Connection from a String连接数据库(sqlite连接方式,DEV提供)
       SQLiteConnectionParameters connectionParameters = new SQLiteConnectionParameters(DataBasePath, DataBasePwd);
       DataSource = new SqlDataSource(connectionParameters);

可以对比 sql server 连接的区别:

SqlDataSource DataSource { get; set; }//Declare a Data Source Component
string connectionString = "XpoProvider=MSSqlServer;Data Source=(LocalDB)\\MSSQLLocalDB;" +
        "AttachDbFilename=|DataDirectory|\\Test.mdf;" +
        "Integrated Security=True;Connect Timeout=30";
CustomStringConnectionParameters connectionParameters =
    new CustomStringConnectionParameters(connectionString);
DataSource = new SqlDataSource(connectionParameters);

到此,数据库已经建立连接。

小提示:如果想深入了解代码或者了解规范完成的代码,可以参考官网提供的github小demo,如下:
在这里插入图片描述

然后,建立数据库连接后,还需要添加查询语句(和常规的过程一样),代码示例的话,同一官方文档页面也有,以上的github程序里也有系统的说明。

我选择的是常规的方式,毕竟熟悉:

在这里插入图片描述

创建查询语句后,将查询语句关联到数据库:

            //添加一个常规查询语句
            DataSource.Queries.Add(CreateCustomSqlQuery());
            DataSource.RebuildResultSchema();
            public static SqlQuery CreateCustomSqlQuery()
			{
			    CustomSqlQuery query = new CustomSqlQuery();
			    query.Name = "CustomQuery";
			    query.Sql = "Select top 10 * from Products";//这里就可以直接添加筛选条件,后续不用使用报表参数也可
			    return query;
			}

其次,创建该数据库实例,并绑定报告

     //创建数据库实例
     SqlDataSource ds = DataSource as SqlDataSource;

      // Bind the report to a data source.
      report.DataSource = ds;
      //使用查询语句查询绑定的数据库中的成员(表)
      report.DataMember = ds.Queries[0].Name;

最后,就可以给控件绑定数据库的字段了。

//[student_id]数据库表中字段,Text:绑定控件的文本属性
ExpressionBinding expressionBinding01 = new ExpressionBinding("BeforePrint", "Text", "[student_id]");
//xrTableCell38:报表控件的Name;
report.xrTableCell38.ExpressionBindings.Add(expressionBinding01);
ExpressionBinding expressionBinding02 = new ExpressionBinding("BeforePrint", "Text", "[student]");
report.xrTableCell39.ExpressionBindings.Add(expressionBinding02);

注释:

  1. 报告怎么打印显示,可以移步到我的其他帖子。
  2. 因为使用了传统的查询语句,可以直接灵活的在查询语句中筛选数据,所以并未引入报表参数,感兴趣的可以自行到官网了解报表参数以及数据源筛选的代码实现。
  3. 完整的系统的代码可以参考github上的程序。

第三种:在后端使用代码实现(常规方式,不使用DEV提供的数据库操作语法)

其实,到这里需要说明就不多了,感觉种方法更灵活,更方便操作一些了。

首先,按照你的数据库连接以及查询方式,返回datatable

 DataTable dt = sqliteHelper.ExecuteDataTable(sql, connectionString);

然后,报告数据源直接绑定该datatable

 report.DataSource = dt;

其次,就可以给控件绑定数据库的字段了。

//[student_id]数据库表中字段,Text:绑定控件的文本属性
ExpressionBinding expressionBinding01 = new ExpressionBinding("BeforePrint", "Text", "[student_id]");
//xrTableCell38:报表控件的Name;
report.xrTableCell38.ExpressionBindings.Add(expressionBinding01);
ExpressionBinding expressionBinding02 = new ExpressionBinding("BeforePrint", "Text", "[student]");
report.xrTableCell39.ExpressionBindings.Add(expressionBinding02);

结语:优缺点分析

01.通过DEV报表设计页面进行设计:

优点:对开发者友好;代码使用量少,熟悉操作后,在设计端拖拽配置即可,节省开发时间周期,能够快速设计报表程序。
缺点:对使用者不友好;在设计端绑定数据库时,只能给定数据库的绝对路径,若要拷贝到其他计算机或者打包安装部署,数据库所在的路径必须和开发时选择的数据库路径一致,否则会找不到数据库,在部署时不太友好。

02.设计页面设计和后端代码设计相结合:

优点:有效避免了第一套方案中需要考虑数据库路径的问题,开发较为灵活;
缺点:部分操作需要大量代码实现,开发效率略低,但可以接受。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/20676.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

(十六)数据编辑——图形编辑②

数据编辑——图形编辑② 目录 数据编辑——图形编辑②1.5线要素的延长和裁剪1.5.1线要素延长1.5.2线要素裁剪 1.6要素的变形与缩放1.6.1要素变形操作1.6.2要素缩放操作 1.7要素结点的编辑1.7.1添加结点1.7.2删除结点1.7.3移动结点 1.5线要素的延长和裁剪 单击编辑器下拉菜单&a…

ChatGPT 联网和插件功能,下周起可直接使用,无需排队!

夕小瑶科技说 分享 来源 | 新智元 OpenAI和谷歌,已经打得急红了眼,ChatGPT Plus用户,下周就可以体验联网和插件功能,无需再排队。鲨疯了,真的鲨疯了! ChatGPT,下周开始联网,并开放插…

字典翻译EasyTrans简单使用分享

前言 最近太忙了,一直按在项目上摩擦,都没有时间写分享了。今天终于市把所有负责的模块都写完了,本次迭代引入了字典翻译,借这个机会顺便分享下。 一、什么是字典翻译 所谓的字典翻译其实简单理解就是一些不常更新的有键值对属性的…

如何利用python调用API接口获取数据进行测试

一、Python 可以使用 requests 库来调用 API 接口获取数据。以下是基本的步骤: 1.安装 requests 库 pip install requests 2.导入 requests 库 import requests 3.构建 API 请求的 URL 根据 API 文档,构建请求的URL。 例如, https://a…

从BinDiff到0day 在IE中利用CVE-2019-1208

前言 如上所述,CVE-2019-1208是UAF漏洞,这类安全漏洞可以破坏有效数据、引发进程crash、并且可以精心利用最终导致任意代码执行。而对于本文介绍的CVE-2019-1208而言,成功利用此漏洞的攻击者可以获得系统当前用户权限。如果当前用户具有admi…

C++: 计时器类的设计和实现

文章目录 1. 目的2. 功能列表3. 基础功能:获取耗时4. API 设计: Timer 类5. 单元测试6. API 实现 1. 目的 使用 C Class 的形式,封装原本 C语言的获取时间的函数,提供更容易使用的计时器调用。 使用 C03,原因是和先前的线程安全队…

python+vue流浪动物公益科普宠物在线领养网站

使用动物在线领养网站的用户分管理员和用户两个角色的权限子模块。 开发语言:Python 框架:django/flask Python版本:python3.7.7 数据库:mysql 数据库工具:Navicat 开发软件:PyCharm 系统所要实现的功…

AI 时代,知识工作者的生存指南

最近,大家可能已经见识过 AI 的威力了吧,以 ChatGPT 为代表的 人工智能(AI)展现出接近人一样的回答水准。 来自 Craft AI Assitant AI 就在那里,是房间里的大象,大家不能总装做对自己没有影响。要知道&…

[架构之路-199] - 可靠性需求与可靠性分析:鱼骨图、故障树分析法FTA、失效模式与影响DFMEA,找到影响故障的主要因素

目录 引言: 第1章 故障树分析法与鱼骨图的比较 1.1 相同点 1.2 区别点 第2章 鱼骨图 第3章 故障树 3.1 示意图 3.2 故障树解读 3.3 故障树常见符号 第4章 产品失效(Failure)模式分析DFMEA 引言: 目标系统/产品的可靠性和性能在客户需求阶段就…

脂溶性荧光染料Cy7标记羧酸Cy7-COOH/Carboxylic acids星戈瑞

CY7-COOH是一种含有羧基的化合物,它的分子式为C37H45ClN2O2,分子量519.12。其化学结构中包含有一个吲哚菁骨架,以及一个羧基(COOH)官能团。它的分子式为C37H45ClN2O2,分子量519.12。CY7-COOH是一种近红外荧…

requset页面的代码逻辑

1. 封装请求基地址 在src目录下 放上一个专门写请求相关的文件夹 然后在里面新建一个专门放用户请求的use.js 用axios发送请求 在use.js文件夹里导入request 并且根据接口文档 写请求 然后把这个请求封装成一个函数,这个函数里需要传入两个参数 这两个参数 都放在d…

SpringMVC第二阶段:@RequestMapping注解详解

RequestMapping注解详解 RequestMapping是给个方法配置一个访问地址。就比如web学习的Servlet程序,在web.xml中配置了访问地址之后,它们之间就有一个访问映射关系。 1、value属性 value 属性用于配置方法对应的访问地址. /*** RequestMapping 可以配…

自动操作魔法师4.9.0.0

产品下载 (won-soft.com) 如下图所示: 彻底远离枯燥乏味的工作 在日常办公中,开发票,更新客户资料,打印报表,录入数据等等工作是极为重要,但大部分时候这些工作是相当枯燥的。你不得得一遍又一遍的进行重复…

Cesium入门之六:Cesium加载影像图层(ArcGIS、Bing、Mapbox、高德地图、腾讯地图、天地图等各类影像图)

Cesium加载影像图层 一、ImageryLayer类常用属性常用方法 二、ImageryLayerCollection类常用属性常用方法 三、ImageryProvider类常用属性常用方法 四、ImageryProvider子类1. ArcGisMapServerImageryProvider加载ArcGIS地图服务 2. BingMapsImageryProvider加载BingMap地图服务…

Java websocket 使用

简介 WebSocket 是一种基于 TCP 协议的全双工通信协议,可以在浏览器和服务器之间建立实时、双向的数据通信。在 Java 中,我们可以使用 Java API for WebSocket(JSR 356)来实现 WebSocket。 WebSocket 的作用是在 Web 应用程序中…

springboot+jsp+javaweb学生信息管理系统 05hs

springboot是基于spring的快速开发框架, 相比于原生的spring而言, 它通过大量的java config来避免了大量的xml文件, 只需要简单的生成器便能生成一个可以运行的javaweb项目, 是目前最火热的java开发框架 (1)管理员模块:系统中的核心用户是管…

ChatGPT国内免费使用的方法有哪些?

目录 一、ChatGpt是什么? 二、ChatGPT国内免费使用的方法: 第一点:电脑端 第二点:手机端 三、结语: 一、ChatGpt是什么? ChatGPt是美国OpenAI [1] 研发的聊天机器人程序 。更是人工智能技术驱动的自然语…

【MySQL】浅谈事务

哈喽,大家好~我是你们的老朋友:保护小周ღ 谈起 “事务”,可能大家都会在心中出现一个大大的 ?,博主的理解——事务就是解决 MySql数据库在应对多线程环境下针对同一存储空间的数据修改引起的数据安全问题的一种机制…

详解二叉树

🌈目录 一、树形结构​ 🌳1.1 概念1.2 其他概念1.3 树的表示形式 二、二叉树✨2.1 概念2.2 两种特殊二叉树2.3 性质2.4 二叉树存储 三、二叉树的基本操作🙌3.1 前置说明3.2 二叉树的遍历3.3 二叉树的基本操作 四、二叉树的OJ✍️ 一、树形结构…

康耐视智能相机insight主从触发以及康耐视insight视觉系统之间数据特有交互方式

1、一个相机设置为主系统,指定自己的名称,下方可以指定发给从系统的数据,触发方式不要设置 成网络 2、另外一个相机触发方式设置成网络,然后下方指定主系统的名称 3、主系统每触发一次,就会带动从系统触发,同时指定的数据会发送到从系 统,从系统使用函数getstring获取…