Heim > Fragen und Antworten > Hauptteil
Ich erhalte die folgende Fehlermeldung, wenn ich versuche anzurufen err = row.Scan(&resourceList, resourceTypeId)
Scanfehler bei Spaltenindex 0, Name „ID“: Scan wird nicht unterstützt, Driver.Value vom Typ int64 wird gespeichert, um *[]authService.Permission“ einzugeben
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 gibt Folgendes zurück
ID Name 15 Applications 16 Subscriptions 17 Payments
Die gleiche Abfrage funktioniert einwandfrei, wenn ich SQL Server in der query
中使用带有 EXEC
-Anweisung versuche.
Irgendeine Idee, was hier falsch ist? Dank im Voraus.
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
包含四个元素,但查询返回两列,因此我不太确定您打算如何填充其他两列(或映射是什么)。