猿问

如何执行插入查询,其中参数的数据来自选择查询的结果集

我正在尝试从位于另一台服务器中的一个数据库 (db) 获取数据,并将获取的数据插入另一台服务器中的另一个数据库 (db1)。到目前为止,我能够从数据库中选择数据,但无法将其插入到 db1 中。我在数据库中得到空值。任何帮助,将不胜感激。


我的代码片段如下:


func searchHandler(w http.ResponseWriter, r *http.Request) {

dsn := "server=*****.ecc4q.****.com; user id=******; password=***************"

db, err := sql.Open("mssql", dsn) 

if err != nil {

    log.Fatal(err)

}

err = db.Ping()

if err != nil {

    log.Fatal(err)

}



rows, err := db.Query("select Incident_Number, Last_Resolved_Date, Corporate_ID from ITSM.dbo.HPD_Help_Desk_Classic")

if err != nil {

    log.Println(err)

}

defer db.Close()


dsn1 := "server=******.md3q.***.com;user id=*****;password=********"

db1, err := sql.Open("mssql", dsn1) 

if err != nil {

    log.Fatal(err)

}

err = db1.Ping()

if err != nil {

    log.Fatal(err)

}


for rows.Next() {

    err := rows.Scan(&Incident_Number, &Last_Resolved_Date, &Corporate_ID)

        if err != nil {

            log.Fatal(err)

        }


    stmt1, err := db1.Prepare("INSERT INTO mdesk.dbo.tbl_tcktinfo(TicketNumber, ResolvedDate, CDSID) VALUES(?,?,?)")

        if err != nil {

            log.Println(err)

        }


    res, err := stmt1.Exec(TicketNumber, ResolvedDate, CDSID)

        if err != nil {

            log.Println(err)

        }

    log.Println(Incident_Number, Last_Resolved_Date, Corporate_ID)

}

defer db1.Close() 

}


喵喔喔
浏览 90回答 2
2回答

撒科打诨

您将记录从以下行扫描到Incident_Number, Last_Resolved_Date,中:Corporate_IDerr := rows.Scan(&Incident_Number, &Last_Resolved_Date, &Corporate_ID)但是你在Exec()函数中传递了不同的参数。您必须传递扫描变量才能将记录插入到不同的数据库表中。stmt1, err := db1.Prepare("INSERT INTO mdesk.dbo.tbl_tcktinfo(TicketNumber, ResolvedDate, CDSID) VALUES(?,?,?)")if err != nil {    log.Fatal(err)}defer stmt1.Close() // always clean up after yourself, preferably return errors here, toofor rows.Next() {    err := rows.Scan(&Incident_Number, &Last_Resolved_Date, &Corporate_ID)        if err != nil {            log.Fatal(err)        }    res, err := stmt1.Exec(Incident_Number, Last_Resolved_Date, Corporate_ID)        if err != nil {            log.Println(err)        }    log.Println(Incident_Number, Last_Resolved_Date, Corporate_ID)}

慕勒3428872

添加到已接受的答案:我建议您多做一些事情以确保一致性,并更“负责任地”处理您的资源。你正在关闭你的数据库连接,当然,但我会养成以几乎相同的方式处理其他资源的习惯。此外,如果中途出现问题,我强烈建议您将插入包装到事务中,而不是必须截断表并重新启动进程:defer rows.Close() // close your rows resourcedefer db1.Close() // close at the very endtx, err := db1.BeginTx(context.Background(), nil) // pass in a context with timeout or some other cancelable context if neededif err != nil {    return err // I'm returning, you can do as you like with this}stmt, err := tx.Prepare("INSERT INTO ...") // create the statement oncedefer stmt.Close() // add to defer stackfor rows.Next() {     // instead of your Camel_Snake_Cased vars, I'm using the preferred style and camelCase your var names instead...    if err := rows.Scan(&incidentNumber, &lastResolvedDate, &corporateID); err != nil {       tx.Rollback() // rollback transaction       return err    }    if err := stmt.Exec(incidentNumber, lastResolvedDate, corporateID); err != nil {        tx.Rollback() // again, rollback...        return err    }}if err := tx.Commit(); err !≃ nil {    tx.Rollback() // not needed, but I add it as a habit    return err}return nil现在重要的是要注意所有这些Close()函数和tx.Rollback()调用都返回错误。最好至少将它们包装在日志调用中,如下所示:log.Printf("Rolling back: %+v", tx.Rollback())// andlog.Printf("Closing DB/ROWS/STMT: %+v", db1.Close()) // same for rows, stmt etc..
随时随地看视频慕课网APP

相关分类

Go
我要回答