Как выполнить запрос вставки, когда данные к параметрам поступают из результирующего набора запроса select - PullRequest
0 голосов
/ 14 сентября 2018

Я пытаюсь извлечь данные из одной базы данных (дБ), находящейся на другом сервере, и вставить извлеченные данные в другую базу данных (дБ1) на другом сервере. Пока я могу выбрать данные из базы данных, но не могу вставить их в базу данных 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 ]

0 голосов
/ 14 сентября 2018

Добавление к принятому ответу: я бы порекомендовал вам сделать еще несколько вещей, чтобы обеспечить согласованность и более «ответственно» управлять своими ресурсами. Вы, конечно, закрываете соединения с БД, но я привык бы к тому, что другие ресурсы обрабатываются примерно так же.

Более того, если что-то пойдет не так, вместо усечения таблицы и перезапуска процесса, я настоятельно рекомендую вам вставить вставки в транзакцию:

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..
0 голосов
/ 14 сентября 2018

Вы сканируете записи в 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)
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...