DevExpress XtraReport日期时间范围参数计算及数据源填充报错
问题:DevExpress XtraReport日期时间范围参数查询报错
在DevExpress XtraReport中设置日期(开始-结束)和时间(开始-结束)范围参数后,填充数据源时抛出异常:执行SQL查询时失败,错误原因为time与datetime数据类型在大于等于运算符中不兼容。
涉及的查询参数@DateRang_Start、@DateRang_End、@TimeRang_Start、@TimeRang_End均为DateTime类型,对应值均为09/10/2024 12:00:00。
相关代码如下:
SqlConn.ConnectionString = "Server=ACCOUNTANT;database=xxxxxxx;User ID=xx;Password=xxxxxxxxx" If SqlConn.State = ConnectionState.Open Then SqlConn.Close() End If SqlConn.Open() '================= Dim report As New XtraReport1 'Filter By Date ( Start - End ): report.Parameters("DateRang_Start").Value = dtDateStart.EditValue report.Parameters("DateRang_End").Value = dtDateEnd.EditValue 'Filter By Time ( Start - End ) : report.Parameters("TimeRang_Start").Value = dtTimeStart.EditValue report.Parameters("TimeRang_End").Value = dtTimeEnd.EditValue '-------------------------------- DocumentViewer1.DocumentSource = report report.CreateDocument() report.RequestParameters = False '---------------- SqlConn.Close()
解决思路
1. 修正SQL查询的类型兼容问题
报错核心是time类型字段与datetime类型参数直接比较导致的类型不兼容。针对SQL Server数据库,可通过类型转换解决:
- 如果数据库表中是
time类型字段,将datetime参数转为time类型后再比较:表中Time字段 >= CAST(@TimeRang_Start AS TIME) - 如果需要结合日期和时间筛选,可将日期参数与时间字段拼接为完整datetime:
CAST(@DateRang_Start AS DATE) + CAST(表中Time字段 AS DATETIME) >= @DateRang_Start + CAST(@TimeRang_Start AS TIME)
2. 调整报表参数类型
若时间参数仅需提取时间部分,将@TimeRang_Start、@TimeRang_End的参数类型改为TimeSpan,赋值时直接取时间控件的时间部分:
report.Parameters("TimeRang_Start").Value = dtTimeStart.Time report.Parameters("TimeRang_End").Value = dtTimeEnd.Time
此时SQL查询中可直接用TimeSpan参数与time字段比较,无需额外转换。
3. 合并日期与时间参数(推荐)
将日期和时间控件的值合并为完整的DateTime参数,避免分开处理的类型问题:
- 在报表中创建两个
DateTime参数@StartDateTime和@EndDateTime - 赋值时合并日期和时间:
Dim startDate As Date = dtDateStart.EditValue Dim startTime As TimeSpan = dtTimeStart.Time report.Parameters("StartDateTime").Value = startDate.Add(startTime) Dim endDate As Date = dtDateEnd.EditValue Dim endTime As TimeSpan = dtTimeEnd.Time report.Parameters("EndDateTime").Value = endDate.Add(endTime) - SQL查询中直接用合并后的参数与表中
datetime类型字段比较:表中DateTime字段 BETWEEN @StartDateTime AND @EndDateTime
内容的提问来源于stack exchange,提问作者Bassam Alqadhi
相关产品推荐
相关产品推荐

