使用golang和sqlserver驱动程序查询参数

时间:2017-09-01 14:44:44

标签: sql sql-server rest go

我正在尝试通过我的sql server数据库中的ID获取特定项目。这是我的代码:

var(
    allArticlesQry string = "SELECT * FROM Articles"
    findArticlesQry string = "SELECT * FROM Articles WHERE Id = ?1"
)

func FindArticle(w http.ResponseWriter, r *http.Request){
    vars := mux.Vars(r)
    var id = vars["id"]
    var article Article

    db := connect()
    defer db.Close()

    stmt, err := db.Prepare(findArticlesQry)    
    if err != nil{
        log.Fatal(err)
    }
    defer stmt.Close()

    err = stmt.QueryRow(id).Scan(&article.Title, &article.Description, &article.Body, &article.Id)
    if err != nil{
        log.Fatal(err)
    }

    w.Header().Set("Content-Type", "application/json; charset=UTF-8")
    w.WriteHeader(http.StatusOK)
    json.NewEncoder(w).Encode(u.HttpResp{Status: 200, Body: article})
}

我正在使用this package作为sqlserver驱动程序,并且这个示例应该可以正常工作:db.Query("SELECT * FROM t WHERE a = ?3, b = ?2, c = ?1", "x", "y", "z")

但每当我尝试调用此函数时,它都会失败并返回: 2017/09/01 16:31:01 mssql: Incorrect syntax near '?'.

所以我真的不明白为什么我的查询不起作用..

修改

我尝试了另一种方式,我在执行之前删除了准备查询的部分,现在它没有崩溃我的服务器,我有一个响应,但问题仍然是相同的:

var row = db.QueryRow(findArticlesQry, id).Scan(&article.Title, &article.Description, &article.Body, &article.Id)

回复:

{
    "status": 200,
    "description": "",
    "body": {
        "Number": 102,
        "State": 1,
        "Class": 15,
        "Message": "Incorrect syntax near '?'.",
        "ServerName": "DESKTOP-DLROBC4\\LOCALHOST",
        "ProcName": "",
        "LineNo": 1
    }
}

3 个答案:

答案 0 :(得分:2)

根据您的评论,您使用的是sqlserver驱动程序,而不是mssql驱动程序,因此您使用的参数格式错误。根据文件:

  

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

     

db.QueryContext(ctx,select * from t where ID = @ID;,   sql.Named(" ID",6))

因此,您应该将查询更改为:

var(
    allArticlesQry string = "SELECT * FROM Articles"
    findArticlesQry string = "SELECT * FROM Articles WHERE Id = @p1"
)

答案 1 :(得分:1)

占位符似乎有问题。为什么不试试呢?对于您的占位符,因为您没有转移订单或重复订单。所以试试这个:

"SELECT * FROM Articles WHERE Id = ?"

答案 2 :(得分:1)

db.Query("SELECT * FROM t WHERE a = ?3, b = ?2, c = ?1", "x", "y", "z"),此处的问号用作占位符,稍后将根据运行时代码中的顺序替换为“x”,“y”和“z”的值。

但是这个:

SELECT * FROM Articles WHERE Id = ?1不是验证SQL语句,正确的是删除问号,或者您可以为@Id赋予特定值,例如:

SELECT * FROM Articles WHERE Id = @Id

简而言之,db.Query()可以使用占位符构建您的查询,但您的findArticlesQry变量存储的是纯SQL语句,应遵循基本的SQL语法,不允许?