VB.Net中ML.Net DatabaseLoader报至少需一列错误
报错原因
DatabaseLoader 不会自动解析SQL查询返回的结果集结构,调用无参的CreateDatabaseLoader()方法时没有传入任何列映射规则,加载器不知道要从结果集中读取哪些列、对应什么数据类型,就会抛出DatabaseLoader requires at least one Column异常。
解决步骤
- 定义和查询结果字段匹配的数据模型
按照要读取的Sales_Quarter_1表字段,编写对应的数据类,用LoadColumn特性标注每个字段对应的结果集列序号(序号从0开始,和SQL查询返回的列顺序一一对应),示例:Public Class SalesQuarterData <LoadColumn(0)> Public Property SaleId As Single <LoadColumn(1)> Public Property ClientName As String <LoadColumn(2)> Public Property TransactionAmount As Single <LoadColumn(3)> Public Property TransactionDate As DateTime End Class - 修改加载器初始化代码
把无参的CreateDatabaseLoader()调用改为泛型版本,传入定义好的数据模型类型,让加载器自动根据模型特性生成列映射,替换原有创建loader的代码:Dim loader As DatabaseLoader = mlContext.Data.CreateDatabaseLoader(Of SalesQuarterData)() - (可选优化)避免隐式列顺序问题
不要在查询语句中使用SELECT *,明确指定需要查询的列,保证列顺序和模型中LoadColumn标注的序号完全匹配,避免后续表结构变动导致映射错位:Dim commandText As String = "SELECT SaleId, ClientName, TransactionAmount, TransactionDate from Sales_Quarter_1"
如果不想定义强类型模型,也可以手动构造列映射数组传入加载器,示例代码如下:
' 手动配置列映射:参数分别为 列名、数据库字段类型、结果集列序号 Dim loadColumns = { New DatabaseLoader.Column("SaleId", DbType.Int32, 0), New DatabaseLoader.Column("ClientName", DbType.String, 1), New DatabaseLoader.Column("TransactionAmount", DbType.Single, 2), New DatabaseLoader.Column("TransactionDate", DbType.DateTime, 3) } Dim loader As DatabaseLoader = mlContext.Data.CreateDatabaseLoader(loadColumns)
内容的提问来源于stack exchange,提问作者Classified Mystery
相关产品推荐
相关产品推荐

