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

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的表,并且该表在这三列中都有信息...

在进行查询之前或进行查询时,我缺少什么吗?

最佳答案



似乎驱动程序正在按应有的方式工作。为了在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")

10-06 13:16