VB.NET窗体加载Chart控件报错:字符串转Integer无效及约束异常
类型转换报错(Conversion from string "Date Booked" to type 'Integer' is not valid)修复方案
- 触发原因:
OleDbDataReader的GetString()、GetInt32()等强类型读取方法仅支持传入列的整数索引,你直接传入列名字符串,系统尝试将字符串转为整数索引失败,触发类型转换错误。 - 附带错误:你使用的查询语句
SELECT BookingID, RoomType, Revenue, DateBooked FROM tblRoomBookings未查询Price字段,后续调用READ.GetInt32("Price")即使索引传对也会找不到列报错。 - 修复代码:
首先修改查询语句,补充Price字段:
QRY = "SELECT BookingID, RoomType, Revenue, DateBooked, Price FROM tblRoomBookings ORDER BY BookingID ASC"
再修改读取逻辑,通过GetOrdinal方法先获取列索引再读取值:
While READ.Read Dim dateBooked = READ.GetDateTime(READ.GetOrdinal("DateBooked")) Dim price = READ.GetInt32(READ.GetOrdinal("Price")) chtSalesAndRevenue.Series("Revenue").Points.AddXY(dateBooked, price) End While
约束冲突报错(System.Data.ConstraintException)修复方案
- 触发原因:强类型数据集
NewHotelDataSet中tblRoomBookings表定义的约束规则(非空、唯一键、外键)和实际数据库读取的数据不匹配,常见场景包括:- 数据库字段存在Null值,但数据集中对应字段设置为不允许Null
- 数据集设置了主键,但数据库表中存在重复主键值
- 数据集定义的字段名、字段类型和实际数据库表不匹配,比如代码中用到的
_Check_In字段需确认和数据库字段对应关系
- 临时排查方案:关闭数据集约束检查,验证是否为约束导致的问题:
Private Sub PlotChart() Dim TA As New NewHotelDataSetTableAdapters.tblRoomBookingsTableAdapter Dim TB As New NewHotelDataSet.tblRoomBookingsDataTable ' 临时关闭约束检查 TB.EnforceConstraints = False TA.Fill(TB) chtSalesAndRevenue.Series(0).Points.Clear() For i = -364 To 0 Dim revenueOfDay As Single = 0 For H As Integer = 0 To TB.Rows.Count - 1 Dim T As NewHotelDataSet.tblRoomBookingsRow = TB.Rows(H) If T._Check_In = Now.Date.AddDays(i) Then revenueOfDay += T.Revenue End If Next chtSalesAndRevenue.Series(0).Points.AddXY(Now.Date.AddDays(i), revenueOfDay) Next End Sub
- 永久修复:打开数据集设计器,逐一对比
tblRoomBookings的字段定义、约束规则和实际数据库表的结构,修正不一致的配置即可。
冗余逻辑优化建议
你当前在窗体Load事件中写了两次图表数据加载逻辑,第一次直接读取数据库往Series("Revenue")加数据,第二次调用PlotChart往Series(0)加数据,二者逻辑重复且可能因为系列索引不对应引发冲突,建议删掉Load事件中Try...Catch包裹的读取数据库加图表点的逻辑,仅保留PlotChart调用即可。
内容的提问来源于stack exchange,提问作者xxtuemonkey
相关产品推荐
相关产品推荐

