列索引 0 上的掃描錯誤,名稱'ID”:不支援掃描,將 driver.Value 類型 int64 儲存到類型 *authService.Permission”
P粉475126941
P粉475126941 2024-03-25 21:26:54
0
1
411

當我嘗試呼叫 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 包含四個元素,但查詢返回兩列,因此我不太確定您打算如何填充其他兩列(或映射是什麼) 。

熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板