当我尝试调用 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 时,相同的查询工作正常。
知道这里出了什么问题吗?提前致谢。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号
这里有一些问题。首先
QueryRowContext您的问题表明您的语句返回多个结果,因此这不是正确使用的函数(
QueryContext会更合适)。第二个问题如错误中所述:
结果集中的第一列是一个整数(在本例中可能是值
15),并且您正尝试将其扫描到[]Permission中。如果你改变了var resourceList []Permissiontovar resourceList int该错误将被修复(但第二个参数也需要工作)。查看此示例文档。获取该代码并将其应用到您的情况将导致类似以下内容(未经测试;只是为了给您指出正确的方向):
rows, err := db.QueryContext(ctx, "CALL usp_GetParentResourceListByResourceTypeID(?)", resourceTypeId) if err != nil { log.Fatal(err) } defer rows.Close() var resourceList []Permission for rows.Next() { var resource Permission if err := rows.Scan(&resource.ID, &resource.Name); err != nil { // Check for a scan error. // Query rows will be closed with defer. log.Fatal(err) } resourceList = append(resourceList, resource ) } rerr := rows.Close() if rerr != nil { log.Fatal(rerr) } if err := rows.Err(); err != nil { log.Fatal(err) }注意:您的结构
Permission包含四个元素,但查询返回两列,因此我不太确定您打算如何填充其他两列(或映射是什么)。