Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用golang和sqlserver驱动程序查询参数_Sql_Sql Server_Rest_Go - Fatal编程技术网

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

使用golang和sqlserver驱动程序查询参数,sql,sql-server,rest,go,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)

我正在尝试从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(“从t中选择*,其中a=?3,b=?2,c=?1”,“x”,“y”,“z”)

但每次我尝试调用此函数时,它都会失败并返回:
2017/09/01 16:31:01 mssql:“?”附近的语法不正确。

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

编辑

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

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

占位符似乎有问题。为什么不试试呢?用于占位符,因为您没有改变顺序或重复它们。所以试试这个:

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

但这是:

SELECT*FROM Articles,其中Id=?1
不是验证SQL语句,correct是删除问号,或者您可以给@Id指定一个特定值,如:

从Id=@Id的文章中选择*


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

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

sqlserver驱动程序使用正常的MS SQL Server语法,并且 sql查询中的参数应为
@Name
@p1
@pN
(顺序位置)

db.QueryContext(ctx,“select*from t,其中ID=@ID;”,sql.Named(“ID”,6))

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

var(
allArticlesQry string=“从文章中选择*
findArticlesQry string=“从Id=@p1的文章中选择*”
)

还是同样的错误,占位符肯定有问题,但我找不到任何相关文档,因为它是一个基于社区的软件包,没有积极开发,我想…看起来驱动程序声称它接受您尝试用于mssql的样式,但不接受sqlserver,也许也要检查一下。如何传递占位符值?是否确定使用的是
mssql
驱动程序而不是
sqlserver
?两者都在那个包中,但后者需要不同格式的参数。我正在使用sqlserver驱动程序,我现在不在我的计算机上,所以我将在几个小时后尝试。谢谢,我从来没有提到mssql驱动程序,顺便说一句,我在我的问题中明确提到sqlserver驱动程序,但谢谢!等我有权使用我的电脑时,我会试试的。