Golang中如何获取SQL Server存储过程的错误信息

Golang中如何获取SQL Server存储过程的错误信息 我有一个存储过程,在某些条件失败时会返回多个错误。我该如何捕获这些错误?因为每当过程失败时,它总是返回一个运行时错误:无效的内存地址或空指针解引用,但从未返回错误本身。

4 回复

你应该在这里分享一些代码。

– 你肯定在某个地方使用了 nil 变量?

更多关于Golang中如何获取SQL Server存储过程的错误信息的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


嗨,@Mynor2397,这个错误并非来自存储过程,而是来自你Go程序的某个地方。正如 @kync 所说,你应该展示一下代码,我们才能帮助你。

这与你的问题无关,但我建议你完全不要使用存储过程 😄

http://www.tonymarston.net/php-mysql/stored-procedures-are-evil.html

在Golang中捕获SQL Server存储过程的错误信息,需要使用sql.RowsErr()方法或检查sql.Result的错误。以下是示例代码:

package main

import (
    "database/sql"
    "fmt"
    "log"
    _ "github.com/denisenkom/go-mssqldb"
)

func main() {
    connString := "server=localhost;user id=sa;password=your_password;database=your_db"
    db, err := sql.Open("mssql", connString)
    if err != nil {
        log.Fatal(err)
    }
    defer db.Close()

    // 方法1:使用Query执行存储过程并检查Rows错误
    rows, err := db.Query("EXEC YourStoredProc @param1, @param2", "value1", "value2")
    if err != nil {
        log.Fatal("执行错误:", err)
    }
    defer rows.Close()

    // 检查Rows中的错误(包括存储过程返回的错误)
    if err := rows.Err(); err != nil {
        fmt.Println("存储过程错误:", err)
    }

    // 方法2:使用Exec并检查Result
    result, err := db.Exec("EXEC YourStoredProc @param1", "value1")
    if err != nil {
        fmt.Println("执行错误:", err)
    }
    
    // 获取受影响行数(可选)
    rowsAffected, _ := result.RowsAffected()
    fmt.Printf("受影响行数: %d\n", rowsAffected)
}

对于返回多个错误的存储过程,需要确保在T-SQL中使用RAISERRORTHROW语句,并在Go中通过循环读取所有错误:

// 处理多个错误
for rows.Next() {
    var errorMsg string
    if err := rows.Scan(&errorMsg); err != nil {
        log.Println("扫描错误:", err)
    }
    fmt.Println("错误信息:", errorMsg)
}

// 再次检查Rows错误
if err := rows.Err(); err != nil {
    fmt.Println("最终错误:", err)
}

如果遇到空指针解引用错误,请检查数据库连接是否成功建立,并确保存储过程名称和参数正确。

回到顶部