Maison > Questions et réponses > le corps du texte
J'obtiens l'erreur suivante lorsque j'essaie d'appeler err = row.Scan(&resourceList, resourceTypeId)
Erreur d'analyse sur l'index de colonne 0, nom 'ID' : analyse non prise en charge, stockage du pilote.Valeur de type int64 pour saisir *[]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 renvoie comme suit
ID Name 15 Applications 16 Subscriptions 17 Payments
La même requête fonctionne correctement lorsque j'essaie SQL Server dans l'instruction query
中使用带有 EXEC
.
Une idée de ce qui ne va pas ici ? Merci d'avance.
P粉0221405762024-03-26 10:40:36
Quelques questions ici. D'abord QueryRowContext
Votre question indique que votre déclaration renvoie plusieurs résultats, ce n'est donc pas la bonne fonction à utiliser (QueryContext
serait plus appropriée).
Deuxième question comme indiqué dans l'erreur :
La première colonne de l'ensemble de résultats est un entier (dans ce cas probablement la valeur 15
),并且您正尝试将其扫描到 []Permission
Si vous modifiez).
var resourceList []Permission
to var resourceList int
Le bug sera corrigé (mais le deuxième paramètre nécessite également du travail).
Voir cet exemplela documentation. Prendre ce code et l'appliquer à votre situation donnera quelque chose comme ce qui suit (non testé ; juste pour vous orienter dans la bonne direction) :
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) }
Remarque : Votre structure Permission
contient quatre éléments, mais la requête renvoie deux colonnes, donc je ne sais pas trop comment vous comptez remplir les deux autres colonnes (ni quel est le mappage).