我需要帮助理解这个错误。该代码适用于 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 一起使用,因此这似乎是一种更广泛接受的方式。
- 1 回答
- 0 关注
- 122 浏览
添加回答
举报
0/150
提交
取消