我正在尝试从我的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})
}
我正在为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
}
}
根据您的评论,您使用的是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"
)
这似乎是占位符的问题。为什么不尝试呢?对于您的占位符,因为您不转移订单或重复订单。因此,请尝试以下操作:
"SELECT * FROM Articles WHERE Id = ?"
db.Query("SELECT * FROM t WHERE a = ?3, b = ?2, c = ?1", "x", "y", "z")
,这里的问号作为占位符,后来根据运行时的代码中的代码中的顺序将其替换为'x','y'和z'的值。
但这是:
SELECT * FROM Articles WHERE Id = ?1
不是validate sql语句,正确的是删除问号,或者您可以给@id的特定值,例如:
SELECT * FROM Articles WHERE Id = @Id
用简短的单词,db.Query()
可以使用占位符构建查询,但是您的findArticlesQry
变量是存储普通的SQL语句,该语句应遵循基本的SQL语法,不允许?
。