DevExpress XtraReport绑定SQLite动态数据表时出现「Invalid Data Member」错误的解决求助
解决XtraReport「Invalid Data Member」错误的方案
嘿,我一眼就瞅出问题所在了——你把DataMember设成数据库表名tblName了,但XtraReport需要的是SqlDataSource里定义的查询名称,不是表名!
问题根源
在你的BindToData()方法里,你创建了一个名为customQuery的CustomSqlQuery,并把它添加到了SqlDataSource的查询集合中。但在设置报表的DataMember时,你却给了它表名tblName,系统自然找不到对应的数据成员,所以抛出了错误。
修复步骤
只需要把DataMember的赋值改成查询的名称即可,也就是你定义的"customQuery":
修改后的创建报表代码
private void btnCreateReport_Click(object sender, EventArgs e) { if (LogConfig.isLogging==true) { DialogResult dialogResult = MessageBox.Show("Opening print tool will stop data logging. Proceed?", "Print Dialog", MessageBoxButtons.YesNo, MessageBoxIcon.Warning); if (dialogResult == DialogResult.Yes) { LogConfig.isLogging = false; XtraReport1 report = new XtraReport1(); var reportDataSource = BindToData(); report.DataSource = reportDataSource; // 这里改成查询的名称,而不是表名 report.DataMember = "customQuery"; ReportPrintTool printTool = new ReportPrintTool(report); printTool.ShowPreview(); } } }
额外优化建议
为了避免硬编码查询名称带来的维护问题,你可以把查询名称做成一个常量,或者直接从返回的SqlDataSource中获取查询名称:
// 在BindToData里定义常量 private const string ReportQueryName = "customQuery"; private SqlDataSource BindToData() { SQLiteConnectionParameters connectionParameters = new SQLiteConnectionParameters("UTDR_LOGS_DB.db", ""); SqlDataSource ds = new SqlDataSource(connectionParameters); CustomSqlQuery query = new CustomSqlQuery(); query.Name = ReportQueryName; query.Sql = $"SELECT * FROM {tblName}"; ds.Queries.Add(query); ds.RebuildResultSchema(); return ds; } // 然后在设置DataMember时用这个常量 report.DataMember = ReportQueryName;
验证要点
- 确保
ds.RebuildResultSchema()执行成功,这一步会加载查询返回的字段结构,让报表控件能正确识别绑定的列。 - 确认你的
SELECT * FROM {tblName}查询返回的列和报表设计时XRLabel绑定的列名完全一致,大小写也要注意(SQLite默认不区分,但最好保持一致)。
这样修改后,报表应该就能正确加载数据并显示了!
内容的提问来源于stack exchange,提问作者cgaskey
相关产品推荐
相关产品推荐

