为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
慕容3067478 2023-08-07 15:00:28
我需要帮助理解这个错误。该代码适用于 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 databasefunc (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"`}
查看完整描述

1 回答

?
一只名叫tom的猫

TA贡献1906条经验 获得超3个赞

sqlserver驱动程序使用正常的 MS SQL Server 语法,并期望 sql 查询中的参数采用 @Name 或 @p1 到 @pN(序数位置)的形式。

insertSql := "insert into test (id, idstr) values (@p1, @p2)"

经过一些测试,我可以确认它有效。它甚至可以与 sqlite3 一起使用,因此这似乎是一种更广泛接受的方式。


查看完整回答
反对 回复 2023-08-07
  • 1 回答
  • 0 关注
  • 122 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信