当我尝试调用 err = row.Scan(&resourceList, resourceTypeId)
时收到以下错误
列索引 0 上的扫描错误,名称“ID”:不支持扫描,将 driver.Value 类型 int64 存储到类型 *[]authService.Permission”
type Permission struct { ID int `json:"id"` Name string `json:"name"` Description string `json:"description"` ParentResourceID int `json:"parentResourceId"` } func GetResourcesByResourceTypeId(resourceTypeId string) ([]Permission, string, error) { db, ctx := db.GetDB() query := "CALL usp_GetParentResourceListByResourceTypeID(?)" var resourceList []Permission stmt, err := db.Prepare(query) defer stmt.Close() if err != nil { log.Errorln("Error in preparing statement. " + err.Error()) return nil, "Error in preparing statement.", err } row := stmt.QueryRowContext(ctx, resourceTypeId) err = row.Scan(&resourceList, resourceTypeId) if err == nil { return resourceList, "Resource retrieval.", nil } log.Warningln("Resource retrieval failed, ResourceTypeID: " + resourceTypeId + ".") return resourceList, "Resource retrieval failed.", nil }
SQL 返回如下
ID Name 15 Applications 16 Subscriptions 17 Payments
当我尝试在 query
中使用带有 EXEC
语句的 SQL Server 时,相同的查询工作正常。
知道这里出了什么问题吗?提前致谢。
这里有一些问题。首先
QueryRowContext
您的问题表明您的语句返回多个结果,因此这不是正确使用的函数(
QueryContext
会更合适)。第二个问题如错误中所述:
结果集中的第一列是一个整数(在本例中可能是值
15
),并且您正尝试将其扫描到[]Permission
中。如果你改变了var resourceList []Permission
tovar resourceList int
该错误将被修复(但第二个参数也需要工作)。查看此示例文档。获取该代码并将其应用到您的情况将导致类似以下内容(未经测试;只是为了给您指出正确的方向):
注意:您的结构
Permission
包含四个元素,但查询返回两列,因此我不太确定您打算如何填充其他两列(或映射是什么)。