sql statements.exec 错误:mssql:“?”附近的语法不正确

我需要帮助理解这个错误。该代码适用于 sqlite。看起来?sql 包甚至没有在那里放置值,而是按原样发送问号。我可以毫无问题地运行其他选择语句,因此这不是连接问题或类似问题。


错误:“?”附近的语法不正确


func TestSQLServerInsert(t *testing.T) {

    db, err := sql.Open("sqlserver", "my_trusted_string")

    //db, err := sql.Open("sqlite3", "../data/utm_info.db")


    if err != nil {

        t.Errorf("could not open database: %v", err)

    }

    defer db.Close()


    c := controller.NewC(db)

    u := controller.UtilizationResponse{

        Snapshot: []int{46, 22, 4, 4, 5, 3, 0, 8, 49},

        History:  []float32{55.1, 47.2, 0.3, 33.4, 23.5},

        Time:     time.Now(),

    }


    affectedRows, err := c.InsertUtil(u)

    if err != nil {

        t.Errorf("could not insert into db: %v", err)

    }

    var count int64 = 1

    assert.Equal(t, affectedRows, count)

}

// InsertUtil response inserts a new record into the database

func (c *Controller) InsertUtil(u UtilizationResponse) (rowsAffected int64, err error) {

    return insertUtil(c.DB, u)

}

func insertUtil(db *sql.DB, u UtilizationResponse) (int64, error) {

    stmt, err := db.Prepare("INSERT INTO Utilization VALUES(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)")

    if err != nil {

        return 0, err

    }

    res, err := stmt.Exec(

        u.Time,

        u.Snapshot[0],

        u.Snapshot[1],

        u.Snapshot[2],

        u.Snapshot[3],

        u.Snapshot[4],

        u.Snapshot[5],

        u.Snapshot[6],

        u.Snapshot[7],

        u.Snapshot[8],

        u.History[0],

        u.History[1],

        u.History[2],

        u.History[3],

        u.History[4],

    )

    if err != nil {

        return 0, err

    }

    rowCnt, err := res.RowsAffected()

    if err != nil {

        return 0, err

    }

    return rowCnt, nil

}


type UtilizationResponse struct {

    Snapshot []int     `json:"snapshot,omitempty"`

    History  []float32 `json:"history,omitempty"`

    Time     time.Time `json:"time,omitempty"`

}


慕容3067478
浏览 89回答 1
1回答

一只名叫tom的猫

sqlserver驱动程序使用正常的 MS SQL Server 语法,并期望 sql 查询中的参数采用 @Name 或 @p1 到 @pN(序数位置)的形式。insertSql := "insert into test (id, idstr) values (@p1, @p2)"经过一些测试,我可以确认它有效。它甚至可以与 sqlite3 一起使用,因此这似乎是一种更广泛接受的方式。
打开App,查看更多内容
随时随地看视频慕课网APP