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

news2025/1/21 22:07:40

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.设计页面设计和后端代码设计相结合:

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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【笔试强训选择题】Day12.习题(错题)解析

作者简介:大家好,我是未央; 博客首页:未央.303 系列专栏:笔试强训选择题 每日一句:人的一生,可以有所作为的时机只有一次,那就是现在!!! 文章目录…

Facebook 手机应用广告:在移动时代实现营销突破

在移动时代,手机已经成为人们生活的重要组成部分。随着移动互联网的普及,人们更频繁地使用手机来浏览社交媒体、获取信息和进行购物。 对于企业而言,如何在移动平台上实现营销突破,吸引用户的注意力和提升品牌价值,是…

数说热点|社恐人群运动健身指南:不想去健身房,那就在家找面墙

连杰伦都开始跳操了,你还不动动动动动起来? 随着《运动者联盟》这档体育挑战真人秀节目的完美收官,忙碌生活中的运动激情似乎又被点燃了。5月9日,周杰伦现身厦门,在活动现场和刘耕宏合体跳起了《本草纲目》&#xff0…

音视频技术开发周刊 | 293

每周一期,纵览音视频技术领域的干货。 新闻投稿:contributelivevideostack.com。 谷歌全面反攻 ChatGPT!PaLM 2、Gemini 双杀,Bard 正式开放 以上是2023 Google I/O 大会的重点内容,AI含量极高。 谷歌推拥有26000个H10…

uni-app框架的小程序开发环境

文章目录 一、下载微信开发工具安装 二、构建uni-app开发环境2.1 Node.js下载与安装2.2 下载HBuilder-X2.3 创建uni-app项目2.4 填入uni-app专属标识和小程序标识 在阅读此博文前,需要注册完毕小程序账号 一、下载微信开发工具 微信开发工具下载地址 下载稳定版即…

代码随想录算法训练营day41 | 343. 整数拆分,96.不同的二叉搜索树

代码随想录算法训练营day41 | 343. 整数拆分,96.不同的二叉搜索树 343. 整数拆分解法一:动态规划 96.不同的二叉搜索树解法一:动态规划 总结 343. 整数拆分 教程视频:https://www.bilibili.com/video/BV1Mg411q7YJ 1、dp[i]代表…

【Linux命令】脚本里常用的几个命令sort,uniq,tr,cut,split,eval

脚本里常用的命令 一、SORT命令1.1、语法格式1.2常用选项 二、uniq命令2.1命令格式2.2常用选项2.3小实验,过滤出现三次以上的IP地址 三、tr命令3.1语法格式3.2常用选项3.3实验 四、cut命令4.1语法格式4.2常用选项 五、split命令5.1语法格式5.2常用选项 六、eval七、…

一个优秀系统构架师应具备的能力

作为软件开发的设计架构师,那么必须拥有一定的编程技能,同时有高超的学习新的架构设计、程序设计技能。另外,我觉得作为软件架构师,还必须了解一定的硬件、网络、服务器的基本知识。要不然,你都不知道有些什么材料可以…

基于MWORKS的电动汽车电平衡分析

1 引言 随着电动汽车的快速发展、电池技术的进步和智能电力管理系统的应用,电动汽车电平衡已经成为了电动汽车技术研究中的重要问题之一。 电动汽车电平衡是指车辆发电机、蓄电池、整车用电器在一定时间内的电能供给与消耗达到平衡状态。如果车辆电能产生与消耗无法…

USART硬件流控制概念以及原理(硬件控制流以及软件控制流)

USART 数据流控制 也就是 USART_HardwareFlowControl 一、流控制的作用 这里讲到的 “流”,指的是数据流;在数据通信中,流控制是管理两个节点之间数据传输速率的过程,以防止出现接收端的数据缓冲区已满,而发送端依然…

ResNet 论文理解含视频

ResNet 论文理解 论文理解 ResNet 网络的论文名字是《Deep Residual Learning for Image Recognition》,发表在2016年的 CVPR 上,获得了 最佳论文奖。ResNet 中的 Res 也是 Residual 的缩写,它的用意在于基于 残差 学习,让神经网…

真实业务场景使用-门面模式(外观)设计模式

1.前言 最近接到要修改的业务功能,这个业务增删改查很多功能都需要校验时间,比如: 1.失效时间不能超过自己父表的失效时间, 2.失效时间不能是当前时间 3.失效时间不能早于生效时间 类似这样的不同的判断还有很多,…

软考A计划-真题-分类精讲汇总-第十章(程序设计语言)

点击跳转专栏>Unity3D特效百例点击跳转专栏>案例项目实战源码点击跳转专栏>游戏脚本-辅助自动化点击跳转专栏>Android控件全解手册点击跳转专栏>Scratch编程案例 👉关于作者 专注于Android/Unity和各种游戏开发技巧,以及各种资源分享&am…

【GO 编程语言】切片与Map

切片与Map 文章目录 切片与Map一、切片 Slice1.定义切片2.make 函数创建切片3.切片扩容与遍历4.在已有数组上创建切片5.切片是引用类型7.深拷贝、浅拷贝 二、Map1.Map 初始化2.map 的使用3.map 的遍历4.map 结合 slice 一、切片 Slice 1.定义切片 Go 语言切片是对数组的抽象。…

设置ELK集群账号密码

一、设置ELK集群账号密码 切换到es用户 主节点生成证书 cd /home/es/elasticsearch-7.6.2/bin ./elasticsearch-certutil cert -out config/elastic-certificates.p12 -pass "" 将主节点证书发给其他两个节点 修改配置文件,启用x-pack:cat /…

Linux指令运行原理和权限

Linux指令运行原理和权限 一.命名行解释器二.权限1.用户分类2.什么是权限3.增删权限4.更改权限的拥有者5.三个概念1.权限掩码2.目录权限3.粘滞位 三.权限总结 一.命名行解释器 那么命令行解释器存在的意义:1.进行命令的解释。2.保护os,对于非法的请求&am…

TimesNet:用于一般时间序列分析的时间二维变化模型

摘要 时间序列分析在天气预报、异常检测和动作识别等广泛应用中具有极其重要的意义。本文重点研究时间变量建模,这是广泛分析任务的共同关键问题。以前的方法试图直接从一维时间序列完成此操作,由于错综复杂的时间模式,这极具挑战性。基于对…

使用flask获取树莓派摄像头监控视频

目录 1、安装flask库 2、使用flask打开网页传输视频 2.1 在树莓派终端桌面上,新建一个flask文件夹 2.2 在flask文件夹里面,新建一个template文件夹和app.py文件 2.3 在template文件夹里面,新建一个index.html文件 2.4 使用flask运行代码…

【半小时入门vue】最容易理解的vue入门方式

半小时入门vue 前言(!important)学习vue的前提什么是vue?vue的引入方式实例化一个对象和创建一个对象实例化一个vue对象模板语法1.插值表达式2.v-text和v-html指令3.v-bind指令4.v-on指令5.v-model指令6.v-if和v-show指令7.v-for指…

AD-STM32

AD-STM32 ADC (Analog-Digital Converter) 模拟-数字转换器A DC可以将引脚上连续变化的模拟电压转换为内存中存储的数字变量,建立模拟电路到数字电路的桥梁 12位逐次逼近型ADC,1us转换时间 输入电压范围: 0-3.3V,转换结果范围: 0~409518个输…