搜索

首页  >  问答  >  正文

列索引 0 上的扫描错误,名称“ID”:不支持扫描,将 driver.Value 类型 int64 存储到类型 *authService.Permission”

当我尝试调用 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 时,相同的查询工作正常。

知道这里出了什么问题吗?提前致谢。

P粉475126941P粉475126941284 天前438

全部回复(1)我来回复

  • P粉022140576

    P粉0221405762024-03-26 10:40:36

    这里有一些问题。首先 QueryRowContext

    您的问题表明您的语句返回多个结果,因此这不是正确使用的函数(QueryContext 会更合适)。

    第二个问题如错误中所述:

    结果集中的第一列是一个整数(在本例中可能是值 15),并且您正尝试将其扫描到 []Permission 中。如果你改变了 var resourceList []Permission to var 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 包含四个元素,但查询返回两列,因此我不太确定您打算如何填充其他两列(或映射是什么)。

    回复
    0
  • 取消回复