db.Exe c () не возвращает правильное значение RowsActed () в golang для SQL сервера - PullRequest
0 голосов
/ 22 января 2020

Я написал код Golang для обновления записей в таблице. В этом я использовал функцию db.Exec(query), чтобы выполнить запрос и получить результат обратно. Я также хочу проверить количество строк, затронутых запросом. Для этого я использовал result.RowsActed (). Но я не получаю правильное количество строк, на которые влияют.

Ниже мой Golang Код

func updateTable(dbconnection *sql.DB, query string) (int64, error) {

    println("\n------------------Executing update Query---------------------")

    query = `UPDATE [IMBookingApp].[dbo].[User] 
                    SET Password='xyz'
                    WHERE UserId=2 OR UserId=22 OR UserId=23`    

    result, err := dbconnection.Exec(query)
    if err != nil {
        fmt.Println("Error updating row: " + err.Error())
        errorMsg := errors.New("DATABASE ERROR - " + err.Error())
        return 0, errorMsg
    }

    RowsAffected, err := result.RowsAffected()
    if err != nil {
        fmt.Println("RowsAffected Error", err)
    }

    fmt.Println("Table updated successfully. Rows Affected:", RowsAffected)
    return RowsAffected, nil
}

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

    Table updated successfully. Rows Affected: 7

В приведенном выше запросе SQL, для условия - WHERE UserId=2 OR UserId=22 OR UserId=23 вывод равен Rows Affected: 7 Однако я должен быть 3 или меньше 3, потому что UserId is a primary key.

В SSMS я получаю правильный результат для того же запроса - enter image description here

Аналогично, для WHERE UserId=2 вывод равен Rows Affected: 5

WHERE UserId=2 OR UserId=22 вывод Rows Affected: 6

WHERE UserId=2 OR UserId=22 OR UserId=23 вывод Rows Affected: 7

WHERE UserId=2 OR UserId=22 OR UserId=23 OR UserId=24 вывод Rows Affected: 8

и "Затронутые строки" продолжается увеличивая на 1 каждый раз.

Понятия не имею, что происходит. Буду признателен, если кто-нибудь поможет мне указать на проблему с кодом.

РЕДАКТИРОВАТЬ

Я также пытался использовать db.Query(query) как показано ниже, чтобы найти затронутые строки, я все же ошибаюсь, нет затронутых строк.

rows, err := dbconnection.Query(query)
    if err != nil {
        panic(err)
    }

    var RowsAffected int
    for rows.Next() {
        RowsAffected += 1
    }

    if err := rows.Err(); err != nil {
        panic(err)
    }
    print("RowsAffected:", RowsAffected)

1 Ответ

0 голосов
/ 22 января 2020

Я думаю, что вы используете SQL Сервер ....

DECLARE @RowCount1 AS INT
 /* Your Update Query Will be Here.. */
 SELECT @RowCount1 = @@ROWCOUNT
 PRINT @RowCount1 --Here u will get Number affected by above Query...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...