gpt4 book ai didi

sql - sql:“扫描”中应有3个目标参数,在Golang中不是1个

转载 作者:行者123 更新时间:2023-12-01 21:11:51 27 4
gpt4 key购买 nike

我正在编写通用代码以从任何RDS表查询数据。我经历了很多StackOverflow答案,但是没有一个对我有用。我已经通过以下链接:-

  • panic: sql: expected 1 destination arguments in Scan, not <number> golang, pq, sql
  • How to query any table of RDS using Golang SDK

  • 我的第一个代码是
    package main

    import (
    "fmt"
    )

    type BA_Client struct {
    ClientId int `json:ClientId;"`
    CompanyName string `json:CompanyName;"`
    CreateDate string `json:CreateDate;"`
    }

    func main() {

    conn, _ := getConnection() // Det database connection

    query := `select * from IMBookingApp.dbo.BA_Client
    ORDER BY
    ClientId ASC
    OFFSET 56 ROWS
    FETCH NEXT 10 ROWS ONLY ;`

    var p []byte
    err := conn.QueryRow(query).Scan(&p)
    if err != nil {
    fmt.Println("Error1", err)
    }

    fmt.Println("Data:", p)

    var m BA_Client
    err = json.Unmarshal(p, &m)
    if err != nil {
    fmt.Println("Error2", err)
    }

    }

    我的第二个代码是
    conn, _ := getConnection()
    query := `select * from IMBookingApp.dbo.BA_Client__c
    ORDER BY
    ClientId__c ASC
    OFFSET 56 ROWS
    FETCH NEXT 10 ROWS ONLY ;`

    rows, err := conn.Query(query)
    if err != nil {
    fmt.Println("Error:")
    log.Fatal(err)
    }

    println("rows", rows)

    defer rows.Close()

    columns, err := rows.Columns()
    fmt.Println("columns", columns)

    if err != nil {
    panic(err)
    }

    for rows.Next() {
    receiver := make([]*string, len(columns))

    err := rows.Scan(&receiver )
    if err != nil {
    fmt.Println("Error reading rows: " + err.Error())
    }
    fmt.Println("Data:", p)

    fmt.Println("receiver", receiver)
    }

    使用这两个代码,我得到如下相同的错误
    sql: expected 3 destination arguments in Scan, not 1

    可能是因为我使用的是SQL Server而不是MySQL?感谢是否有人可以帮助我找到问题。

    最佳答案

    当您要使用输入 slice 进行行扫描时,请使用可变的3点表示法...将 slice 转换为单独的参数,如下所示:

    err := rows.Scan(receiver...)

    使用可变参数的您的列(在本例中为三列)将有效地扩展为:
    // len(receiver) == 3
    err := rows.Scan(receiver[0], receiver[1], receiver[2])

    编辑:

    SQL扫描方法参数值的类型必须为 interface{}。因此,我们需要一个中间片。例如:
    is := make([]interface{}, len(receiver))
    for i := range is {
    is[i] = receiver[i]

    // each is[i] will be of type interface{} - compatible with Scan()
    // using the underlying concrete `*string` values from `receiver`
    }

    // ...

    err := rows.Scan(is...)

    // `receiver` will contain the actual `*string` typed items

    关于sql - sql:“扫描”中应有3个目标参数,在Golang中不是1个,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59629440/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com