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

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..
- 2 回答
- 0 關注
- 140 瀏覽
添加回答
舉報