2017-09-01 107 views
0

我试图从我的sql服务器数据库中通过ID获取特定项目。这里是我的代码:用golang和sqlserver驱动程序查询参数

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 
    } 
} 
+0

你确定你是使用'mssql'驱动程序而不是'sqlserver'?两者都在该软件包中,但后者期望以不同格式的参数。 –

+0

我正在使用sqlserver驱动程序,我现在不在我的计算机上,所以我会在几个小时内尝试。 –

回答

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" 
) 
+0

谢谢,我从来没有提到mssql驱动程序btw,我实际上在我的问题中明确提到了sqlserver驱动程序,但谢谢!当我能访问我的电脑时,我会尝试它。 –

+0

你是男人,谢谢! –

1

这似乎是占位符的问题。为什么不尝试?因为您没有移动订单或重复它们。所以,试试这个:

"SELECT * FROM Articles WHERE Id = ?" 
+0

仍然是同样的错误,它是一个明确的占位符的问题,但我无法找到任何文档,因为它是一个基于社区的软件包,并没有积极开发我认为... –

+0

它看起来像驱动程序声称它接受你的风格'试图用于mssql而不是sqlserver,也许可以检查。 –

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语法,不允许使用?

相关问题