列索引 0 上的扫描错误,名称'ID”:不支持扫描,将 driver.Value 类型 int64 存储到类型 *authService.Permission”
P粉475126941
P粉475126941 2024-03-25 21:26:54
0
1
343

当我尝试调用 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粉475126941
P粉475126941

全部回复(1)
P粉022140576

这里有一些问题。首先 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 包含四个元素,但查询返回两列,因此我不太确定您打算如何填充其他两列(或映射是什么)。

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责声明 Sitemap
PHP中文网:公益在线PHP培训,帮助PHP学习者快速成长!