亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何執行插入查詢,其中參數的數據來自選擇查詢的結果集

如何執行插入查詢,其中參數的數據來自選擇查詢的結果集

Go
喵喔喔 2023-04-04 14:48:09
我正在嘗試從位于另一臺服務器中的一個數據庫 (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() }
查看完整描述

2 回答

?
撒科打諢

TA貢獻1934條經驗 獲得超2個贊

您將記錄從以下行掃描到Incident_Number, Last_Resolved_Date,中:Corporate_ID


err := 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, too


for 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)

}


查看完整回答
反對 回復 2023-04-04
?
慕勒3428872

TA貢獻1848條經驗 獲得超6個贊

添加到已接受的答案:我建議您多做一些事情以確保一致性,并更“負責任地”處理您的資源。你正在關閉你的數據庫連接,當然,但我會養成以幾乎相同的方式處理其他資源的習慣。


此外,如果中途出現問題,我強烈建議您將插入包裝到事務中,而不是必須截斷表并重新啟動進程:


defer rows.Close() // close your rows resource

defer db1.Close() // close at the very end

tx, err := db1.BeginTx(context.Background(), nil) // pass in a context with timeout or some other cancelable context if needed

if err != nil {

    return err // I'm returning, you can do as you like with this

}

stmt, err := tx.Prepare("INSERT INTO ...") // create the statement once

defer stmt.Close() // add to defer stack

for 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())

// and

log.Printf("Closing DB/ROWS/STMT: %+v", db1.Close()) // same for rows, stmt etc..


查看完整回答
反對 回復 2023-04-04
  • 2 回答
  • 0 關注
  • 140 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號