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"
P粉475126941
P粉475126941 2024-03-25 21:26:54
0
1
404

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粉475126941
P粉475126941

répondre à tous(1)
P粉022140576

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).

Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal