Golang mssql驱动程序返回“mssql:无效的对象名称”

时间:2015-08-20 17:50:39

标签: sql-server database go

在一个应用程序中,我有一个全局范围的

var db *sql.DB

稍后用

调用
slcstrSource, slcint64Timestamp, slcstrContent, err := DB_functions.GetContent(db)
            if err != nil {
                 fmt.Println("Error: " + err.Error())
            }

GetContent就是这样:

func GetContent(db *sql.DB) ([]string, []int64, []string, error) {

    var slcstrContent []string
    var slcint64Timestamp []int64
    var slcstrSource []string

    // Run the query
    rows, err := db.Query("SELECT source, timestamp, content FROM MyDatabase.MyTable")
    if err != nil {
            return slcstrSource, slcint64Timestamp, slcstrContent, err
    }
    defer rows.Close()

    for rows.Next() {

            // Holding variables for the content in the columns
            var source, content string
            var timestamp int64

            // Get the results of the query
            err := rows.Scan(&source, &timestamp, &content)
            if err != nil {
                    return slcstrSource, slcint64Timestamp, slcstrContent, err
            }

            // Append them into the slices that will eventually be returned to the caller
            slcstrSource = append(slcstrSource, source)
            slcstrContent = append(slcstrContent, content)
            slcint64Timestamp = append(slcint64Timestamp, timestamp)
    }

    return slcstrSource, slcint64Timestamp, slcstrContent, nil
}

当我运行应用程序并且这些代码段被命中时,我得到了一个:

Error: mssql: Invalid object name 'MyDatabase.MyTable'.

当我db.Ping()数据库时,它似乎工作。从我缩小的范围来看,错误正在查询中发生,但我找不到什么是错的。我检查了数据库,并且有一个名为MyDatabase的数据库,其中有一个名为MyTable的表,该表包含这三列中的信息......

在进行查询或进行查询之前,我是否还缺少某些内容?

1 个答案:

答案 0 :(得分:3)

  

我检查了数据库,并且有一个名为MyDatabase的数据库   一个名为MyTable的表,该表中包含三个信息   列...

看起来驱动程序正常工作。要在SQL Server中查询表,您应该使用[Database].[Schema].[TableName]。如果尚未为表定义特定模式名称,则默认情况下将在dbo模式下创建。 说您不需要在查询中指定数据库名称。您宁愿在连接字符串上定义它。我不确定您是如何定义连接详细信息的,但请查看以下内容并根据您的需求进行调整。

var (
    debug = flag.Bool("debug", false, "enable debugging")
    password = flag.String("password", "mypwd", "the database password")
    port *int = flag.Int("port", 1433, "the database port")
    server = flag.String("server", "MyServer", "the database server")
    user = flag.String("user", "MyUser", "the database user")
    connStr = fmt.Sprintf("server=%s;Initial Catalog=MySchema;userid=%s;password=%s;port=%d", *server, *user, *password, *port)
        )

    func main() {
        db, err := sql.Open("mssql", connStr)
    }

然后你可以像这样查询你的表:

rows, err := db.Query("SELECT source, timestamp, content FROM MySchema.MyTable")